Feature #20081 » 0001-Filter-issues-after-project-status.patch
app/models/issue_query.rb | ||
---|---|---|
165 | 165 |
:values => lambda { subproject_values } |
166 | 166 |
end |
167 | 167 | |
168 |
add_available_filter("project.status", |
|
169 |
:type => :list, |
|
170 |
:name => l(:label_attribute_of_project, :name => l(:field_status)), |
|
171 |
:values => lambda { project_statuses_values } |
|
172 |
) if project.nil? || !project.leaf? |
|
173 | ||
168 | 174 |
add_custom_fields_filters(issue_custom_fields) |
169 | 175 |
add_associations_custom_fields_filters :project, :author, :assigned_to, :fixed_version |
170 | 176 | |
... | ... | |
577 | 583 |
"(#{sql})" |
578 | 584 |
end |
579 | 585 | |
586 |
def sql_for_project_status_field(field, operator, value, options={}) |
|
587 |
sql_for_field(field, operator, value, Project.table_name, "status") |
|
588 |
end |
|
589 | ||
580 | 590 |
def find_assigned_to_id_filter_values(values) |
581 | 591 |
Principal.visible.where(:id => values).map {|p| [p.name, p.id.to_s]} |
582 | 592 |
end |
app/models/project.rb | ||
---|---|---|
24 | 24 |
STATUS_CLOSED = 5 |
25 | 25 |
STATUS_ARCHIVED = 9 |
26 | 26 | |
27 |
LABEL_BY_STATUS = { |
|
28 |
1 => l(:project_status_active), |
|
29 |
5 => l(:project_status_closed), |
|
30 |
9 => l(:project_status_archived), |
|
31 |
} |
|
32 | ||
27 | 33 |
# Maximum length for project identifiers |
28 | 34 |
IDENTIFIER_MAX_LENGTH = 100 |
29 | 35 |
app/models/query.rb | ||
---|---|---|
579 | 579 |
end |
580 | 580 |
end |
581 | 581 | |
582 |
# Returns a scope of project statuses that are available as columns or filters |
|
583 |
def project_statuses_values |
|
584 |
project_statuses = Project::LABEL_BY_STATUS |
|
585 |
# Remove archived status from filters |
|
586 |
project_statuses.delete(9) |
|
587 |
project_statuses.stringify_keys.invert.to_a |
|
588 |
end |
|
589 | ||
582 | 590 |
# Adds available filters |
583 | 591 |
def initialize_available_filters |
584 | 592 |
# implemented by sub-classes |
test/functional/issues_controller_test.rb | ||
---|---|---|
264 | 264 |
assert_equal [3, 5], issues_in_list.map(&:project_id).uniq.sort |
265 | 265 |
end |
266 | 266 | |
267 |
def test_index_with_project_status_filter |
|
268 |
project = Project.find(2) |
|
269 |
project.close |
|
270 |
project.save |
|
271 | ||
272 |
get :index, :params => { |
|
273 |
:set_filter => 1, |
|
274 |
:f => ['project.status'], |
|
275 |
:op => {'project.status' => '='}, |
|
276 |
:v => {'project.status' => ['1']} |
|
277 |
} |
|
278 | ||
279 |
assert_response :success |
|
280 | ||
281 |
issues = issues_in_list.map(&:id).uniq.sort |
|
282 |
assert_include 1, issues |
|
283 |
assert_not_include 4, issues |
|
284 |
end |
|
285 | ||
267 | 286 |
def test_index_with_query |
268 | 287 |
get :index, :params => { |
269 | 288 |
:project_id => 1, |
test/helpers/queries_helper_test.rb | ||
---|---|---|
75 | 75 |
with_locale 'en' do |
76 | 76 |
options = filters_options_for_select(IssueQuery.new) |
77 | 77 |
assert_select_in options, 'optgroup[label=?]', 'Project', 1 |
78 |
assert_select_in options, 'optgroup[label=?] > option', 'Project', 2
|
|
78 |
assert_select_in options, 'optgroup[label=?] > option', 'Project', 3
|
|
79 | 79 |
assert_select_in options, 'optgroup > option[value=?]', "project.cf_#{cf1.id}", :text => "Project's Foo" |
80 | 80 |
end |
81 | 81 |
end |
test/unit/query_test.rb | ||
---|---|---|
2199 | 2199 | |
2200 | 2200 |
assert_equal ['1','2','3','4','5','6'], query.available_filters['status_id'][:values].map(&:second) |
2201 | 2201 |
end |
2202 | ||
2203 |
def test_project_status_filter_should_be_available_in_global_queries |
|
2204 |
query = IssueQuery.new(:project => nil, :name => '_') |
|
2205 |
assert query.available_filters.has_key?('project.status') |
|
2206 |
end |
|
2207 | ||
2208 |
def test_project_status_filter_should_be_available_when_project_has_subprojects |
|
2209 |
query = IssueQuery.new(:project => Project.find(1), :name => '_') |
|
2210 |
assert query.available_filters.has_key?('project.status') |
|
2211 |
end |
|
2212 | ||
2213 |
def test_project_status_filter_should_not_be_available_when_project_is_leaf |
|
2214 |
query = IssueQuery.new(:project => Project.find(2), :name => '_') |
|
2215 |
assert !query.available_filters.has_key?('project.status') |
|
2216 |
end |
|
2217 | ||
2218 |
def test_project_statuses_values_should_return_only_active_and_closed_statuses |
|
2219 |
query = IssueQuery.new(:project => nil, :name => '_') |
|
2220 |
project_status_filter = query.available_filters['project.status'] |
|
2221 |
assert_not_nil project_status_filter |
|
2222 | ||
2223 |
assert_equal [["active", "1"], ["closed", "5"]], project_status_filter[:values] |
|
2224 |
end |
|
2202 | 2225 |
end |