diff options
author | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-10-30 08:21:15 +0000 |
---|---|---|
committer | Jean-Philippe Lang <jp_lang@yahoo.fr> | 2012-10-30 08:21:15 +0000 |
commit | d62ef6b9b1dcc64ac80b6c79797d6b6ce33e50cc (patch) | |
tree | 645b409f80c5a00d2969483221698fa698173677 | |
parent | b9c72bf5901a7e8d570fea506cdb4180895c8d45 (diff) | |
download | redmine-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.rb | 26 | ||||
-rw-r--r-- | config/locales/en.yml | 2 | ||||
-rw-r--r-- | config/locales/fr.yml | 2 | ||||
-rw-r--r-- | public/javascripts/application.js | 2 | ||||
-rw-r--r-- | test/unit/query_test.rb | 17 |
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 |