summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Philippe Lang <jp_lang@yahoo.fr>2012-10-30 08:21:15 +0000
committerJean-Philippe Lang <jp_lang@yahoo.fr>2012-10-30 08:21:15 +0000
commitd62ef6b9b1dcc64ac80b6c79797d6b6ce33e50cc (patch)
tree645b409f80c5a00d2969483221698fa698173677
parentb9c72bf5901a7e8d570fea506cdb4180895c8d45 (diff)
downloadredmine-d62ef6b9b1dcc64ac80b6c79797d6b6ce33e50cc.tar.gz
redmine-d62ef6b9b1dcc64ac80b6c79797d6b6ce33e50cc.zip
Changes how relative date filters work and adds specific filters for filtering dates in past/next n days (#11426).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10768 e93f8b46-1217-0410-a6f0-8f06a7374b81
-rw-r--r--app/models/query.rb26
-rw-r--r--config/locales/en.yml2
-rw-r--r--config/locales/fr.yml2
-rw-r--r--public/javascripts/application.js2
-rw-r--r--test/unit/query_test.rb17
5 files changed, 44 insertions, 5 deletions
diff --git a/app/models/query.rb b/app/models/query.rb
index b5c932cfa..0f6ae3a1d 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -106,11 +106,13 @@ class Query < ActiveRecord::Base
"><" => :label_between,
"<t+" => :label_in_less_than,
">t+" => :label_in_more_than,
+ "><t+"=> :label_in_the_next_days,
"t+" => :label_in,
"t" => :label_today,
"w" => :label_this_week,
">t-" => :label_less_than_ago,
"<t-" => :label_more_than_ago,
+ "><t-"=> :label_in_the_past_days,
"t-" => :label_ago,
"~" => :label_contains,
"!~" => :label_not_contains,
@@ -124,8 +126,8 @@ class Query < ActiveRecord::Base
:list_status => [ "o", "=", "!", "c", "*" ],
:list_optional => [ "=", "!", "!*", "*" ],
:list_subprojects => [ "*", "!*", "=" ],
- :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "t+", "t", "w", ">t-", "<t-", "t-", "!*", "*" ],
- :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "t-", "t", "w", "!*", "*" ],
+ :date => [ "=", ">=", "<=", "><", "<t+", ">t+", "><t+", "t+", "t", "w", ">t-", "<t-", "><t-", "t-", "!*", "*" ],
+ :date_past => [ "=", ">=", "<=", "><", ">t-", "<t-", "><t-", "t-", "t", "w", "!*", "*" ],
:string => [ "=", "~", "!", "!~", "!*", "*" ],
:text => [ "~", "!~", "!*", "*" ],
:integer => [ "=", ">=", "<=", "><", "!*", "*" ],
@@ -183,7 +185,7 @@ class Query < ActiveRecord::Base
case operator_for(field)
when "=", ">=", "<=", "><"
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && (!v.match(/^\d{4}-\d{2}-\d{2}$/) || (Date.parse(v) rescue nil).nil?) }
- when ">t-", "<t-", "t-", ">t+", "<t+", "t+"
+ when ">t-", "<t-", "t-", ">t+", "<t+", "t+", "><t+", "><t-"
add_filter_error(field, :invalid) if values_for(field).detect {|v| v.present? && !v.match(/^\d+$/) }
end
end
@@ -936,21 +938,35 @@ class Query < ActiveRecord::Base
sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_false})" if field == "status_id"
when "c"
sql = "#{Issue.table_name}.status_id IN (SELECT id FROM #{IssueStatus.table_name} WHERE is_closed=#{connection.quoted_true})" if field == "status_id"
- when ">t-"
+ when "><t-"
+ # between today - n days and today
sql = relative_date_clause(db_table, db_field, - value.first.to_i, 0)
+ when ">t-"
+ # >= today - n days
+ sql = relative_date_clause(db_table, db_field, - value.first.to_i, nil)
when "<t-"
+ # <= today - n days
sql = relative_date_clause(db_table, db_field, nil, - value.first.to_i)
when "t-"
+ # = n days in past
sql = relative_date_clause(db_table, db_field, - value.first.to_i, - value.first.to_i)
+ when "><t+"
+ # between today and today + n days
+ sql = relative_date_clause(db_table, db_field, 0, value.first.to_i)
when ">t+"
+ # >= today + n days
sql = relative_date_clause(db_table, db_field, value.first.to_i, nil)
when "<t+"
- sql = relative_date_clause(db_table, db_field, 0, value.first.to_i)
+ # <= today + n days
+ sql = relative_date_clause(db_table, db_field, nil, value.first.to_i)
when "t+"
+ # = today + n days
sql = relative_date_clause(db_table, db_field, value.first.to_i, value.first.to_i)
when "t"
+ # = today
sql = relative_date_clause(db_table, db_field, 0, 0)
when "w"
+ # = this week
first_day_of_week = l(:general_first_day_of_week).to_i
day_of_week = Date.today.cwday
days_ago = (day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week)
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 23a9abd9f..29f6d2bb6 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -656,6 +656,8 @@ en:
label_not_equals: is not
label_in_less_than: in less than
label_in_more_than: in more than
+ label_in_the_next_days: in the next
+ label_in_the_past_days: in the past
label_greater_or_equal: '>='
label_less_or_equal: '<='
label_between: between
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index eff6caeed..ac697244c 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -649,6 +649,8 @@ fr:
label_not_equals: différent
label_in_less_than: dans moins de
label_in_more_than: dans plus de
+ label_in_the_next_days: dans les prochains jours
+ label_in_the_past_days: dans les derniers jours
label_in: dans
label_today: aujourd'hui
label_all_time: toute la période
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index 790aec895..1edff8829 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -252,9 +252,11 @@ function toggleOperator(field) {
break;
case "<t+":
case ">t+":
+ case "><t+":
case "t+":
case ">t-":
case "<t-":
+ case "><t-":
case "t-":
enableValues(field, [2]);
break;
diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb
index edf6e32ca..c6f506347 100644
--- a/test/unit/query_test.rb
+++ b/test/unit/query_test.rb
@@ -413,6 +413,14 @@ class QueryTest < ActiveSupport::TestCase
query.add_filter('due_date', '<t+', ['15'])
issues = find_issues_with_query(query)
assert !issues.empty?
+ issues.each {|issue| assert(issue.due_date <= (Date.today + 15))}
+ end
+
+ def test_operator_in_the_next_days
+ query = Query.new(:project => Project.find(1), :name => '_')
+ query.add_filter('due_date', '><t+', ['15'])
+ issues = find_issues_with_query(query)
+ assert !issues.empty?
issues.each {|issue| assert(issue.due_date >= Date.today && issue.due_date <= (Date.today + 15))}
end
@@ -422,6 +430,15 @@ class QueryTest < ActiveSupport::TestCase
query.add_filter('due_date', '>t-', ['3'])
issues = find_issues_with_query(query)
assert !issues.empty?
+ issues.each {|issue| assert(issue.due_date >= (Date.today - 3))}
+ end
+
+ def test_operator_in_the_past_days
+ Issue.find(7).update_attribute(:due_date, (Date.today - 3))
+ query = Query.new(:project => Project.find(1), :name => '_')
+ query.add_filter('due_date', '><t-', ['3'])
+ issues = find_issues_with_query(query)
+ assert !issues.empty?
issues.each {|issue| assert(issue.due_date >= (Date.today - 3) && issue.due_date <= Date.today)}
end