@@ -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