@@ -198,6 +198,9 class Query < ActiveRecord::Base | |||||
198 |
|
198 | |||
199 | group_values = Group.all.collect {|g| [g.name, g.id] } |
|
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? |
|
200 | @available_filters["member_of_group"] = { :type => :list_optional, :order => 6, :values => group_values } unless group_values.empty? | |
|
201 | ||||
|
202 | role_values = Role.givable.collect {|r| [r.name, r.id] } | |||
|
203 | @available_filters["assigned_to_role"] = { :type => :list_optional, :order => 7, :values => role_values } unless role_values.empty? | |||
201 |
|
204 | |||
202 | if User.current.logged? |
|
205 | if User.current.logged? | |
203 | @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] } |
|
206 | @available_filters["watcher_id"] = { :type => :list, :order => 15, :values => [["<< #{l(:label_me)} >>", "me"]] } | |
@@ -451,6 +454,26 class Query < ActiveRecord::Base | |||||
451 |
|
454 | |||
452 | sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')' |
|
455 | sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')' | |
453 |
|
456 | |||
|
457 | elsif field == "assigned_to_role" # named field | |||
|
458 | if operator == "*" # Any Role | |||
|
459 | roles = Role.givable | |||
|
460 | operator = '=' # Override the operator since we want to find by assigned_to | |||
|
461 | elsif operator == "!*" # No role | |||
|
462 | roles = Role.givable | |||
|
463 | operator = '!' # Override the operator since we want to find by assigned_to | |||
|
464 | else | |||
|
465 | roles = Role.givable.find_all_by_id(v) | |||
|
466 | end | |||
|
467 | roles ||= [] | |||
|
468 | ||||
|
469 | members_of_roles = roles.inject([]) {|user_ids, role| | |||
|
470 | if role && role.members | |||
|
471 | user_ids << role.members.collect(&:user_id) | |||
|
472 | end | |||
|
473 | user_ids.flatten.uniq.compact | |||
|
474 | }.sort.collect(&:to_s) | |||
|
475 | ||||
|
476 | sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')' | |||
454 | else |
|
477 | else | |
455 | # regular field |
|
478 | # regular field | |
456 | db_table = Issue.table_name |
|
479 | db_table = Issue.table_name |
@@ -294,6 +294,7 en: | |||||
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 | field_member_of_group: Member of Group | |
|
297 | field_assigned_to_role: Member of Role | |||
297 |
|
298 | |||
298 | setting_app_title: Application title |
|
299 | setting_app_title: Application title | |
299 | setting_app_subtitle: Application subtitle |
|
300 | setting_app_subtitle: Application subtitle |
@@ -13,6 +13,11 module ObjectDaddyHelpers | |||||
13 | User.spawn(attributes) |
|
13 | User.spawn(attributes) | |
14 | end |
|
14 | end | |
15 |
|
15 | |||
|
16 | def User.add_to_project(user, project, roles) | |||
|
17 | roles = [roles] unless roles.is_a?(Array) | |||
|
18 | Member.generate!(:principal => user, :project => project, :roles => roles) | |||
|
19 | end | |||
|
20 | ||||
16 | # Generate the default Query |
|
21 | # Generate the default Query | |
17 | def Query.generate_default!(attributes={}) |
|
22 | def Query.generate_default!(attributes={}) | |
18 | query = Query.spawn(attributes) |
|
23 | query = Query.spawn(attributes) |
@@ -404,7 +404,29 class QueryTest < ActiveSupport::TestCase | |||||
404 | end |
|
404 | end | |
405 |
|
405 | |||
406 | end |
|
406 | end | |
407 |
|
407 | |||
|
408 | context "'assigned_to_role' filter" do | |||
|
409 | should "be present" do | |||
|
410 | assert @query.available_filters.keys.include?("assigned_to_role") | |||
|
411 | end | |||
|
412 | ||||
|
413 | should "be an optional list" do | |||
|
414 | assert_equal :list_optional, @query.available_filters["assigned_to_role"][:type] | |||
|
415 | end | |||
|
416 | ||||
|
417 | should "have a list of the Roles as values" do | |||
|
418 | assert @query.available_filters["assigned_to_role"][:values].include?(['Manager',1]) | |||
|
419 | assert @query.available_filters["assigned_to_role"][:values].include?(['Developer',2]) | |||
|
420 | assert @query.available_filters["assigned_to_role"][:values].include?(['Reporter',3]) | |||
|
421 | end | |||
|
422 | ||||
|
423 | should "not include the built in Roles as values" do | |||
|
424 | assert ! @query.available_filters["assigned_to_role"][:values].include?(['Non member',4]) | |||
|
425 | assert ! @query.available_filters["assigned_to_role"][:values].include?(['Anonymous',5]) | |||
|
426 | end | |||
|
427 | ||||
|
428 | end | |||
|
429 | ||||
408 | end |
|
430 | end | |
409 |
|
431 | |||
410 | context "#statement" do |
|
432 | context "#statement" do | |
@@ -453,6 +475,50 class QueryTest < ActiveSupport::TestCase | |||||
453 |
|
475 | |||
454 | end |
|
476 | end | |
455 | end |
|
477 | end | |
|
478 | ||||
|
479 | context "with 'assigned_to_role' filter" do | |||
|
480 | setup do | |||
|
481 | # No fixtures | |||
|
482 | MemberRole.delete_all | |||
|
483 | Member.delete_all | |||
|
484 | Role.delete_all | |||
|
485 | ||||
|
486 | @manager_role = Role.generate!(:name => 'Manager') | |||
|
487 | @developer_role = Role.generate!(:name => 'Developer') | |||
|
488 | ||||
|
489 | @project = Project.generate! | |||
|
490 | @manager = User.generate! | |||
|
491 | @developer = User.generate! | |||
|
492 | @boss = User.generate! | |||
|
493 | User.add_to_project(@manager, @project, @manager_role) | |||
|
494 | User.add_to_project(@developer, @project, @developer_role) | |||
|
495 | User.add_to_project(@boss, @project, [@manager_role, @developer_role]) | |||
|
496 | end | |||
|
497 | ||||
|
498 | should "search assigned to for users with the Role" do | |||
|
499 | @query = Query.new(:name => '_') | |||
|
500 | @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s]) | |||
|
501 | ||||
|
502 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@boss.id}')" | |||
|
503 | assert_find_issues_with_query_is_successful @query | |||
|
504 | end | |||
|
505 | ||||
|
506 | should "search assigned to for users not assigned to any Role (none)" do | |||
|
507 | @query = Query.new(:name => '_') | |||
|
508 | @query.add_filter('assigned_to_role', '!*', ['']) | |||
|
509 | ||||
|
510 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" | |||
|
511 | assert_find_issues_with_query_is_successful @query | |||
|
512 | end | |||
|
513 | ||||
|
514 | should "search assigned to for users assigned to any Role (all)" do | |||
|
515 | @query = Query.new(:name => '_') | |||
|
516 | @query.add_filter('assigned_to_role', '*', ['']) | |||
|
517 | ||||
|
518 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" | |||
|
519 | assert_find_issues_with_query_is_successful @query | |||
|
520 | end | |||
|
521 | end | |||
456 | end |
|
522 | end | |
457 |
|
523 | |||
458 | end |
|
524 | end |
General Comments 0
You need to be logged in to leave comments.
Login now