Feature #15773 » is_not_filter_for_subprojects.diff
| app/models/query.rb | ||
|---|---|---|
| 235 | 235 | :list => [ "=", "!" ], | 
| 236 | 236 | :list_status => [ "o", "=", "!", "c", "*" ], | 
| 237 | 237 | :list_optional => [ "=", "!", "!*", "*" ], | 
| 238 | :list_subprojects => [ "*", "!*", "=" ], | |
| 238 |     :list_subprojects => [ "*", "!*", "=", "!" ], | |
| 239 | 239 | :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", ">t-", "<t-", "><t-", "t-", "!*", "*" ], | 
| 240 | 240 | :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "!*", "*" ], | 
| 241 | 241 | :string => [ "=", "~", "!", "!~", "!*", "*" ], | 
| ... | ... | |
| 661 | 661 | |
| 662 | 662 | def project_statement | 
| 663 | 663 | project_clauses = [] | 
| 664 | if project && !project.descendants.active.empty? | |
| 664 | active_subprojects_ids = [] | |
| 665 | ||
| 666 | active_subprojects_ids = project.descendants.active.map(&:id) if project | |
| 667 | if active_subprojects_ids.any? | |
| 665 | 668 |       if has_filter?("subproject_id") | 
| 666 | 669 |         case operator_for("subproject_id") | 
| 667 | 670 | when '=' | 
| 668 | 671 | # include the selected subprojects | 
| 669 |           ids = [project.id] + values_for("subproject_id").each(&:to_i) | |
| 672 |           ids = [project.id] + values_for("subproject_id").map(&:to_i) | |
| 673 |           project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') | |
| 674 | when '!' | |
| 675 | # exclude the selected subprojects | |
| 676 |           ids = [project.id] + active_subprojects_ids - values_for("subproject_id").map(&:to_i) | |
| 670 | 677 |           project_clauses << "#{Project.table_name}.id IN (%s)" % ids.join(',') | 
| 671 | 678 | when '!*' | 
| 672 | 679 | # main project only | 
| test/unit/query_test.rb | ||
|---|---|---|
| 682 | 682 | Member.create!(:project_id => 1, :principal => other_group, :role_ids => [1]) | 
| 683 | 683 | User.current = user | 
| 684 | 684 | |
| 685 |     with_settings :issue_group_assignment => '1' do  | |
| 685 | with_settings :issue_group_assignment => '1' do | |
| 686 | 686 | i1 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => user) | 
| 687 | 687 | i2 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => group) | 
| 688 | 688 | i3 = Issue.generate!(:project_id => 1, :tracker_id => 1, :assigned_to => other_group) | 
| 689 |  | |
| 689 | ||
| 690 | 690 |       query = IssueQuery.new(:name => '_', :filters => { 'assigned_to_id' => {:operator => '=', :values => ['me']}}) | 
| 691 | 691 | result = query.issues | 
| 692 | 692 | assert_equal Issue.visible.where(:assigned_to_id => ([2] + user.reload.group_ids)).sort_by(&:id), result.sort_by(&:id) | 
| 693 |  | |
| 693 | ||
| 694 | 694 | assert result.include?(i1) | 
| 695 | 695 | assert result.include?(i2) | 
| 696 | 696 | assert !result.include?(i3) | 
| ... | ... | |
| 1810 | 1810 | ActiveRecord::Base.default_timezone = :local # restore Redmine default | 
| 1811 | 1811 | end | 
| 1812 | 1812 | |
| 1813 | def test_filter_on_subprojects | |
| 1814 | query = IssueQuery.new(:name => '_', :project => Project.find(1)) | |
| 1815 | filter_name = "subproject_id" | |
| 1816 | assert_include filter_name, query.available_filters.keys | |
| 1817 | ||
| 1818 | # "is" operator should include issues of parent project + issues of the selected subproject | |
| 1819 |     query.filters = {filter_name => {:operator => '=', :values => ['3']}} | |
| 1820 | issues = find_issues_with_query(query) | |
| 1821 | assert_equal [1, 2, 3, 5, 7, 8, 11, 12, 13, 14], issues.map(&:id).sort | |
| 1822 | ||
| 1823 | # "is not" operator should include issues of parent project + issues of all active subprojects - issues of the selected subprojects | |
| 1824 | query = IssueQuery.new(:name => '_', :project => Project.find(1)) | |
| 1825 |     query.filters = {filter_name => {:operator => '!', :values => ['3']}} | |
| 1826 | issues = find_issues_with_query(query) | |
| 1827 | assert_equal [1, 2, 3, 6, 7, 8, 9, 10, 11, 12], issues.map(&:id).sort | |
| 1828 | end | |
| 1829 | ||
| 1813 | 1830 | end |