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