To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Tag: | Revision:

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