Chris@1464: # ActsAsWatchable Chris@1464: module Redmine Chris@1464: module Acts Chris@1464: module Watchable Chris@1464: def self.included(base) Chris@1464: base.extend ClassMethods Chris@1464: end Chris@1464: Chris@1464: module ClassMethods Chris@1464: def acts_as_watchable(options = {}) Chris@1464: return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods) Chris@1464: class_eval do Chris@1464: has_many :watchers, :as => :watchable, :dependent => :delete_all Chris@1464: has_many :watcher_users, :through => :watchers, :source => :user, :validate => false Chris@1464: Chris@1464: scope :watched_by, lambda { |user_id| Chris@1464: joins(:watchers). Chris@1464: where("#{Watcher.table_name}.user_id = ?", user_id) Chris@1464: } Chris@1464: attr_protected :watcher_ids, :watcher_user_ids Chris@1464: end Chris@1464: send :include, Redmine::Acts::Watchable::InstanceMethods Chris@1464: alias_method_chain :watcher_user_ids=, :uniq_ids Chris@1464: end Chris@1464: end Chris@1464: Chris@1464: module InstanceMethods Chris@1464: def self.included(base) Chris@1464: base.extend ClassMethods Chris@1464: end Chris@1464: Chris@1464: # Returns an array of users that are proposed as watchers Chris@1464: def addable_watcher_users Chris@1464: users = self.project.users.sort - self.watcher_users Chris@1464: if respond_to?(:visible?) Chris@1464: users.reject! {|user| !visible?(user)} Chris@1464: end Chris@1464: users Chris@1464: end Chris@1464: Chris@1464: # Adds user as a watcher Chris@1464: def add_watcher(user) Chris@1464: self.watchers << Watcher.new(:user => user) Chris@1464: end Chris@1464: Chris@1464: # Removes user from the watchers list Chris@1464: def remove_watcher(user) Chris@1464: return nil unless user && user.is_a?(User) Chris@1464: watchers.where(:user_id => user.id).delete_all Chris@1464: end Chris@1464: Chris@1464: # Adds/removes watcher Chris@1464: def set_watcher(user, watching=true) Chris@1464: watching ? add_watcher(user) : remove_watcher(user) Chris@1464: end Chris@1464: Chris@1464: # Overrides watcher_user_ids= to make user_ids uniq Chris@1464: def watcher_user_ids_with_uniq_ids=(user_ids) Chris@1464: if user_ids.is_a?(Array) Chris@1464: user_ids = user_ids.uniq Chris@1464: end Chris@1464: send :watcher_user_ids_without_uniq_ids=, user_ids Chris@1464: end Chris@1464: Chris@1464: # Returns true if object is watched by +user+ Chris@1464: def watched_by?(user) Chris@1464: !!(user && self.watcher_user_ids.detect {|uid| uid == user.id }) Chris@1464: end Chris@1464: Chris@1464: def notified_watchers Chris@1464: notified = watcher_users.active Chris@1464: notified.reject! {|user| user.mail.blank? || user.mail_notification == 'none'} Chris@1464: if respond_to?(:visible?) Chris@1464: notified.reject! {|user| !visible?(user)} Chris@1464: end Chris@1464: notified Chris@1464: end Chris@1464: Chris@1464: # Returns an array of watchers' email addresses Chris@1464: def watcher_recipients Chris@1464: notified_watchers.collect(&:mail) Chris@1464: end Chris@1464: Chris@1464: module ClassMethods; end Chris@1464: end Chris@1464: end Chris@1464: end Chris@1464: end