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 |