##// END OF EJS Templates
Adds members of subprojects in assignee and author filters (#10126)....
Jean-Philippe Lang -
r8627:2808adf99f44
parent child
Show More
@@ -33,6 +33,16 class Principal < ActiveRecord::Base
33 }
33 }
34 }
34 }
35
35
36 # Principals that are members of a collection of projects
37 named_scope :member_of, lambda {|projects|
38 if projects.empty?
39 {:conditions => "1=0"}
40 else
41 ids = projects.map(&:id)
42 {:conditions => ["#{Principal.table_name}.status = 1 AND #{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids]}
43 end
44 }
45
36 before_create :set_default_empty_values
46 before_create :set_default_empty_values
37
47
38 def name(formatter = nil)
48 def name(formatter = nil)
@@ -232,11 +232,18 class Query < ActiveRecord::Base
232 principals = []
232 principals = []
233 if project
233 if project
234 principals += project.principals.sort
234 principals += project.principals.sort
235 unless project.leaf?
236 subprojects = project.descendants.visible.all
237 if subprojects.any?
238 @available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => subprojects.collect{|s| [s.name, s.id.to_s] } }
239 principals += Principal.member_of(subprojects)
240 end
241 end
235 else
242 else
236 all_projects = Project.visible.all
243 all_projects = Project.visible.all
237 if all_projects.any?
244 if all_projects.any?
238 # members of visible projects
245 # members of visible projects
239 principals += Principal.active.find(:all, :conditions => ["#{User.table_name}.id IN (SELECT DISTINCT user_id FROM members WHERE project_id IN (?))", all_projects.collect(&:id)]).sort
246 principals += Principal.member_of(all_projects)
240
247
241 # project filter
248 # project filter
242 project_values = []
249 project_values = []
@@ -250,6 +257,8 class Query < ActiveRecord::Base
250 @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} unless project_values.empty?
257 @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} unless project_values.empty?
251 end
258 end
252 end
259 end
260 principals.uniq!
261 principals.sort!
253 users = principals.select {|p| p.is_a?(User)}
262 users = principals.select {|p| p.is_a?(User)}
254
263
255 assigned_to_values = []
264 assigned_to_values = []
@@ -282,12 +291,6 class Query < ActiveRecord::Base
282 unless versions.empty?
291 unless versions.empty?
283 @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
292 @available_filters["fixed_version_id"] = { :type => :list_optional, :order => 7, :values => versions.sort.collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s] } }
284 end
293 end
285 unless project.leaf?
286 subprojects = project.descendants.visible.all
287 unless subprojects.empty?
288 @available_filters["subproject_id"] = { :type => :list_subprojects, :order => 13, :values => subprojects.collect{|s| [s.name, s.id.to_s] } }
289 end
290 end
291 add_custom_fields_filters(project.all_issue_custom_fields)
294 add_custom_fields_filters(project.all_issue_custom_fields)
292 else
295 else
293 # global filters for cross project issue list
296 # global filters for cross project issue list
@@ -27,6 +27,11 class PrincipalTest < ActiveSupport::TestCase
27 assert_nil result.detect {|p| p.is_a?(AnonymousUser)}
27 assert_nil result.detect {|p| p.is_a?(AnonymousUser)}
28 end
28 end
29
29
30 def test_member_of_scope_should_return_the_union_of_all_members
31 projects = Project.find_all_by_id(1, 2)
32 assert_equal projects.map(&:principals).flatten.sort, Principal.member_of(projects).sort
33 end
34
30 context "#like" do
35 context "#like" do
31 setup do
36 setup do
32 Principal.generate!(:login => 'login')
37 Principal.generate!(:login => 'login')
@@ -766,6 +766,19 class QueryTest < ActiveSupport::TestCase
766 assert users[:values].map{|u|u[1]}.include?("3")
766 assert users[:values].map{|u|u[1]}.include?("3")
767 end
767 end
768
768
769 should "include users of subprojects" do
770 user1 = User.generate_with_protected!
771 user2 = User.generate_with_protected!
772 project = Project.find(1)
773 Member.create!(:principal => user1, :project => project.children.visible.first, :role_ids => [1])
774 @query.project = project
775
776 users = @query.available_filters["assigned_to_id"]
777 assert_not_nil users
778 assert users[:values].map{|u|u[1]}.include?(user1.id.to_s)
779 assert !users[:values].map{|u|u[1]}.include?(user2.id.to_s)
780 end
781
769 should "include visible projects in cross-project view" do
782 should "include visible projects in cross-project view" do
770 projects = @query.available_filters["project_id"]
783 projects = @query.available_filters["project_id"]
771 assert_not_nil projects
784 assert_not_nil projects
General Comments 0
You need to be logged in to leave comments. Login now