mirror of
https://github.com/redmine/redmine.git
synced 2025-11-15 09:46:02 +01:00
Add the possibility to filter issues after Target Version's Status and Due Date (#23215).
Patch by Marius BALTEANU. git-svn-id: http://svn.redmine.org/redmine/trunk@15881 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -153,6 +153,15 @@ class IssueQuery < Query
|
|||||||
:type => :list_optional,
|
:type => :list_optional,
|
||||||
:values => Version.sort_by_status(versions).collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s, l("version_status_#{s.status}")] }
|
:values => Version.sort_by_status(versions).collect{|s| ["#{s.project.name} - #{s.name}", s.id.to_s, l("version_status_#{s.status}")] }
|
||||||
|
|
||||||
|
add_available_filter "fixed_version.due_date",
|
||||||
|
:type => :date,
|
||||||
|
:name => l(:label_attribute_of_fixed_version, :name => l(:field_effective_date))
|
||||||
|
|
||||||
|
add_available_filter "fixed_version.status",
|
||||||
|
:type => :list,
|
||||||
|
:name => l(:label_attribute_of_fixed_version, :name => l(:field_status)),
|
||||||
|
:values => Version::VERSION_STATUSES.map{|t| [t, t] }
|
||||||
|
|
||||||
add_available_filter "category_id",
|
add_available_filter "category_id",
|
||||||
:type => :list_optional,
|
:type => :list_optional,
|
||||||
:values => categories.collect{|s| [s.name, s.id.to_s] }
|
:values => categories.collect{|s| [s.name, s.id.to_s] }
|
||||||
@@ -417,6 +426,22 @@ class IssueQuery < Query
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def sql_for_fixed_version_status_field(field, operator, value)
|
||||||
|
where = sql_for_field(field, operator, value, Version.table_name, "status")
|
||||||
|
version_ids = versions(:conditions => [where]).map(&:id)
|
||||||
|
|
||||||
|
nl = operator == "!" ? "#{Issue.table_name}.fixed_version_id IS NULL OR" : ''
|
||||||
|
"(#{nl} #{sql_for_field("fixed_version_id", "=", version_ids, Issue.table_name, "fixed_version_id")})"
|
||||||
|
end
|
||||||
|
|
||||||
|
def sql_for_fixed_version_due_date_field(field, operator, value)
|
||||||
|
where = sql_for_field(field, operator, value, Version.table_name, "effective_date")
|
||||||
|
version_ids = versions(:conditions => [where]).map(&:id)
|
||||||
|
|
||||||
|
nl = operator == "!*" ? "#{Issue.table_name}.fixed_version_id IS NULL OR" : ''
|
||||||
|
"(#{nl} #{sql_for_field("fixed_version_id", "=", version_ids, Issue.table_name, "fixed_version_id")})"
|
||||||
|
end
|
||||||
|
|
||||||
def sql_for_is_private_field(field, operator, value)
|
def sql_for_is_private_field(field, operator, value)
|
||||||
op = (operator == "=" ? 'IN' : 'NOT IN')
|
op = (operator == "=" ? 'IN' : 'NOT IN')
|
||||||
va = value.map {|v| v == '0' ? self.class.connection.quoted_false : self.class.connection.quoted_true}.uniq.join(',')
|
va = value.map {|v| v == '0' ? self.class.connection.quoted_false : self.class.connection.quoted_true}.uniq.join(',')
|
||||||
|
|||||||
@@ -819,6 +819,36 @@ class QueryTest < ActiveSupport::TestCase
|
|||||||
assert_equal [2], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort
|
assert_equal [2], find_issues_with_query(query).map(&:fixed_version_id).uniq.sort
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_filter_on_fixed_version_due_date
|
||||||
|
query = IssueQuery.new(:name => '_')
|
||||||
|
filter_name = "fixed_version.due_date"
|
||||||
|
assert_include filter_name, query.available_filters.keys
|
||||||
|
query.filters = {filter_name => {:operator => '=', :values => [20.day.from_now.to_date.to_s(:db)]}}
|
||||||
|
issues = find_issues_with_query(query)
|
||||||
|
assert_equal [2], issues.map(&:fixed_version_id).uniq.sort
|
||||||
|
assert_equal [2, 12], issues.map(&:id).sort
|
||||||
|
|
||||||
|
query = IssueQuery.new(:name => '_')
|
||||||
|
query.filters = {filter_name => {:operator => '>=', :values => [21.day.from_now.to_date.to_s(:db)]}}
|
||||||
|
assert_equal 0, find_issues_with_query(query).size
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_filter_on_fixed_version_status
|
||||||
|
query = IssueQuery.new(:name => '_')
|
||||||
|
filter_name = "fixed_version.status"
|
||||||
|
assert_include filter_name, query.available_filters.keys
|
||||||
|
query.filters = {filter_name => {:operator => '=', :values => ['closed']}}
|
||||||
|
issues = find_issues_with_query(query)
|
||||||
|
|
||||||
|
assert_equal [1], issues.map(&:fixed_version_id).sort
|
||||||
|
assert_equal [11], issues.map(&:id).sort
|
||||||
|
|
||||||
|
# "is not" operator should include issues without target version
|
||||||
|
query = IssueQuery.new(:name => '_')
|
||||||
|
query.filters = {filter_name => {:operator => '!', :values => ['open', 'closed', 'locked']}, "project_id" => {:operator => '=', :values => [1]}}
|
||||||
|
assert_equal [1, 3, 7, 8], find_issues_with_query(query).map(&:id).uniq.sort
|
||||||
|
end
|
||||||
|
|
||||||
def test_filter_on_relations_with_a_specific_issue
|
def test_filter_on_relations_with_a_specific_issue
|
||||||
IssueRelation.delete_all
|
IssueRelation.delete_all
|
||||||
IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(2))
|
IssueRelation.create!(:relation_type => "relates", :issue_from => Issue.find(1), :issue_to => Issue.find(2))
|
||||||
@@ -951,7 +981,7 @@ class QueryTest < ActiveSupport::TestCase
|
|||||||
def test_filter_on_parent
|
def test_filter_on_parent
|
||||||
Issue.delete_all
|
Issue.delete_all
|
||||||
parent = Issue.generate_with_descendants!
|
parent = Issue.generate_with_descendants!
|
||||||
|
|
||||||
|
|
||||||
query = IssueQuery.new(:name => '_')
|
query = IssueQuery.new(:name => '_')
|
||||||
query.filters = {"parent_id" => {:operator => '=', :values => [parent.id.to_s]}}
|
query.filters = {"parent_id" => {:operator => '=', :values => [parent.id.to_s]}}
|
||||||
@@ -981,7 +1011,7 @@ class QueryTest < ActiveSupport::TestCase
|
|||||||
parent = Issue.generate_with_descendants!
|
parent = Issue.generate_with_descendants!
|
||||||
child, leaf = parent.children.sort_by(&:id)
|
child, leaf = parent.children.sort_by(&:id)
|
||||||
grandchild = child.children.first
|
grandchild = child.children.first
|
||||||
|
|
||||||
|
|
||||||
query = IssueQuery.new(:name => '_')
|
query = IssueQuery.new(:name => '_')
|
||||||
query.filters = {"child_id" => {:operator => '=', :values => [grandchild.id.to_s]}}
|
query.filters = {"child_id" => {:operator => '=', :values => [grandchild.id.to_s]}}
|
||||||
|
|||||||
Reference in New Issue
Block a user