Patch #23546 » 23546-watched_or_created_or_assigned_issue_visibility.patch
app/models/issue.rb | ||
---|---|---|
131 | 131 |
when 'own' |
132 | 132 |
user_ids = [user.id] + user.groups.map(&:id).compact |
133 | 133 |
"(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}))" |
134 |
when 'watched' |
|
135 |
user_ids = [user.id] + user.groups.map(&:id).compact |
|
136 |
watcher_select = Watcher.where(watchable_type: self.base_class.name, user_id: user.id).select(:watchable_id).to_sql |
|
137 |
"(#{table_name}.author_id = #{user.id} OR #{table_name}.assigned_to_id IN (#{user_ids.join(',')}) OR #{table_name}.id IN (#{watcher_select}))" |
|
134 | 138 |
else |
135 | 139 |
'1=0' |
136 | 140 |
end |
... | ... | |
160 | 164 |
!self.is_private? || (self.author == user || user.is_or_belongs_to?(assigned_to)) |
161 | 165 |
when 'own' |
162 | 166 |
self.author == user || user.is_or_belongs_to?(assigned_to) |
167 |
when 'watched' |
|
168 |
self.author == user || user.is_or_belongs_to?(assigned_to) || self.watched_by?(user) |
|
163 | 169 |
else |
164 | 170 |
false |
165 | 171 |
end |
app/models/role.rb | ||
---|---|---|
38 | 38 |
ISSUES_VISIBILITY_OPTIONS = [ |
39 | 39 |
['all', :label_issues_visibility_all], |
40 | 40 |
['default', :label_issues_visibility_public], |
41 |
['own', :label_issues_visibility_own] |
|
41 |
['own', :label_issues_visibility_own], |
|
42 |
['watched', :label_issues_visibility_watched] |
|
42 | 43 |
] |
43 | 44 | |
44 | 45 |
TIME_ENTRIES_VISIBILITY_OPTIONS = [ |
config/locales/de.yml | ||
---|---|---|
595 | 595 |
label_issues_visibility_all: Alle Tickets |
596 | 596 |
label_issues_visibility_own: Tickets die folgender Benutzer erstellt hat oder die ihm zugewiesen sind |
597 | 597 |
label_issues_visibility_public: Alle öffentlichen Tickets |
598 |
label_issues_visibility_watched: "Aufgaben die folgender Benutzer beobachtet, erstellt hat oder die ihm zugewiesen sind" |
|
598 | 599 |
label_item_position: "%{position}/%{count}" |
599 | 600 |
label_jump_to_a_project: Zu einem Projekt springen... |
600 | 601 |
label_language_based: Sprachabhängig |
config/locales/en.yml | ||
---|---|---|
916 | 916 |
label_issues_visibility_all: All issues |
917 | 917 |
label_issues_visibility_public: All non private issues |
918 | 918 |
label_issues_visibility_own: Issues created by or assigned to the user |
919 |
label_issues_visibility_watched: Issues watched by, created by or assigned to the user |
|
919 | 920 |
label_git_report_last_commit: Report last commit for files and directories |
920 | 921 |
label_parent_revision: Parent |
921 | 922 |
label_child_revision: Child |
test/unit/issue_test.rb | ||
---|---|---|
255 | 255 |
assert !issue.visible?(User.anonymous) |
256 | 256 |
end |
257 | 257 | |
258 |
def test_anonymous_should_not_see_private_issues_with_issues_visibility_set_to_watched |
|
259 |
assert Role.anonymous.update_attribute(:issues_visibility, 'watched') |
|
260 |
issue = Issue.generate!(:author => User.anonymous, :assigned_to => User.anonymous, :is_private => true) |
|
261 |
assert_nil Issue.where(:id => issue.id).visible(User.anonymous).first |
|
262 |
assert !issue.visible?(User.anonymous) |
|
263 |
end |
|
264 | ||
258 | 265 |
def test_visible_scope_for_non_member |
259 | 266 |
user = User.find(9) |
260 | 267 |
assert user.projects.empty? |
... | ... | |
277 | 284 |
assert_visibility_match user, issues |
278 | 285 |
end |
279 | 286 | |
287 |
def test_visible_scope_for_non_member_with_watched_issues_visibility |
|
288 |
Role.non_member.update_attribute :issues_visibility, 'watched' |
|
289 |
issue = Issue.generate!(:project_id => 1, :tracker_id => 1, :author => User.anonymous, :subject => 'Issue by non member') |
|
290 |
user = User.find(9) |
|
291 |
issue.add_watcher(user) |
|
292 | ||
293 |
issues = Issue.visible(user).all |
|
294 |
assert issues.any? |
|
295 |
assert_nil issues.detect {|issue| !issue.watched_by?(user) } |
|
296 |
assert_visibility_match user, issues |
|
297 |
end |
|
298 | ||
280 | 299 |
def test_visible_scope_for_non_member_without_view_issues_permissions |
281 | 300 |
# Non member user should not see issues without permission |
282 | 301 |
Role.non_member.remove_permission!(:view_issues) |