diff --git a/app/api/mobile/apis/comments.rb b/app/api/mobile/apis/comments.rb
index a7eea735d..7a7f17d8f 100644
--- a/app/api/mobile/apis/comments.rb
+++ b/app/api/mobile/apis/comments.rb
@@ -72,6 +72,20 @@ module Mobile
present :status, 0
end
+ desc ' 意见反馈'
+ params do
+ requires :token, type: String
+ requires :subject,type: String,desc: '意见'
+ end
+ post do
+ cs_params = {
+ memo: {:subject => params[:subject],:content => '该贴来自手机App意见反馈'},
+ }
+ cs = CommentService.new
+ memo = cs.create_feedback cs_params, current_user
+ raise "commit failed #{memo.errors.full_messages}" if memo.new_record?
+ present :status, 0
+ end
end
end
diff --git a/app/api/mobile/entities/anonymous_works_params.rb b/app/api/mobile/entities/anonymous_works_params.rb
index 95cf9215d..e6bc8f346 100644
--- a/app/api/mobile/entities/anonymous_works_params.rb
+++ b/app/api/mobile/entities/anonymous_works_params.rb
@@ -15,6 +15,7 @@ module Mobile
anonymous_works_params_expose :m_score
anonymous_works_params_expose :is_anonymous_comments
anonymous_works_params_expose :cur_type
+ anonymous_works_params_expose :cur_page
expose :jours ,using: Mobile::Entities::Jours do |f, opt|
if f.is_a?(Hash) && f.key?(:jours)
f[:jours]
diff --git a/app/api/mobile/entities/homework.rb b/app/api/mobile/entities/homework.rb
index 55883e14e..d4c34ffec 100644
--- a/app/api/mobile/entities/homework.rb
+++ b/app/api/mobile/entities/homework.rb
@@ -52,6 +52,10 @@ module Mobile
homework_expose :created_on
homework_expose :deadline
+ expose :jours,using: Mobile::Entities::Jours do |f, opt|
+ f[:jours] if f.is_a?(Hash) && f.key?(:jours)
+ end
+
expose :homework_for_anonymous_comments,using: Mobile::Entities::HomeworkAttach do |f, opt|
f[:homework_for_anonymous_comments] if f.is_a?(Hash) && f.key?(:homework_for_anonymous_comments)
end
diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb
index aab9d7b69..1efbb665f 100644
--- a/app/controllers/admin_controller.rb
+++ b/app/controllers/admin_controller.rb
@@ -322,4 +322,11 @@ class AdminController < ApplicationController
end
end
+ #组织
+ def organization
+ @organizations = Organization.all
+ respond_to do |format|
+ format.html
+ end
+ end
end
diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb
index 2c6a002b4..252d823e9 100644
--- a/app/controllers/attachments_controller.rb
+++ b/app/controllers/attachments_controller.rb
@@ -186,6 +186,10 @@ class AttachmentsController < ApplicationController
@attachment = Attachment.new(:file => request.raw_post)
@attachment.author = User.current
+ if !params[:project].nil?
+ @attachment.container_type = 'Project'
+ @attachment.container_id = params[:project].split("?")[0]
+ end
@attachment.filename = params[:filename].presence || Redmine::Utils.random_hex(16)
saved = @attachment.save
diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb
index 54b8c6305..2f7092d9a 100644
--- a/app/controllers/forums_controller.rb
+++ b/app/controllers/forums_controller.rb
@@ -15,12 +15,14 @@ class ForumsController < ApplicationController
PageLimit = 20
def create_feedback
if User.current.logged?
- @memo = Memo.new(params[:memo])
- @memo.forum_id = "1"
- @memo.author_id = User.current.id
+ #@memo = Memo.new(params[:memo])
+ #@memo.forum_id = "1"
+ #@memo.author_id = User.current.id
#@forum = @memo.forum
+ cs = CommentService.new
+ @memo = cs.create_feedback params,User.current
respond_to do |format|
- if @memo.save
+ if !@memo.new_record?
format.html { redirect_to forum_path(@memo.forum) }
else
sort_init 'updated_at', 'desc'
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index c0d83fdcd..5dc945cc7 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -153,6 +153,8 @@ class IssuesController < ApplicationController
def create
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
+ # 给该issue在它所在的项目中所有的issues中所在的位置给一个序号
+ @issue.project_issues_index = @issue.project.issues.last.project_issues_index + 1
if @issue.save
call_hook(:controller_issues_new_after_save, { :params => params, :issue => @issue})
respond_to do |format|
diff --git a/app/controllers/organization_controller.rb b/app/controllers/organization_controller.rb
new file mode 100644
index 000000000..db8295e44
--- /dev/null
+++ b/app/controllers/organization_controller.rb
@@ -0,0 +1,55 @@
+class OrganizationController < ApplicationController
+ layout 'project_base'
+ before_filter :require_admin, :except => [:index]
+
+ def index
+ #@projects = Project.find_by_sql("SELECT * FROM projects WHERE id IN (select MAX(id) from projects GROUP BY enterprise_name)")
+ @organizations = Organization.all
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ def new
+ @organizations = Organization.new
+ respond_to do |format|
+ format.html
+ end
+ end
+
+ def create
+ @organizations = Organization.new
+ @organizations.name = params[:organization][:name]
+ if @organizations.save
+ redirect_to admin_organization_url
+ end
+ end
+
+ def edit
+ @organization = Organization.find params[:id]
+ respond_to do |format|
+ format.html
+ end
+ rescue Exception => e
+ render_404
+ end
+
+ def update
+ @organization = Organization.find params[:id]
+ @organization.name = params[:organization][:name]
+ if @organization.save
+ redirect_to admin_organization_url
+ end
+ rescue Exception => e
+ render_404
+ end
+
+ def destroy
+ @organization = Organization.find params[:id]
+ if @organization.destroy
+ redirect_to admin_organization_url
+ end
+ rescue Exception => e
+ render_404
+ end
+end
diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb
deleted file mode 100644
index c9cce5752..000000000
--- a/app/controllers/organizations_controller.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class OrganizationsController < ApplicationController
- layout 'project_base'
- def index
- @projects = Project.find_by_sql("SELECT * FROM projects WHERE id IN (select MAX(id) from projects GROUP BY enterprise_name)")
- end
-end
diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb
index 41ec5fbf4..88ebbb1c1 100644
--- a/app/controllers/projects_controller.rb
+++ b/app/controllers/projects_controller.rb
@@ -179,6 +179,7 @@ class ProjectsController < ApplicationController
@trackers = Tracker.sorted.all
@project = Project.new
@project.safe_attributes = params[:project]
+ @project.organization_id = params[:organization_id]
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
# Add current user as a project member if he is not admin
@@ -248,6 +249,7 @@ class ProjectsController < ApplicationController
# Author lizanle
# Description 项目动态展示方法,删除了不必要的代码
def show
+=begin
# 试图跳转到请求的按钮
if params[:login]
login = params[:login]
@@ -282,30 +284,37 @@ class ProjectsController < ApplicationController
# 时间跨度不能太大,不然很慢,所以删掉了-1.years
@date_from = @date_to - @days
@with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1')
+=end
+
@author = params[:user_id].blank? ? nil : User.active.find(params[:user_id])
# 决定显示所用用户或单个用户活动
+=begin
@activity = Redmine::Activity::Fetcher.new(User.current,
:project => @project,
:with_subprojects => @with_subprojects,
:author => @author)
@activity.scope_select {|t| !has["show_#{t}"].nil?}
+=end
# 根据私密性,取出符合条件的所有数据
if User.current.member_of?(@project) || User.current.admin?
- events = @activity.events(@date_from, @date_to)
+ @events_pages = ForgeActivity.where("project_id = ?",@project).order("created_at desc").page(params['page'|| 1]).per(20);
+ #events = @activity.events(@date_from, @date_to)
else
- events = @activity.events(@date_from, @date_to, :is_public => 1)
+ @events_pages = ForgeActivity.includes(:project).where("forge_activities.project_id = ? and projects.is_public
+ = ?",@project,1).order("created_at desc")
+ .page(params['page'|| 1]).per(10);
+ # @events = @activity.events(@date_from, @date_to, :is_public => 1)
end
- @offset, @limit = api_offset_and_limit({:limit => 10})
- @events_count = events.count
- @events_pages = Paginator.new @events_count, @limit, params['page']
- @offset ||= @events_pages.offset
+=begin
+ @events_pages = Paginator.new events.count, 10, params['page']
# 总的数据中取出某一页
- events = events.slice(@offset,@limit)
+ events = events.slice(@events_pages.offset,10)
# 按天分组
@events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
+=end
# 根据对应的请求,返回对应的数据
respond_to do |format|
@@ -404,6 +413,7 @@ class ProjectsController < ApplicationController
def update
@project.safe_attributes = params[:project]
+ @project.organization_id = params[:organization_id]
#@project.dts_test = params[:project][:dts_test]
if validate_parent_id && @project.save
@course = Course.find_by_extra(@project.identifier)
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 8ef6f6b53..b3e808b19 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -408,6 +408,9 @@ class UsersController < ApplicationController
def show
pre_count = 10 #limit
+ # Time 2015-02-04 11:46:34
+ # Author lizanle
+ # Description type 1 :所有动态包括我关注的人 type 2:我的动态 type 3:关于我的回复
case params[:type]
when "1"
if @user == User.current
@@ -428,26 +431,27 @@ class UsersController < ApplicationController
messages = message.sort {|x,y| y.created_on <=> x.created_on }
@message = messages[@info_pages.offset, @info_pages.per_page]
@state = 2
- else
+ else
+ # Time 2015-02-04 10:50:49
+ # Author lizanle
+ # Description 所有动态
where_condition = nil;
# where_condition = "act_type <> 'JournalsForMessage'"
if @user == User.current
watcher = User.watched_by(@user)
watcher.push(User.current)
- activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
+ activity = Activity.where(where_condition).where('user_id in (?)', watcher).order('id desc')
else
activity = Activity.where(where_condition).where('user_id = ?', @user.id).order('id desc')
end
-
@activity_count = activity.count
@activity_pages = Paginator.new @activity_count, pre_count, params['page']
- activity_page = activity.slice(@activity_pages.offset,@activity_pages.per_page * 2)
- activity_page = activity_page.reject { |e|
+ @activity = activity.slice(@activity_pages.offset,@activity_pages.per_page )
+ @activity = @activity.reject { |e|
((e.act_type=="Issue") && ( !e.act.visible?(User.current))) ||
((e.act_type == "Journal") && (!e.act.project.visible?(User.current))) ||
((e.act_type == "Bid") && ((!User.current.member_of_course?(e.act.courses.first) || !User.current.admin?)))
}
- @activity = activity.slice(0,@activity_pages.per_page)
@state = 0
end
diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb
index db2f287eb..290af0068 100644
--- a/app/controllers/welcome_controller.rb
+++ b/app/controllers/welcome_controller.rb
@@ -27,28 +27,31 @@ class WelcomeController < ApplicationController
def index
# 企业版定制: params[:project]为传过来的参数
unless params[:organization].nil?
- @cur_projects = Project.find(params[:organization])
- @organization = @cur_projects.enterprise_name
- @organization_projects = (current_user.admin? || User.current.member_of?(@cur_projects)) ? Project.where("enterprise_name =? ", @organization) : Project.all_public.where("enterprise_name =? ", @organization)
- @e_count = @organization_projects.count
- @part_projects = []
- # 取十个
- @organization_projects.each do |obj|
- break if(@organization_projects[10] == obj)
- @part_projects << Project.visible.find_by_id("#{obj.id}") unless obj.id.nil?
- end
- # 不够十个的用最火项目替代
- @e_count < 9 ? @part_projects = find_miracle_project( 9 - @e_count, 3,"score desc") : @part_projects
- # 配置文件首页定制
+ @organization = Organization.find params[:organization]
+ @organization_projects = Project.visible.joins(:project_status).joins("LEFT JOIN project_scores ON projects.id = project_scores.project_id").where("projects.organization_id = ?", @organization.id).order("score DESC").limit(10).all
+ @part_projects = @organization_projects.count < 9 ? find_miracle_project( 9 - @organization_projects.count, 3,"score desc") : []
+ # @cur_projects = Project.find(params[:organization])
+ # @organization = @cur_projects.enterprise_name
+ # @organization_projects = (current_user.admin? || User.current.member_of?(@cur_projects)) ? Project.where("enterprise_name =? ", @organization) : Project.all_public.where("enterprise_name =? ", @organization)
+ # @e_count = @organization_projects.count
+ # @part_projects = []
+ # # 取十个
+ # @organization_projects.each do |obj|
+ # break if(@organization_projects[10] == obj)
+ # @part_projects << Project.visible.find_by_id("#{obj.id}") unless obj.id.nil?
+ # end
+ # # 不够十个的用最火项目替代
+ # @e_count < 9 ? @part_projects = find_miracle_project( 9 - @e_count, 3,"score desc") : @part_projects
+ # # 配置文件首页定制
@enterprise_page = FirstPage.find_by_page_type('enterprise')
if @enterprise_page.nil?
@enterprise_page = FirstPage.new
@enterprise_page.page_type = 'enterprise'
end
- # 主页配置部分结束
-
+ # 主页配置部分结束
end
# end 企业版定制结束
+
if @first_page.nil? || @first_page.sort_type.nil?
@projects = find_miracle_project(10, 3,"score desc")
else
@@ -74,7 +77,8 @@ class WelcomeController < ApplicationController
@projects = @projects_all.order("score desc")
end
end
-
+ rescue Exception => e
+ render_404
end
def robots
diff --git a/app/helpers/expire_helper.rb b/app/helpers/expire_helper.rb
deleted file mode 100644
index 0a9cab69c..000000000
--- a/app/helpers/expire_helper.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-module ExpireHelper
- #index.html 中 “projects”塊 緩存過期
- def expire_project_cache
- ActionController::Base.new.expire_fragment('projects')
- end
-
- #index.html 中 “activities”塊 緩存過期
- def expire_activitie_cache
- ActionController::Base.new.expire_fragment('activities')
- end
-
- #welcome/index.html 中 “forums”塊 緩存過期
- def expire_forum_cache
- ActionController::Base.new.expire_fragment('forums')
- end
-end
diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb
index fe6714186..ccc750462 100644
--- a/app/helpers/projects_helper.rb
+++ b/app/helpers/projects_helper.rb
@@ -371,4 +371,15 @@ module ProjectsHelper
return projects
end
+
+ def project_organizations_id_option
+ type = []
+ Organization.all.each do |org|
+ option = []
+ option << org.name
+ option << org.id
+ type << option
+ end
+ type
+ end
end
diff --git a/app/models/attachment.rb b/app/models/attachment.rb
index de7912667..7ac7d786d 100644
--- a/app/models/attachment.rb
+++ b/app/models/attachment.rb
@@ -25,7 +25,9 @@ class Attachment < ActiveRecord::Base
belongs_to :softapplication, foreign_key: 'container_id', conditions: "attachments.container_type = 'Softapplication'"
belongs_to :author, :class_name => "User", :foreign_key => "author_id"
belongs_to :attachmentstype, :foreign_key => "attachtype",:primary_key => "id"
-
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
include UserScoreHelper
validates :filename, presence: true, length: {maximum: 254}
@@ -70,7 +72,7 @@ class Attachment < ActiveRecord::Base
@@thumbnails_storage_path = File.join(Rails.root, "tmp", "thumbnails")
before_save :files_to_final_location
- after_create :be_user_score # user_score
+ after_create :be_user_score ,:act_as_forge_activity# user_score
after_update :be_user_score
after_destroy :delete_from_disk,:down_user_score
@@ -529,4 +531,14 @@ class Attachment < ActiveRecord::Base
end
end
+ # Time 2015-03-02 17:42:48
+ # Author lizanle
+ # Description 上传该项目的文档资料也要保存一份在公共表中
+ def act_as_forge_activity
+ if self.container_type == 'Project'
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.container_id)
+ end
+ end
+
end
diff --git a/app/models/bid.rb b/app/models/bid.rb
index eb7e5d83f..e5de47b24 100644
--- a/app/models/bid.rb
+++ b/app/models/bid.rb
@@ -17,7 +17,6 @@ class Bid < ActiveRecord::Base
HomeworkProject = 2
attr_accessible :author_id, :budget, :deadline, :name, :description, :homework_type, :password
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :author, :class_name => 'User', :foreign_key => :author_id
belongs_to :course
@@ -33,12 +32,6 @@ class Bid < ActiveRecord::Base
has_many :join_in_contests, :dependent => :destroy
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
# has_many :fork_homework, :class_name => 'Bid', :conditions => "#{Bid.table_name}.parent_id = #{id}"
-
-
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
-
acts_as_attachable
NAME_LENGTH_LIMIT = 60
diff --git a/app/models/changeset.rb b/app/models/changeset.rb
index 101647824..e05a7d2da 100644
--- a/app/models/changeset.rb
+++ b/app/models/changeset.rb
@@ -16,7 +16,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Changeset < ActiveRecord::Base
- include ExpireHelper
belongs_to :repository
belongs_to :user
include UserScoreHelper
@@ -65,9 +64,8 @@ class Changeset < ActiveRecord::Base
includes(:repository => :project).where(Project.allowed_to_condition(args.shift || User.current, :view_changesets, *args))
}
- after_create :scan_for_issues,:refresh_changests,:expire_activitie_cache#:be_user_score # user_score
- after_update :be_user_score,:expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :scan_for_issues,:refresh_changests#:be_user_score # user_score
+ after_update :be_user_score
after_destroy :down_user_score
before_create :before_create_cs
diff --git a/app/models/contest_notification.rb b/app/models/contest_notification.rb
index 0ccd0d5a7..71c448f65 100644
--- a/app/models/contest_notification.rb
+++ b/app/models/contest_notification.rb
@@ -1,10 +1,6 @@
class ContestNotification < ActiveRecord::Base
- include ExpireHelper
attr_accessible :content, :title
validates :title, length: {maximum: 30}
- after_create :expire_forum_cache
- after_update :expire_forum_cache
- before_destroy :expire_forum_cache
end
diff --git a/app/models/document.rb b/app/models/document.rb
index 48a0151eb..33ffdaa2f 100644
--- a/app/models/document.rb
+++ b/app/models/document.rb
@@ -17,18 +17,16 @@
class Document < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :project
belongs_to :user
belongs_to :category, :class_name => "DocumentCategory", :foreign_key => "category_id"
include UserScoreHelper
after_save :be_user_score # user_score
after_destroy :down_user_score
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
acts_as_attachable :delete_permission => :delete_documents
-
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
acts_as_searchable :columns => ['title', "#{table_name}.description"], :include => :project
acts_as_event :title => Proc.new {|o| "#{l(:label_document)}: #{o.title}"},
#:author => Proc.new {|o| o.attachments.reorder("#{Attachment.table_name}.created_on ASC").first.try(:author) },
@@ -39,7 +37,7 @@ class Document < ActiveRecord::Base
validates_presence_of :project, :title, :category
validates_length_of :title, :maximum => 60
-
+ after_create :act_as_forge_activity
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_documents, *args))
}
@@ -81,5 +79,12 @@ class Document < ActiveRecord::Base
update_document(self.user,2,self.project)
end
+ # Time 2015-03-02 10:51:16
+ # Author lizanle
+ # Description 新创建的document要在公共表ForgeActivity中记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
+ :project_id => self.project_id)
+ end
end
diff --git a/app/models/forge_activity.rb b/app/models/forge_activity.rb
new file mode 100644
index 000000000..e94a29867
--- /dev/null
+++ b/app/models/forge_activity.rb
@@ -0,0 +1,22 @@
+# Time 2015-02-06 10:42:34
+# Author lizanle
+# Description 这是保存Project相关的动态的公共表
+class ForgeActivity < ActiveRecord::Base
+ # 公共表中活动类型,命名规则:TYPE_OF_{类名}_ACT
+ TYPE_OF_ISSUE_ACT = "Issue"
+ TYPE_OF_MESSAGE_ACT = "Message"
+ TYPE_OF_ATTACHMENT_ACT = "Attachment"
+ TYPE_OF_DOCUMENT_ACT = "Document"
+ TYPE_OF_JOURNAL_ACT = "Journal"
+ TYPE_OF_WIKI_ACT = "Wiki"
+ TYPE_OF_NEWS_ACT = "News"
+ attr_accessible :forge_act_id, :forge_act_type,:project_id,:user_id,:org_id
+ # 虚拟关联
+ belongs_to :forge_act ,:polymorphic => true
+ belongs_to :project
+ belongs_to :user
+ validates :user_id,presence: true
+ validates :project_id,presence: true
+ validates :forge_act_id,presence: true
+ validates :forge_act_type, presence: true
+end
diff --git a/app/models/forum.rb b/app/models/forum.rb
index baa8e6260..878937ea7 100644
--- a/app/models/forum.rb
+++ b/app/models/forum.rb
@@ -1,13 +1,8 @@
class Forum < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
has_many :topics, :class_name => 'Memo', :conditions => "#{Memo.table_name}.parent_id IS NULL", :order => "#{Memo.table_name}.created_at DESC", :dependent => :destroy
has_many :memos, :dependent => :destroy, conditions: "parent_id IS NULL"
belongs_to :creator, :class_name => "User", :foreign_key => 'creator_id'
-
- after_create :expire_forum_cache
- after_update :expire_forum_cache
- before_destroy :expire_forum_cache
safe_attributes 'name',
'description',
'topic_count',
diff --git a/app/models/issue.rb b/app/models/issue.rb
index a7b1a5943..c2670a0cc 100644
--- a/app/models/issue.rb
+++ b/app/models/issue.rb
@@ -19,7 +19,6 @@ class Issue < ActiveRecord::Base
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
include UserScoreHelper
- include ExpireHelper
belongs_to :project
belongs_to :tracker
belongs_to :status, :class_name => 'IssueStatus', :foreign_key => 'status_id'
@@ -46,6 +45,8 @@ class Issue < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@@ -64,7 +65,9 @@ class Issue < ActiveRecord::Base
},
:url => Proc.new {|o| {:controller => 'issues', :action => 'show', :id => o}},
:type => Proc.new {|o| 'issue' + (o.closed? ? ' closed' : '') }
-
+ # Time 2015-01-31 13:52:53
+ # Author lizanle
+ # Description 将hash传进去
acts_as_activity_provider :find_options => {:include => [:project, :author, :tracker]},
:author_key => :author_id
@@ -77,12 +80,9 @@ class Issue < ActiveRecord::Base
attr_reader :current_journal
# fq
- after_create :act_as_activity,:be_user_score_new_issue
+ after_create :act_as_activity,:be_user_score_new_issue,:act_as_forge_activity
after_update :be_user_score
after_destroy :down_user_score
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
# after_create :be_user_score
# end
@@ -129,7 +129,15 @@ class Issue < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
# end
-
+
+ # Time 2015-02-26 10:51:16
+ # Author lizanle
+ # Description 新创建的issue要在公共表ForgeActivity中记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.project_id)
+ end
+ # end
# Returns a SQL conditions string used to find all issues visible by the specified user
@@ -1168,13 +1176,13 @@ class Issue < ActiveRecord::Base
# back string obj which is belong to project.
def source_from
- "" << self.project.name.to_s <<
- "#" << project_index
+ "" << self.project.name.to_s
end
def project_index
if self.project.issues.include?(self)
(self.project.issues.index(self).to_i + 1).to_s
+
else
issue_index = 1
self.project.issues.each do |issue|
@@ -1185,8 +1193,10 @@ class Issue < ActiveRecord::Base
issue_index = issue_index+1
end
end
+
issue_index.to_s
end
+
end
private
diff --git a/app/models/journal.rb b/app/models/journal.rb
index a386c2b80..3b660132e 100644
--- a/app/models/journal.rb
+++ b/app/models/journal.rb
@@ -27,6 +27,8 @@ class Journal < ActiveRecord::Base
# added by fq
has_one :journal_reply
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
attr_accessor :indice
@@ -46,7 +48,7 @@ class Journal < ActiveRecord::Base
before_create :split_private_notes
# fq
- after_save :act_as_activity,:be_user_score
+ after_save :act_as_activity,:be_user_score,:act_as_forge_activity
# end
#after_destroy :down_user_score
#before_save :be_user_score
@@ -156,6 +158,15 @@ class Journal < ActiveRecord::Base
end
# end
+ # Time 2015-02-27 13:30:19
+ # Author lizanle
+ # Description 公共表中需要保存一份该记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.user_id,
+ :project_id => self.issue.project.id)
+
+ end
+
# 更新用户分数 -by zjc
def be_user_score
#新建了缺陷留言且留言不为空,不为空白
diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb
index 39618e43b..23d9c7753 100644
--- a/app/models/journals_for_message.rb
+++ b/app/models/journals_for_message.rb
@@ -4,7 +4,6 @@
class JournalsForMessage < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
safe_attributes "jour_type", # 留言所属类型
"jour_id", # 留言所属类型的id
"notes", # 留言内容
@@ -55,9 +54,7 @@ class JournalsForMessage < ActiveRecord::Base
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
validates :notes, presence: true
- after_create :act_as_activity ,:expire_activitie_cache#huang
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :act_as_activity #huang
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score
diff --git a/app/models/memo.rb b/app/models/memo.rb
index 7d463c28b..052ca03db 100644
--- a/app/models/memo.rb
+++ b/app/models/memo.rb
@@ -1,13 +1,8 @@
class Memo < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
belongs_to :forum
belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
-
- after_create :expire_cache
- after_update :expire_cache
- before_destroy :expire_cache
validates_presence_of :author_id, :forum_id, :subject,:content
# 若是主题帖,则内容可以是空
#validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? }
@@ -174,8 +169,5 @@ class Memo < ActiveRecord::Base
update_memo_number(User.current,1)
update_replay_for_memo(User.current,1)
end
- def expire_cache
- expire_forum_cache
- expire_activitie_cache
- end
+
end
diff --git a/app/models/message.rb b/app/models/message.rb
index 9ce4d583a..413a4f91c 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -18,7 +18,6 @@
class Message < ActiveRecord::Base
include Redmine::SafeAttributes
include UserScoreHelper
- include ExpireHelper
belongs_to :board
belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'
has_many :praise_tread, as: :praise_tread_object, dependent: :destroy
@@ -29,6 +28,8 @@ class Message < ActiveRecord::Base
# added by fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
# end
acts_as_searchable :columns => ['subject', 'content'],
@@ -59,13 +60,12 @@ class Message < ActiveRecord::Base
validates_length_of :subject, :maximum => 255
validate :cannot_reply_to_locked_topic, :on => :create
- after_create :add_author_as_watcher, :reset_counters!,:expire_activitie_cache
- after_update :update_messages_board,:expire_activitie_cache
- before_destroy :expire_activitie_cache
+ after_create :add_author_as_watcher, :reset_counters!
+ after_update :update_messages_board
after_destroy :reset_counters!,:down_user_score
# fq
- after_create :act_as_activity,:be_user_score
+ after_create :act_as_activity,:be_user_score,:act_as_forge_activity
#before_save :be_user_score
# end
@@ -160,6 +160,14 @@ class Message < ActiveRecord::Base
end
# end
+ # Time 2015-02-27 14:32:25
+ # Author lizanle
+ # Description
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.board.project.id)
+ end
+
#更新用户分数 -by zjc
def be_user_score
#新建message且无parent的为发帖
diff --git a/app/models/news.rb b/app/models/news.rb
index 9c37719f3..fa9f31712 100644
--- a/app/models/news.rb
+++ b/app/models/news.rb
@@ -17,7 +17,6 @@
class News < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
belongs_to :project
#added by nwb
belongs_to :course
@@ -25,7 +24,9 @@ class News < ActiveRecord::Base
has_many :comments, :as => :commented, :dependent => :delete_all, :order => "created_on"
# fq
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
- #end
+ # 被ForgeActivity虚拟关联
+ has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy
+ # end
validates_presence_of :title, :description
validates_length_of :title, :maximum => 60
@@ -46,11 +47,8 @@ class News < ActiveRecord::Base
after_create :add_author_as_watcher
# fq
- after_create :act_as_activity
+ after_create :act_as_activity,:act_as_forge_activity
# end
- after_create :expire_activitie_cache
- after_update :expire_activitie_cache
- before_destroy :expire_activitie_cache
scope :visible, lambda {|*args|
includes(:project).where(Project.allowed_to_condition(args.shift || User.current, :view_news, *args))
@@ -96,5 +94,12 @@ class News < ActiveRecord::Base
self.acts << Activity.new(:user_id => self.author_id)
end
+ # Time 2015-02-27 15:48:17
+ # Author lizanle
+ # Description 公用表中也要记录
+ def act_as_forge_activity
+ self.forge_acts << ForgeActivity.new(:user_id => self.author_id,
+ :project_id => self.project.id)
+ end
end
diff --git a/app/models/organization.rb b/app/models/organization.rb
new file mode 100644
index 000000000..5f52dee98
--- /dev/null
+++ b/app/models/organization.rb
@@ -0,0 +1,5 @@
+class Organization < ActiveRecord::Base
+ attr_accessible :logo_link, :name
+
+ has_many :projects
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index df403bb5c..099870bc7 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -17,7 +17,6 @@
class Project < ActiveRecord::Base
include Redmine::SafeAttributes
- include ExpireHelper
ProjectType_project = 0
ProjectType_course = 1
@@ -90,7 +89,9 @@ class Project < ActiveRecord::Base
:association_foreign_key => 'custom_field_id'
has_many :tags, :through => :project_tags, :class_name => 'Tag'
- has_many :project_tags, :class_name => 'ProjectTags'
+ has_many :project_tags, :class_name => 'ProjectTags'
+
+ belongs_to :organization
# has_many :journals
@@ -130,9 +131,8 @@ class Project < ActiveRecord::Base
#ActiveModel::Dirty 这里有一个changed方法。对任何对象都可以用
after_save :update_inherited_members, :if => Proc.new {|project| project.inherit_members_changed?}
# 创建project之后默认创建一个board,之后的board去掉了board的概念
- after_create :create_board_sync,:expire_project_cache
- after_update :expire_project_cache
- before_destroy :delete_all_members,:expire_project_cache
+ after_create :create_board_sync
+ before_destroy :delete_all_members
def remove_references_before_destroy
return if self.id.nil?
Watcher.delete_all ['watchable_id = ?', id]
diff --git a/app/models/tracker.rb b/app/models/tracker.rb
index 6a0069975..af56d23bf 100644
--- a/app/models/tracker.rb
+++ b/app/models/tracker.rb
@@ -16,7 +16,9 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Tracker < ActiveRecord::Base
-
+ # Time 2015-02-6 09:34:44
+ # Author lizanle
+ # Description freeze方法让字符串不可变
CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject description priority_id is_private).freeze
# Fields that can be disabled
# Other (future) fields should be appended, not inserted!
diff --git a/app/services/comment_service.rb b/app/services/comment_service.rb
index 42dc8c415..876caaaf3 100644
--- a/app/services/comment_service.rb
+++ b/app/services/comment_service.rb
@@ -78,4 +78,13 @@ class CommentService
@jfm
end
+ #发贴,用于意见反馈
+ def create_feedback params,current_user
+ @memo = Memo.new(params[:memo])
+ @memo.forum_id = "1"
+ @memo.author_id = current_user.id
+ @memo.save
+ @memo
+ end
+
end
\ No newline at end of file
diff --git a/app/services/homework_service.rb b/app/services/homework_service.rb
index 6287eeef5..f9be6f79d 100644
--- a/app/services/homework_service.rb
+++ b/app/services/homework_service.rb
@@ -26,8 +26,9 @@ class HomeworkService
state = @bid.comment_status
#end
open_anonymous_evaluation = @bid.open_anonymous_evaluation
+ jours = @bid.journals_for_messages.where('m_parent_id IS NULL').order('created_on DESC')
{:course_name => course.name,:course_id => course.id,:id => @bid.id, :author => @bid.author,:author_real_name =>author, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => student_questions_count,
- :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:created_on => @bid.created_on,:deadline => @bid.deadline}
+ :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:created_on => @bid.created_on,:deadline => @bid.deadline,:jours => jours}
end
# 启动作业匿评前提示信息
@@ -116,7 +117,7 @@ class HomeworkService
@is_anonymous_comments = @bid.comment_status == 1 && !@homework.users.include?(current_user) && @homework.user != current_user && !@is_teacher #判断是不是匿评(开启匿评,当前用户不是作业的创建者或者参与者,不是老师)
jours = @homework.journals_for_messages.where("is_comprehensive_evaluation = 3 or is_comprehensive_evaluation is null").order("created_on DESC")#jours留言 is null条件用以兼容历史数据
#@jour = paginateHelper jours,5 #留言
- #@cur_page = params[:cur_page] || 1
+ @cur_page = params[:cur_page] || 1
@cur_type = params[:cur_type] || 5
teacher_stars_json_like = stars_to_json_like(@teacher_stars,true,@homework,true)
student_stars_json_like = stars_to_json_like(@student_stars,false,@homework,(false || @is_teacher))
@@ -125,7 +126,7 @@ class HomeworkService
end
[@homework,{:is_teacher => @is_teacher,:m_score => @m_score,:jours => jours,:teacher_stars => teacher_stars_json_like,
- :student_stars => student_stars_json_like,:is_anonymous_comments => @is_anonymous_comments,:cur_type => @cur_type}]
+ :student_stars => student_stars_json_like,:is_anonymous_comments => @is_anonymous_comments,:cur_type => @cur_type,:cur_page => @cur_page}]
#name = @homework.name
#desc = @homework.description
#datetime = @homework.created_at
diff --git a/app/services/watches_service.rb b/app/services/watches_service.rb
index 2b9bed3cd..2aab7de81 100644
--- a/app/services/watches_service.rb
+++ b/app/services/watches_service.rb
@@ -1,7 +1,12 @@
+#coding=utf-8
class WatchesService
def watch params
@current_user = User.find(params[:current_user_id])
+ if params[:object_type] == 'user' && params[:current_user_id] == params[:object_id]
+ raise '不能关注自己!'
+ end
@watchables = find_watchables params
+
if @watchables.nil?
raise '404'
end
diff --git a/app/views/admin/organization.html.erb b/app/views/admin/organization.html.erb
new file mode 100644
index 000000000..582b8b44a
--- /dev/null
+++ b/app/views/admin/organization.html.erb
@@ -0,0 +1,43 @@
+
+ <%= link_to l(:label_organization_new), new_organization_path, :class => 'icon icon-add' %>
+
+
+
+ <%=l(:label_organization_list)%>
+
+
+
+
+<% html_title(l(:label_project_plural)) -%>
diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb
index 762ceae9e..4c9479a6d 100644
--- a/app/views/admin/projects.html.erb
+++ b/app/views/admin/projects.html.erb
@@ -2,16 +2,25 @@
<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>
-<%=l(:label_project_plural)%>
+
+ <%=l(:label_project_plural)%>
+
<%= form_tag({}, :method => :get) do %>
-