You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							200 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							200 lines
						
					
					
						
							6.3 KiB
						
					
					
				| class RelativeMemo < ActiveRecord::Base
 | |
|   # attr_accessible :title, :body
 | |
|   include Redmine::SafeAttributes
 | |
|   belongs_to :open_source_project, :class_name => "OpenSourceProject", :foreign_key => 'osp_id'
 | |
|   belongs_to :author, :class_name => "User", :foreign_key => 'author_id'
 | |
|   
 | |
|   has_many :tags, :through => :project_tags, :class_name => 'Tag'
 | |
|   has_many :project_tags, :class_name => 'ProjectTags'
 | |
|   
 | |
|   has_many :relation_topics, :class_name => 'RelativeMemoToOpenSourceProject'
 | |
|   
 | |
|   has_many :no_uses, :as => :no_use, :dependent => :delete_all
 | |
|   
 | |
|   has_many :bugs_to_osp, :class_name => 'BugToOsp', :foreign_key => 'relative_memo_id', :dependent => :destroy
 | |
|   
 | |
|   
 | |
|   acts_as_taggable 
 | |
| 
 | |
|   validates_presence_of :subject
 | |
|   #validates :content, presence: true
 | |
|   # validates_length_of :subject, maximum: 50
 | |
|   #validates_length_of :content, maximum: 3072
 | |
|   validate :cannot_reply_to_locked_topic, :on => :create
 | |
|   validates_uniqueness_of :osp_id, :scope => [:subject, :content]
 | |
| 
 | |
|   acts_as_tree :counter_cache => :replies_count, :order => "#{RelativeMemo.table_name}.created_at ASC"
 | |
|   acts_as_attachable
 | |
|   belongs_to :last_reply, :class_name => 'RelativeMemo', :foreign_key => 'last_reply_id'
 | |
|   # acts_as_searchable :column => ['subject', 'content'],
 | |
|   #           #:include => { :forum => :p}
 | |
|   #           #:project_key => "#{Forum.table_name}.project_id"
 | |
|   #           :date_column => "#{table_name}.created_at"
 | |
|   
 | |
|   # acts_as_event :title => Proc.new {|o| "#{o.forum.name}: #{o.subject}"},
 | |
|           # :datetime => :updated_at,
 | |
|           # # :datetime => :created_at,
 | |
|           # :description => :content,
 | |
|           # :author => :author,
 | |
|           # :type => Proc.new {|o| o.parent_id.nil? ? 'Memo' : 'Reply'},
 | |
|           # :url => Proc.new {|o| {:controller => 'memos', :action => 'show', :forum_id => o.forum_id}.merge(o.parent_id.nil? ? {:id => o.id} : {:id => o.parent_id, :r => o.id, :anchor => "reply-#{o.id}"})}
 | |
|   # acts_as_activity_provider :author_key => :author_id,
 | |
|                 # :func => 'memos',
 | |
|                 # :timestamp => 'created_at'
 | |
|                 
 | |
|                 # :find_options => {:type => 'memos'}
 | |
|   # acts_as_watchable
 | |
| 
 | |
|   safe_attributes "author_id",
 | |
|           "subject",
 | |
|           "content",
 | |
|           "osp_id",
 | |
|           "last_memo_id",
 | |
|           "lock",
 | |
|           "sticky",
 | |
|           "parent_id",
 | |
|           "replies_count",
 | |
|           "is_quote"
 | |
| 
 | |
|   after_create :add_author_as_watcher, :reset_counters!
 | |
|   # after_update :update_memos_forum
 | |
|   after_destroy :reset_counters!
 | |
|   # after_create :send_notification
 | |
|   # after_save :plusParentAndForum
 | |
|   # after_destroy :minusParentAndForum
 | |
| 
 | |
|   # scope :visible, lambda { |*args|
 | |
|   #   includes(:forum => ).where()
 | |
|   # }
 | |
| 
 | |
|   def cannot_reply_to_locked_topic
 | |
|     errors.add :base, l(:label_memo_locked) if root.locked? && self != root
 | |
|   end
 | |
|   
 | |
|   def short_content(length = 25)
 | |
|     str = "^(.{,#{length}})[^\n\r]*.*$"
 | |
|     content.gsub(Regexp.new(str), '\1...').strip if content
 | |
|   end
 | |
| 
 | |
|   # def update_memos_forum
 | |
|   #   if forum_id_changed?
 | |
|   #     Message.update_all({:board_id => board_id}, ["id = ? OR parent_id = ?", root.id, root.id ])
 | |
|   #     Forum.reset_counters!(forum_id_was)
 | |
|   #     Forum.reset_counters!(forum_id)
 | |
|   #   end
 | |
|   # end
 | |
|   
 | |
|   
 | |
