##// END OF EJS Templates
Fixed: Issue filter by assigned_to_role is not project specific (#9540)....
Jean-Philippe Lang -
r7727:e4cda67cf486
parent child
Show More
@@ -617,25 +617,22 class Query < ActiveRecord::Base
617 617 end
618 618
619 619 def sql_for_assigned_to_role_field(field, operator, value)
620 if operator == "*" # Any Role
621 roles = Role.givable
622 operator = '=' # Override the operator since we want to find by assigned_to
623 elsif operator == "!*" # No role
624 roles = Role.givable
625 operator = '!' # Override the operator since we want to find by assigned_to
626 else
627 roles = Role.givable.find_all_by_id(value)
620 case operator
621 when "*", "!*" # Member / Not member
622 sw = operator == "!*" ? 'NOT' : ''
623 nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
624 "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" +
625 " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))"
626 when "=", "!"
627 role_cond = value.any? ?
628 "#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" :
629 "1=0"
630
631 sw = operator == "!" ? 'NOT' : ''
632 nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : ''
633 "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" +
634 " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id AND #{Member.table_name}.id = #{MemberRole.table_name}.member_id AND #{role_cond}))"
628 635 end
629 roles ||= []
630
631 members_of_roles = roles.inject([]) {|user_ids, role|
632 if role && role.members
633 user_ids << role.members.collect(&:user_id)
634 end
635 user_ids.flatten.uniq.compact
636 }.sort.collect(&:to_s)
637
638 '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
639 636 end
640 637
641 638 private
@@ -62,6 +62,13 class QueryTest < ActiveSupport::TestCase
62 62 def assert_query_statement_includes(query, condition)
63 63 assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}"
64 64 end
65
66 def assert_query_result(expected, query)
67 assert_nothing_raised do
68 assert_equal expected.map(&:id).sort, query.issues.map(&:id).sort
69 assert_equal expected.size, query.issue_count
70 end
71 end
65 72
66 73 def test_query_should_allow_shared_versions_for_a_project_query
67 74 subproject_version = Version.find(4)
@@ -723,61 +730,77 class QueryTest < ActiveSupport::TestCase
723 730
724 731 context "with 'assigned_to_role' filter" do
725 732 setup do
726 # No fixtures
727 MemberRole.delete_all
728 Member.delete_all
729 Role.delete_all
730
731 @manager_role = Role.generate!(:name => 'Manager')
732 @developer_role = Role.generate!(:name => 'Developer')
733 @manager_role = Role.find_by_name('Manager')
734 @developer_role = Role.find_by_name('Developer')
733 735
734 736 @project = Project.generate!
735 737 @manager = User.generate!
736 738 @developer = User.generate!
737 739 @boss = User.generate!
740 @guest = User.generate!
738 741 User.add_to_project(@manager, @project, @manager_role)
739 742 User.add_to_project(@developer, @project, @developer_role)
740 743 User.add_to_project(@boss, @project, [@manager_role, @developer_role])
744
745 @issue1 = Issue.generate_for_project!(@project, :assigned_to_id => @manager.id)
746 @issue2 = Issue.generate_for_project!(@project, :assigned_to_id => @developer.id)
747 @issue3 = Issue.generate_for_project!(@project, :assigned_to_id => @boss.id)
748 @issue4 = Issue.generate_for_project!(@project, :assigned_to_id => @guest.id)
749 @issue5 = Issue.generate_for_project!(@project)
741 750 end
742 751
743 752 should "search assigned to for users with the Role" do
744 @query = Query.new(:name => '_')
753 @query = Query.new(:name => '_', :project => @project)
745 754 @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s])
746 755
747 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@boss.id}')"
748 assert_find_issues_with_query_is_successful @query
756 assert_query_result [@issue1, @issue3], @query
757 end
758
759 should "search assigned to for users with the Role on the issue project" do
760 other_project = Project.generate!
761 User.add_to_project(@developer, other_project, @manager_role)
762
763 @query = Query.new(:name => '_', :project => @project)
764 @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s])
765
766 assert_query_result [@issue1, @issue3], @query
767 end
768
769 should "return an empty set with empty role" do
770 @empty_role = Role.generate!
771 @query = Query.new(:name => '_', :project => @project)
772 @query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s])
773
774 assert_query_result [], @query
775 end
776
777 should "search assigned to for users without the Role" do
778 @query = Query.new(:name => '_', :project => @project)
779 @query.add_filter('assigned_to_role', '!', [@manager_role.id.to_s])
780
781 assert_query_result [@issue2, @issue4, @issue5], @query
749 782 end
750 783
751 784 should "search assigned to for users not assigned to any Role (none)" do
752 @query = Query.new(:name => '_')
785 @query = Query.new(:name => '_', :project => @project)
753 786 @query.add_filter('assigned_to_role', '!*', [''])
754 787
755 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}')"
756 assert_find_issues_with_query_is_successful @query
788 assert_query_result [@issue4, @issue5], @query
757 789 end
758 790
759 791 should "search assigned to for users assigned to any Role (all)" do
760 @query = Query.new(:name => '_')
792 @query = Query.new(:name => '_', :project => @project)
761 793 @query.add_filter('assigned_to_role', '*', [''])
762 794
763 assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')"
764 assert_find_issues_with_query_is_successful @query
765 end
766
767 should "return an empty set with empty role" do
768 @empty_role = Role.generate!
769 @query = Query.new(:name => '_')
770 @query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s])
771
772 assert_equal [], find_issues_with_query(@query)
795 assert_query_result [@issue1, @issue2, @issue3], @query
773 796 end
774 797
775 798 should "return issues with ! empty role" do
776 799 @empty_role = Role.generate!
777 @query = Query.new(:name => '_')
778 @query.add_filter('member_of_group', '!', [@empty_role.id.to_s])
800 @query = Query.new(:name => '_', :project => @project)
801 @query.add_filter('assigned_to_role', '!', [@empty_role.id.to_s])
779 802
780 assert_find_issues_with_query_is_successful @query
803 assert_query_result [@issue1, @issue2, @issue3, @issue4, @issue5], @query
781 804 end
782 805 end
783 806 end
General Comments 0
You need to be logged in to leave comments. Login now