diff --git a/app/models/issue.rb b/app/models/issue.rb index a47e6c0..2ed1612 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -72,6 +72,7 @@ class Issue < ActiveRecord::Base scope :visible, lambda {|*args| { :include => :project, + :joins => %Q{LEFT OUTER JOIN `#{Watcher.table_name}` ON `#{Watcher.table_name}`.`watchable_id` = `#{table_name}`.`id` AND `#{Watcher.table_name}`.`watchable_type` = 'Issue'}, :conditions => Issue.visible_condition(args.shift || User.current, *args) } } scope :open, lambda {|*args| @@ -100,10 +101,10 @@ class Issue < ActiveRecord::Base nil when 'default' user_ids = [user.id] + user.groups.map(&:id) - "(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + "(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{Watcher.table_name}.user_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" when 'own' user_ids = [user.id] + user.groups.map(&:id) - "(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + "(#{table_name}.author_id = #{user.id} OR #{Watcher.table_name}.user_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" else '1=0' end @@ -121,9 +122,9 @@ class Issue < ActiveRecord::Base when 'all' true when 'default' - !self.is_private? || (self.author == user || user.is_or_belongs_to?(assigned_to)) + !self.is_private? || self.author == user || self.watched_by?(user) || user.is_or_belongs_to?(assigned_to) when 'own' - self.author == user || user.is_or_belongs_to?(assigned_to) + self.author == user || self.watched_by?(user) || user.is_or_belongs_to?(assigned_to) else false end @@ -133,6 +134,14 @@ class Issue < ActiveRecord::Base end end + # Override the acts_as_watchble default to allow any user with view issues + # rights to watch/see this issue. + def addable_watcher_users + users = self.project.users.sort - self.watcher_users + users.reject! {|user| !user.allowed_to?(:view_issues, self.project)} + users + end + def initialize(attributes=nil, *args) super if new_record? diff --git a/app/models/journal.rb b/app/models/journal.rb index 560ccf3..4af1e1f 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -43,6 +43,7 @@ class Journal < ActiveRecord::Base user = args.shift || User.current includes(:issue => :project). + joins(%Q{LEFT OUTER JOIN `#{Watcher.table_name}` ON `#{Watcher.table_name}`.`watchable_id` = `#{Issue.table_name}`.`id` AND `#{Watcher.table_name}`.`watchable_type` = 'Issue'}). where(Issue.visible_condition(user, *args)). where("(#{Journal.table_name}.private_notes = ? OR (#{Project.allowed_to_condition(user, :view_private_notes, *args)}))", false) }