@@ -195,6 +195,9 class Query < ActiveRecord::Base | |||
|
195 | 195 | end |
|
196 | 196 | @available_filters["assigned_to_id"] = { :type => :list_optional, :order => 4, :values => user_values } unless user_values.empty? |
|
197 | 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 | 202 | if User.current.logged? |
|
200 | 203 | @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] } |
@@ -432,6 +435,22 class Query < ActiveRecord::Base | |||
|
432 | 435 | db_field = 'user_id' |
|
433 | 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 | 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 | 454 | else |
|
436 | 455 | # regular field |
|
437 | 456 | db_table = Issue.table_name |
@@ -293,6 +293,7 en: | |||
|
293 | 293 | field_group_by: Group results by |
|
294 | 294 | field_sharing: Sharing |
|
295 | 295 | field_parent_issue: Parent task |
|
296 | field_member_of_group: Member of Group | |
|
296 | 297 | |
|
297 | 298 | setting_app_title: Application title |
|
298 | 299 | setting_app_subtitle: Application subtitle |
@@ -48,6 +48,16 class QueryTest < ActiveSupport::TestCase | |||
|
48 | 48 | :conditions => query.statement |
|
49 | 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 | 61 | def test_query_should_allow_shared_versions_for_a_project_query |
|
52 | 62 | subproject_version = Version.find(4) |
|
53 | 63 | query = Query.new(:project => Project.find(1), :name => '_') |
@@ -362,11 +372,87 class QueryTest < ActiveSupport::TestCase | |||
|
362 | 372 | end |
|
363 | 373 | |
|
364 | 374 | context "#available_filters" do |
|
375 | setup do | |
|
376 | @query = Query.new(:name => "_") | |
|
377 | end | |
|
378 | ||
|
365 | 379 | should "include users of visible projects in cross-project view" do |
|
366 | query = Query.new(:name => "_") | |
|
367 | users = query.available_filters["assigned_to_id"] | |
|
380 | users = @query.available_filters["assigned_to_id"] | |
|
368 | 381 | assert_not_nil users |
|
369 | 382 | assert users[:values].map{|u|u[1]}.include?("3") |
|
370 | 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 | 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 | 458 | end |
General Comments 0
You need to be logged in to leave comments.
Login now