|   scope :no_use_for, lambda { |user_id|
 | |
|               { :include => :no_uses,
 | |
|                 :conditions => ["#{NoUse.table_name}.user_id = ?", user_id] }
 | |
|             }
 | |
|   
 | |
|   # 获取帖子的回复          
 | |
|   def replies
 | |
|     memos = RelativeMemo.where("parent_id = ?", id)
 | |
|   end
 | |
|     
 | |
|   def no_use_for?(user)
 | |
|     self.no_uses.each do |no_use|
 | |
|       if no_use.user_id == user.id
 | |
|         return true
 | |
|       end 
 | |
|     end
 | |
|     false
 | |
|   end
 | |
|   
 | |
|   def set_no_use(user, flag=true)
 | |
|     flag ? set_filter(user) : remove_filter(user)
 | |
|   end
 | |
|   
 | |
|   def set_filter(user)
 | |
|     self.no_uses << NoUse.new(:user => user)
 | |
|   end
 | |
|   
 | |
|   def remove_filter(user)
 | |
|     return nil unless user && user.is_a?(User)
 | |
|     NoUse.delete_all "no_use_type = '#{self.class}' AND no_use_id = #{self.id} AND user_id = #{user.id}"
 | |
|   end
 | |
| 
 | |
|   def reset_counters!
 | |
|     if parent && parent.id
 | |
|       RelativeMemo.update_all({:last_reply_id => parent.children.maximum(:id)}, {:id => parent.id})
 | |
|       parent.update_attribute(:updated_at, Time.now)
 | |
|     end
 | |
|     # forum.reset_counters!
 | |
|   end
 | |
| 
 | |
|   def sticky?
 | |
|     sticky == 1
 | |
|   end
 | |
| 
 | |
|   def replies
 | |
|     RelativeMemo.where("parent_id = ?", id)
 | |
|   end
 | |
| 
 | |
|   def locked?
 | |
|     self.lock
 | |
|   end
 | |
|   
 | |
|   def editable_by? user
 | |
|     # user && user.logged? || (self.author == usr && usr.allowed_to?(:edit_own_messages, project))
 | |
|     user.admin?
 | |
|   end
 | |
| 
 | |
|   # def destroyable_by? user
 | |
|     # (user && user.logged? && (Forum.find(self.forum_id).creator_id == user.id) ) || user.admin?
 | |
|     # #self.author == user || user.admin?
 | |
|   # end
 | |
| 
 | |
|   def deleted_attach_able_by? user
 | |
|     (user && user.logged? && (self.author == user) ) || user.admin?
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def add_author_as_watcher
 | |
|     Watcher.create(:watchable => self.root, :user => author)
 | |
|   end
 | |
| 
 | |
|   def send_notification
 | |
|     if Setting.notified_events.include?('message_posted')
 | |
|       Mailer.message_posted(self).deliver
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # def plusParentAndForum
 | |
|     # @forum = Forum.find(self.forum_id)
 | |
|     # @forum.memo_count = @forum.memo_count.to_int + 1
 | |
|     # @forum.last_memo_id = self.id
 | |
|     # if self.parent_id
 | |
|       # @parent_memo = Memo.find_by_id(self.parent_id)
 | |
|       # @parent_memo.last_reply_id = self
 | |
|       # @parent_memo.replies_count = @parent_memo.replies_count.to_int + 1
 | |
|       # @parent_memo.save
 | |
|     # else
 | |
|       # @forum.topic_count = @forum.topic_count.to_int + 1
 | |
|     # end
 | |
|     # @forum.save
 | |
|   # end
 | |
| 
 | |
|   # def minusParentAndForum
 | |
|     # @forum = Forum.find(self.forum_id)
 | |
|     # @forum.memo_count = @forum.memo_count.to_int - 1
 | |
|     # @forum.memo_count = 0 if @forum.memo_count.to_int < 0
 | |
|     # # @forum.last_memo_id = Memo.reorder('created_at ASC').find_all_by_forum_id(self.forum_id).last.id
 | |
|     # if self.parent_id
 | |
|       # @parent_memo = Memo.find_by_id(self.parent_id)
 | |
|       # # @parent_memo.last_reply_id = Memo.reorder('created_at ASC').find_all_by_parent_id(self.parent_id).last.id
 | |
|       # @parent_memo.replies_count = @parent_memo.replies_count.to_int - 1
 | |
|       # @parent_memo.replies_count = 0 if @parent_memo.replies_count.to_int < 0
 | |
|       # @parent_memo.save
 | |
|     # else
 | |
|       # @forum.topic_count = @forum.topic_count.to_int - 1
 | |
|       # @forum.topic_count = 0 if @forum.topic_count.to_int < 0
 | |
|     # end
 | |
|     # @forum.save
 | |
|   # end
 | |
| end
 | |
| 
 |