diff --git a/app/models/issue.rb b/app/models/issue.rb index 7736877..d555b8a 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -113,16 +113,25 @@ class Issue < ActiveRecord::Base # Returns a SQL conditions string used to find all issues visible by the specified user def self.visible_condition(user, options={}) Project.allowed_to_condition(user, :view_issues, options) do |role, user| + # Keep the code DRY + if [ 'default', 'own' ].include?(role.issues_visibility) + user_ids = [user.id] + user.groups.map(&:id).compact + watched_issues = Issue.watched_by(user).map(&:id) + watched_issues_clause = watched_issues.empty? ? "" : " OR #{table_name}.id IN (#{watched_issues.join(',')})" + end + if user.id && user.logged? case role.issues_visibility when 'all' nil when 'default' - user_ids = [user.id] + user.groups.map(&:id).compact - "(#{table_name}.is_private = #{connection.quoted_false} OR #{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + #user_ids = [user.id] + user.groups.map(&:id).compact + #"(#{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 #{table_name}.assigned_to_id IN (#{user_ids.join(',')}) #{watched_issues_clause})" when 'own' - user_ids = [user.id] + user.groups.map(&:id).compact - "(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + #user_ids = [user.id] + user.groups.map(&:id).compact + #"(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" + "(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}) #{watched_issues_clause})" else '1=0' end @@ -140,9 +149,11 @@ 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 || 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 || user.is_or_belongs_to?(assigned_to) + !self.is_private? || (self.author == user || self.watched_by?(user) || user.is_or_belongs_to?(assigned_to)) else false end @@ -152,6 +163,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 + # Returns true if user or current user is allowed to edit or add a note to the issue def editable?(user=User.current) attributes_editable?(user) || user.allowed_to?(:add_issue_notes, project)