##// 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 46 before_create :set_default_empty_values
37 47
38 48 def name(formatter = nil)
@@ -232,11 +232,18 class Query < ActiveRecord::Base
232 232 principals = []
233 233 if project
234 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 242 else
236 243 all_projects = Project.visible.all
237 244 if all_projects.any?
238 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 248 # project filter
242 249 project_values = []
@@ -250,6 +257,8 class Query < ActiveRecord::Base
250 257 @available_filters["project_id"] = { :type => :list, :order => 1, :values => project_values} unless project_values.empty?
251 258 end
252 259 end
260 principals.uniq!
261 principals.sort!
253 262 users = principals.select {|p| p.is_a?(User)}
254 263
255 264 assigned_to_values = []
@@ -282,12 +291,6 class Query < ActiveRecord::Base
282 291 unless versions.empty?
283 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 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 294 add_custom_fields_filters(project.all_issue_custom_fields)
292 295 else
293 296 # global filters for cross project issue list
@@ -27,6 +27,11 class PrincipalTest < ActiveSupport::TestCase
27 27 assert_nil result.detect {|p| p.is_a?(AnonymousUser)}
28 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 35 context "#like" do
31 36 setup do
32 37 Principal.generate!(:login => 'login')
@@ -766,6 +766,19 class QueryTest < ActiveSupport::TestCase
766 766 assert users[:values].map{|u|u[1]}.include?("3")
767 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 782 should "include visible projects in cross-project view" do
770 783 projects = @query.available_filters["project_id"]
771 784 assert_not_nil projects
General Comments 0
You need to be logged in to leave comments. Login now