To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / .svn / pristine / 6c / 6cea03c76318e826b03e4d334daa05b149e4780d.svn-base @ 1297:0a574315af3e
History | View | Annotate | Download (2.74 KB)
| 1 | 1296:038ba2d95de8 | Chris | # ActsAsWatchable |
|---|---|---|---|
| 2 | module Redmine |
||
| 3 | module Acts |
||
| 4 | module Watchable |
||
| 5 | def self.included(base) |
||
| 6 | base.extend ClassMethods |
||
| 7 | end |
||
| 8 | |||
| 9 | module ClassMethods |
||
| 10 | def acts_as_watchable(options = {})
|
||
| 11 | return if self.included_modules.include?(Redmine::Acts::Watchable::InstanceMethods) |
||
| 12 | class_eval do |
||
| 13 | has_many :watchers, :as => :watchable, :dependent => :delete_all |
||
| 14 | has_many :watcher_users, :through => :watchers, :source => :user, :validate => false |
||
| 15 | |||
| 16 | scope :watched_by, lambda { |user_id|
|
||
| 17 | { :include => :watchers,
|
||
| 18 | :conditions => ["#{Watcher.table_name}.user_id = ?", user_id] }
|
||
| 19 | } |
||
| 20 | attr_protected :watcher_ids, :watcher_user_ids |
||
| 21 | end |
||
| 22 | send :include, Redmine::Acts::Watchable::InstanceMethods |
||
| 23 | alias_method_chain :watcher_user_ids=, :uniq_ids |
||
| 24 | end |
||
| 25 | end |
||
| 26 | |||
| 27 | module InstanceMethods |
||
| 28 | def self.included(base) |
||
| 29 | base.extend ClassMethods |
||
| 30 | end |
||
| 31 | |||
| 32 | # Returns an array of users that are proposed as watchers |
||
| 33 | def addable_watcher_users |
||
| 34 | users = self.project.users.sort - self.watcher_users |
||
| 35 | if respond_to?(:visible?) |
||
| 36 | users.reject! {|user| !visible?(user)}
|
||
| 37 | end |
||
| 38 | users |
||
| 39 | end |
||
| 40 | |||
| 41 | # Adds user as a watcher |
||
| 42 | def add_watcher(user) |
||
| 43 | self.watchers << Watcher.new(:user => user) |
||
| 44 | end |
||
| 45 | |||
| 46 | # Removes user from the watchers list |
||
| 47 | def remove_watcher(user) |
||
| 48 | return nil unless user && user.is_a?(User) |
||
| 49 | Watcher.delete_all "watchable_type = '#{self.class}' AND watchable_id = #{self.id} AND user_id = #{user.id}"
|
||
| 50 | end |
||
| 51 | |||
| 52 | # Adds/removes watcher |
||
| 53 | def set_watcher(user, watching=true) |
||
| 54 | watching ? add_watcher(user) : remove_watcher(user) |
||
| 55 | end |
||
| 56 | |||
| 57 | # Overrides watcher_user_ids= to make user_ids uniq |
||
| 58 | def watcher_user_ids_with_uniq_ids=(user_ids) |
||
| 59 | if user_ids.is_a?(Array) |
||
| 60 | user_ids = user_ids.uniq |
||
| 61 | end |
||
| 62 | send :watcher_user_ids_without_uniq_ids=, user_ids |
||
| 63 | end |
||
| 64 | |||
| 65 | # Returns true if object is watched by +user+ |
||
| 66 | def watched_by?(user) |
||
| 67 | !!(user && self.watcher_user_ids.detect {|uid| uid == user.id })
|
||
| 68 | end |
||
| 69 | |||
| 70 | def notified_watchers |
||
| 71 | notified = watcher_users.active |
||
| 72 | notified.reject! {|user| user.mail.blank? || user.mail_notification == 'none'}
|
||
| 73 | if respond_to?(:visible?) |
||
| 74 | notified.reject! {|user| !visible?(user)}
|
||
| 75 | end |
||
| 76 | notified |
||
| 77 | end |
||
| 78 | |||
| 79 | # Returns an array of watchers' email addresses |
||
| 80 | def watcher_recipients |
||
| 81 | notified_watchers.collect(&:mail) |
||
| 82 | end |
||
| 83 | |||
| 84 | module ClassMethods; end |
||
| 85 | end |
||
| 86 | end |
||
| 87 | end |
||
| 88 | end |