module Commontator class Comment < ActiveRecord::Base belongs_to :creator, :polymorphic => true belongs_to :editor, :polymorphic => true belongs_to :thread has_one :commontable, :through => :thread validates_presence_of :creator, :on => :create validates_presence_of :editor, :on => :update validates_presence_of :thread validates_presence_of :body validates_uniqueness_of :body, :scope => [:creator_type, :creator_id, :thread_id], :message => I18n.t('commontator.comment.errors.double_posted') protected cattr_accessor :acts_as_votable_initialized public def is_modified? !editor.nil? end def is_latest? thread.comments.last == self end def is_votable? return true if acts_as_votable_initialized return false unless self.class.respond_to?(:acts_as_votable) self.class.acts_as_votable self.class.acts_as_votable_initialized = true end def get_vote_by(user) return nil unless is_votable? && user && user.is_commontator votes.where(:voter_type => user.class.name, :voter_id => user.id).first end def is_deleted? !deleted_at.blank? end def delete_by(user) return false if is_deleted? self.deleted_at = Time.now self.editor = user self.save end def undelete_by(user) return false unless is_deleted? self.deleted_at = nil self.editor = user self.save end def created_timestamp I18n.t 'commontator.comment.status.created_at', :created_at => I18n.l(created_at, :format => :commontator) end def updated_timestamp return '' if editor.nil? I18n.t 'commontator.comment.status.updated_at', :editor_name => editor.commontator_name, :updated_at => I18n.l(updated_at, :format => :commontator) end ################## # Access Control # ################## def can_be_read_by?(user) return true if thread.can_be_edited_by?(user) (!is_deleted? || !thread.config.hide_deleted_comments) &&\ thread.can_be_read_by?(user) end def can_be_created_by?(user) user == creator && user.is_commontator &&\ !thread.is_closed? && thread.can_be_read_by?(user) end def can_be_edited_by?(user) return true if thread.config.moderators_can_edit_comments &&\ thread.can_be_edited_by?(user) comment_edit = thread.config.comment_editing.to_sym !thread.is_closed? && !is_deleted? && user == creator &&\ comment_edit != :n && (is_latest? || comment_edit == :a) &&\ thread.can_be_read_by?(user) end def can_be_deleted_by?(user) return true if thread.can_be_edited_by?(user) comment_del = thread.config.comment_deletion.to_sym !thread.is_closed? && (!is_deleted? || editor == user) &&\ user == creator && comment_del != :n &&\ (is_latest? || comment_del == :a) &&\ thread.can_be_read_by?(user) end def can_be_voted_on? !thread.is_closed? && !is_deleted? &&\ thread.config.comment_voting != :n && is_votable? end def can_be_voted_on_by?(user) !user.nil? && user.is_commontator && user != creator &&\ thread.can_be_read_by?(user) && can_be_voted_on? end end end