diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 99be166ad..ec06644bf 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -416,16 +416,16 @@ class CoursesController < ApplicationController @date_from = @date_to - @days-1.years @author = (params[:user_id].blank? ? nil : User.active.find(params[:user_id])) # 决定显示所用用户或单个用户活动 - #@activity = Redmine::Activity::Fetcher.new(User.current, :course => @course, - # :with_subprojects => false, - # :author => @author) - #@activity.scope_select {|t| !has["show_#{t}"].nil?} - #events = @activity.events(@date_from, @date_to) - - @activity = Activity.where("update_on between " +@date_from.to_s + " and " +@date_to.to_s ).order('id desc') - @activity_count = @activity.count - @activity_pages = Paginator.new @activity_count, pre_count, params['page'] - @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all + @activity = Redmine::Activity::Fetcher.new(User.current, :course => @course, + :with_subprojects => false, + :author => @author) + @activity.scope_select {|t| !has["show_#{t}"].nil?} + events = @activity.events(@date_from, @date_to) + + # @activity = Activity.where("update_on between " +@date_from.to_s + " and " +@date_to.to_s ).order('id desc') + #@activity_count = @activity.count + #@activity_pages = Paginator.new @activity_count, pre_count, params['page'] + # @activity = activity.offset(@activity_pages.offset).limit(@activity_pages.per_page).all @offset, @limit = api_offset_and_limit({:limit => 10}) @events_count = events.count diff --git a/app/models/course.rb b/app/models/course.rb index 9fdff6a8c..c853e15b1 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -25,7 +25,7 @@ class Course < ActiveRecord::Base has_many :course_infos, :class_name => 'CourseInfos',:dependent => :destroy has_many :enabled_modules, :dependent => :delete_all has_many :boards, :dependent => :destroy, :order => "position ASC" - has_many :journals_for_messages, :as => :jour, :dependent => :destroy + has_many :course_journals_for_messages, :class_name => 'CourseJournalsForMessage', :as => :jour, :dependent => :destroy acts_as_taggable #acts_as_nested_set :order => 'name', :dependent => :destroy diff --git a/app/models/course_journals_for_message.rb b/app/models/course_journals_for_message.rb new file mode 100644 index 000000000..c3f1c699d --- /dev/null +++ b/app/models/course_journals_for_message.rb @@ -0,0 +1,108 @@ +# nwb +# 课程与项目分离后的处理留言类 +class CourseJournalsForMessage < ActiveRecord::Base + self.table_name = "#{table_name_prefix}journals_for_messages#{table_name_suffix}" + include Redmine::SafeAttributes + safe_attributes "jour_type", # 留言所属类型 + "jour_id", # 留言所属类型的id + "notes", # 留言内容 + "reply_id", # 留言被回复留言者的用户id(用户a回复了用户b,这是b的id,用以查询谁给b留言了) + "status", # 留言是否被查看(弃用) + "user_id", # 留言者的id + "m_parent_id", # 留言信息的父留言id + "is_readed", # 留言是否已读 + "m_reply_count", # 留言的回复数量 + "m_reply_id" # 回复某留言的留言id(a留言回复了b留言,这是b留言的id) + acts_as_tree :foreign_key => 'm_parent_id', :counter_cache => :m_reply_count, :order => "#{JournalsForMessage.table_name}.created_on ASC" + + belongs_to :project, + :foreign_key => 'jour_id', + :conditions => "#{self.table_name}.jour_type = 'Project' " + belongs_to :course, + :foreign_key => 'jour_id', + :conditions => "#{self.table_name}.jour_type = 'Course' " + + belongs_to :jour, :polymorphic => true + belongs_to :user + belongs_to :homework_attach + belongs_to :at_user, :class_name => "User", :foreign_key => 'reply_id' + + acts_as_event :title => Proc.new {|o| "#{l(:label_my_message)}"}, + :datetime => Proc.new {|o| o.updated_on }, + :author => Proc.new {|o| o.user }, + :description => Proc.new{|o| o.notes }, + :type => Proc.new {|o| o.jour_type }, + :url => Proc.new {|o| + (o.jour.kind_of? Project) ? {:controller => 'projects', :action => 'feedback', :id => o.jour, :r => o.id, :anchor => "word_li_#{o.id}"} : {} + }#{:controller => 'documents', :action => 'show', :id => o.id}} + acts_as_activity_provider :author_key => :user_id, + :timestamp => "#{self.table_name}.updated_on", + :find_options => {:include => :course } + + + has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy + + validates :notes, presence: true + after_create :act_as_activity #huang + after_create :reset_counters! + after_destroy :reset_counters! + + # default_scope { where('m_parent_id IS NULL') } + + def self.create_by_user? user + if user.anonymous? + return false + else + return true + end + end + + def self.remove_by_user? user + if( self.user == user || + ( self.jour.kind_of?(User) && self.jour== user ) + ) + true + else + false + end + end + + def self.delete_message(message_id) + self.find(message_id).destroy + # self.destroy_all "id = #{message_id}" + end + + def reference_user + User.find(reply_id) + end + + def self.reference_message(user_id) + @user = User.find(user_id) + message = JournalsForMessage.find_by_sql("select * from journals_for_messages where reply_id = #{@user.id} + or (jour_type = 'Bid' and jour_id in (select id from bids where author_id = #{@user.id}))") + message + end + + def act_as_activity + if self.jour_type == 'Principal' + unless self.user_id == self.jour.id && self.user_id != self.reply_id && self.reply_id != 0 + # self.acts << Activity.new(:user_id => self.user_id) + self.acts << Activity.new(:user_id => self.jour_id) + end + elsif self.jour_type == 'Project' + self.acts << Activity.new(:user_id => self.reply_id) + elsif self.jour_type == 'Course' + self.acts << Activity.new(:user_id => self.reply_id) + else + end + end + + def reset_counters! + self.class.reset_counters!(self) + end + def self.reset_counters! journals_for_messages + # jfm_id = journals_for_messages.id.to_i + count = find_all_by_m_parent_id(journals_for_messages.m_parent_id).count #(SELECT COUNT(*) FROM #{JournalsForMessage.table_name} WHERE m_parent_id = #{jfm_id} ) + update_all("m_reply_count = #{count.to_i}", ["id = ?", journals_for_messages.m_parent_id]) + end +end diff --git a/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb b/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb index 2554654ea..239848400 100644 --- a/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb +++ b/lib/plugins/acts_as_activity_provider/lib/acts_as_activity_provider.rb @@ -75,8 +75,12 @@ module Redmine elsif respond_to?(:visible) scope = scope.visible(user, options) elsif options[:course] - ActiveSupport::Deprecation.warn "acts_as_activity_provider with implicit :permission option is deprecated. Add a visible scope to the #{self.name} model or use explicit :permission option." - scope = scope.scoped(:conditions => Course.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) + if Course.new.methods.include?(event_type.to_s) + ActiveSupport::Deprecation.warn "acts_as_activity_provider with implicit :permission option is deprecated. Add a visible scope to the #{self.name} model or use explicit :permission option." + scope = scope.scoped(:conditions => Course.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) + else + scope = scope.scoped(:conditions =>"1=0") + end else ActiveSupport::Deprecation.warn "acts_as_activity_provider with implicit :permission option is deprecated. Add a visible scope to the #{self.name} model or use explicit :permission option." scope = scope.scoped(:conditions => Project.allowed_to_condition(user, "view_#{self.name.underscore.pluralize}".to_sym, options)) diff --git a/lib/redmine.rb b/lib/redmine.rb index db2298087..e376a3e1f 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -99,15 +99,18 @@ Redmine::AccessControl.map do |map| map.permission :view_journals_for_messages, {:gantts => [:show, :update]}, :read => true #课程权限模块 + #added by nwb map.permission :view_course, {:courses => [:show], :activities => [:index]}, :public => true, :read => true map.permission :search_course, {:search => :index}, :public => true, :read => true map.permission :add_course, {:courses => [:new, :create]}, :require => :loggedin map.permission :edit_course, {:courses => [:settings, :edit, :update]}, :require => :member map.permission :close_course, {:courses => [:close, :reopen]}, :require => :member, :read => true map.permission :select_course_modules, {:courses => :modules}, :require => :member + map.permission :view_course_journals_for_messages, {:gantts => [:show, :update]}, :read => true map.course_module :course do end + #end map.project_module :issue_tracking do |map| # Issue categories @@ -411,6 +414,8 @@ Redmine::Activity.map do |activity| activity.register :memos, :class_name => 'Memo' activity.register :journals_for_messages # end + #added by nwb + activity.register :course_journals_for_messages end Redmine::Search.map do |search| diff --git a/lib/redmine/activity/fetcher.rb b/lib/redmine/activity/fetcher.rb index 37576613a..0204979e9 100644 --- a/lib/redmine/activity/fetcher.rb +++ b/lib/redmine/activity/fetcher.rb @@ -45,9 +45,11 @@ module Redmine @event_types = Redmine::Activity.available_event_types if @project - @event_types = @event_types.select {|o| @project.self_and_descendants.detect {|p| @user.allowed_to?("view_#{o}".to_sym, p)}} + @event_types = @event_types.select { |o| @project.self_and_descendants.detect { |p| @user.allowed_to?("view_#{o}".to_sym, p) } } + elsif @course + @event_types = @event_types.select { |o| @user.allowed_to?("view_#{o}".to_sym,@course) } else - @event_types = @event_types.select {|o| @user.allowed_to?("view_#{o}".to_sym,@course)} if @course + @event_types = @event_types.select { |o| @user.allowed_to?("view_#{o}".to_sym, @course) } if @course end @event_types end