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