##// 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 "#{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 end
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 end
636 end
640
637
641 private
638 private
@@ -62,6 +62,13 class QueryTest < ActiveSupport::TestCase
62 def assert_query_statement_includes(query, condition)
62 def assert_query_statement_includes(query, condition)
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
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 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)
@@ -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
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 end
782 end
750
783
751 should "search assigned to for users not assigned to any Role (none)" do
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 @query.add_filter('assigned_to_role', '!*', [''])
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}')"
788 assert_query_result [@issue4, @issue5], @query
756 assert_find_issues_with_query_is_successful @query
757 end
789 end
758
790
759 should "search assigned to for users assigned to any Role (all)" do
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 @query.add_filter('assigned_to_role', '*', [''])
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}')"
795 assert_query_result [@issue1, @issue2, @issue3], @query
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)
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