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