##// END OF EJS Templates
Added a "Member of Group" to the issues filter. #5869...
Eric Davis -
r3963:109b42f4828c
parent child
Show More
@@ -195,6 +195,9 class Query < ActiveRecord::Base
195 end
195 end
196 @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
196 @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty?
197 @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
197 @available_filters["author_id"] = { :type => :list, :order => 5, :values => user_values } unless user_values.empty?
198
199 group_values = Group.all.collect {|g| [g.name, g.id] }
200 @available_filters["member_of_group"] = { :type => :list_optional, :order => 6, :values => group_values } unless group_values.empty?
198
201
199 if User.current.logged?
202 if User.current.logged?
200 @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
203 @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] }
@@ -432,6 +435,22 class Query < ActiveRecord::Base
432 db_field = 'user_id'
435 db_field = 'user_id'
433 sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
436 sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
434 sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
437 sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
438 elsif field == "member_of_group" # named field
439 if operator == '*' # Any group
440 groups = Group.all
441 members_of_groups = groups.collect(&:user_ids).flatten.compact.collect(&:to_s)
442 operator = '=' # Override the operator since we want to find by assigned_to
443 elsif operator == "!*"
444 groups = Group.all
445 members_of_groups = groups.collect(&:user_ids).flatten.compact.collect(&:to_s)
446 operator = '!' # Override the operator since we want to find by assigned_to
447 else
448 groups = Group.find_all_by_id(v)
449 members_of_groups = groups.collect(&:user_ids).flatten.compact.collect(&:to_s)
450 end
451
452 sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
453
435 else
454 else
436 # regular field
455 # regular field
437 db_table = Issue.table_name
456 db_table = Issue.table_name
@@ -293,6 +293,7 en:
293 field_group_by: Group results by
293 field_group_by: Group results by
294 field_sharing: Sharing
294 field_sharing: Sharing
295 field_parent_issue: Parent task
295 field_parent_issue: Parent task
296 field_member_of_group: Member of Group
296
297
297 setting_app_title: Application title
298 setting_app_title: Application title
298 setting_app_subtitle: Application subtitle
299 setting_app_subtitle: Application subtitle
@@ -48,6 +48,16 class QueryTest < ActiveSupport::TestCase
48 :conditions => query.statement
48 :conditions => query.statement
49 end
49 end
50
50
51 def assert_find_issues_with_query_is_successful(query)
52 assert_nothing_raised do
53 find_issues_with_query(query)
54 end
55 end
56
57 def assert_query_statement_includes(query, condition)
58 assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}"
59 end
60
51 def test_query_should_allow_shared_versions_for_a_project_query
61 def test_query_should_allow_shared_versions_for_a_project_query
52 subproject_version = Version.find(4)
62 subproject_version = Version.find(4)
53 query = Query.new(:project => Project.find(1), :name => '_')
63 query = Query.new(:project => Project.find(1), :name => '_')
@@ -362,11 +372,87 class QueryTest < ActiveSupport::TestCase
362 end
372 end
363
373
364 context "#available_filters" do
374 context "#available_filters" do
375 setup do
376 @query = Query.new(:name => "_")
377 end
378
365 should "include users of visible projects in cross-project view" do
379 should "include users of visible projects in cross-project view" do
366 query = Query.new(:name => "_")
380 users = @query.available_filters["assigned_to_id"]
367 users = query.available_filters["assigned_to_id"]
368 assert_not_nil users
381 assert_not_nil users
369 assert users[:values].map{|u|u[1]}.include?("3")
382 assert users[:values].map{|u|u[1]}.include?("3")
370 end
383 end
384
385 context "'member_of_group' filter" do
386 should "be present" do
387 assert @query.available_filters.keys.include?("member_of_group")
388 end
389
390 should "be an optional list" do
391 assert_equal :list_optional, @query.available_filters["member_of_group"][:type]
392 end
393
394 should "have a list of the groups as values" do
395 Group.destroy_all # No fixtures
396 group1 = Group.generate!.reload
397 group2 = Group.generate!.reload
398
399 expected_group_list = [
400 [group1.name, group1.id],
401 [group2.name, group2.id]
402 ]
403 assert_equal expected_group_list, @query.available_filters["member_of_group"][:values]
404 end
405
406 end
407
371 end
408 end
409
410 context "#statement" do
411 context "with 'member_of_group' filter" do
412 setup do
413 Group.destroy_all # No fixtures
414 @user_in_group = User.generate!
415 @second_user_in_group = User.generate!
416 @user_in_group2 = User.generate!
417 @user_not_in_group = User.generate!
418
419 @group = Group.generate!.reload
420 @group.users << @user_in_group
421 @group.users << @second_user_in_group
422
423 @group2 = Group.generate!.reload
424 @group2.users << @user_in_group2
425
426 end
427
428 should "search assigned to for users in the group" do
429 @query = Query.new(:name => '_')
430 @query.add_filter('member_of_group', '=', [@group.id.to_s])
431
432 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}')"
433 assert_find_issues_with_query_is_successful @query
434 end
435
436 should "search not assigned to any group member (none)" do
437 @query = Query.new(:name => '_')
438 @query.add_filter('member_of_group', '!*', [''])
439
440 # Users not in a group
441 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
442 assert_find_issues_with_query_is_successful @query
443
444 end
445
446 should "search assigned to any group member (all)" do
447 @query = Query.new(:name => '_')
448 @query.add_filter('member_of_group', '*', [''])
449
450 # Only users in a group
451 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@user_in_group.id}','#{@second_user_in_group.id}','#{@user_in_group2.id}')"
452 assert_find_issues_with_query_is_successful @query
453
454 end
455 end
456 end
457
372 end
458 end
General Comments 0
You need to be logged in to leave comments. Login now