##// END OF EJS Templates
Fixed that Redmine::Activity::Fetcher should consider activity provider permission option if given (#18832)....
Jean-Philippe Lang -
r13513:886b9c14d0cb
parent child
Show More
@@ -41,6 +41,12 module Redmine
41 @@default_event_types << event_type unless options[:default] == false
41 @@default_event_types << event_type unless options[:default] == false
42 @@providers[event_type] += providers
42 @@providers[event_type] += providers
43 end
43 end
44
45 def delete(event_type)
46 @@available_event_types.delete event_type
47 @@default_event_types.delete event_type
48 @@providers.delete(event_type)
49 end
44 end
50 end
45 end
51 end
46 end
52 end
@@ -21,9 +21,6 module Redmine
21 class Fetcher
21 class Fetcher
22 attr_reader :user, :project, :scope
22 attr_reader :user, :project, :scope
23
23
24 # Needs to be unloaded in development mode
25 @@constantized_providers = Hash.new {|h,k| h[k] = Redmine::Activity.providers[k].collect {|t| t.constantize } }
26
27 def initialize(user, options={})
24 def initialize(user, options={})
28 options.assert_valid_keys(:project, :with_subprojects, :author)
25 options.assert_valid_keys(:project, :with_subprojects, :author)
29 @user = user
26 @user = user
@@ -38,7 +35,25 module Redmine
38 return @event_types unless @event_types.nil?
35 return @event_types unless @event_types.nil?
39
36
40 @event_types = Redmine::Activity.available_event_types
37 @event_types = Redmine::Activity.available_event_types
41 @event_types = @event_types.select {|o| @project.self_and_descendants.detect {|p| @user.allowed_to?("view_#{o}".to_sym, p)}} if @project
38 if @project
39 projects = @project.self_and_descendants
40 @event_types = @event_types.select do |event_type|
41 keep = false
42 constantized_providers(event_type).each do |provider|
43 options = provider.activity_provider_options[event_type]
44 permission = options[:permission]
45 unless options.key?(:permission)
46 permission ||= "view_#{event_type}".to_sym
47 end
48 if permission
49 keep |= projects.any? {|p| @user.allowed_to?(permission, p)}
50 else
51 keep = true
52 end
53 end
54 keep
55 end
56 end
42 @event_types
57 @event_types
43 end
58 end
44
59
@@ -88,7 +103,7 module Redmine
88 private
103 private
89
104
90 def constantized_providers(event_type)
105 def constantized_providers(event_type)
91 @@constantized_providers[event_type]
106 Redmine::Activity.providers[event_type].map(&:constantize)
92 end
107 end
93 end
108 end
94 end
109 end
@@ -121,6 +121,66 class ActivityTest < ActiveSupport::TestCase
121 assert_equal content.page, content.event_group
121 assert_equal content.page, content.event_group
122 end
122 end
123
123
124 class TestActivityProviderWithPermission
125 def self.activity_provider_options
126 {'test' => {:permission => :custom_permission}}
127 end
128 end
129
130 class TestActivityProviderWithNilPermission
131 def self.activity_provider_options
132 {'test' => {:permission => nil}}
133 end
134 end
135
136 class TestActivityProviderWithoutPermission
137 def self.activity_provider_options
138 {'test' => {}}
139 end
140 end
141
142 class MockUser
143 def initialize(*permissions)
144 @permissions = permissions
145 end
146
147 def allowed_to?(permission, *args)
148 @permissions.include?(permission)
149 end
150 end
151
152 def test_event_types_should_consider_activity_provider_permission
153 Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithPermission'
154 user = MockUser.new(:custom_permission)
155 f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
156 assert_include 'test', f.event_types
157 ensure
158 Redmine::Activity.delete 'test'
159 end
160
161 def test_event_types_should_include_activity_provider_with_nil_permission
162 Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithNilPermission'
163 user = MockUser.new()
164 f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
165 assert_include 'test', f.event_types
166 ensure
167 Redmine::Activity.delete 'test'
168 end
169
170 def test_event_types_should_use_default_permission_for_activity_provider_without_permission
171 Redmine::Activity.register 'test', :class_name => 'ActivityTest::TestActivityProviderWithoutPermission'
172
173 user = MockUser.new()
174 f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
175 assert_not_include 'test', f.event_types
176
177 user = MockUser.new(:view_test)
178 f = Redmine::Activity::Fetcher.new(user, :project => Project.find(1))
179 assert_include 'test', f.event_types
180 ensure
181 Redmine::Activity.delete 'test'
182 end
183
124 private
184 private
125
185
126 def find_events(user, options={})
186 def find_events(user, options={})
General Comments 0
You need to be logged in to leave comments. Login now