]> source.dussan.org Git - redmine.git/commitdiff
Changes how relative date filters work and adds specific filters for filtering dates...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 30 Oct 2012 08:21:15 +0000 (08:21 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Tue, 30 Oct 2012 08:21:15 +0000 (08:21 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@10768 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/query.rb
config/locales/en.yml
config/locales/fr.yml
public/javascripts/application.js
test/unit/query_test.rb

index b5c932cfadf3c3df51c6348d72879086ca5334f9..0f6ae3a1dc72b21c2ade786a4135cf7c85a3e967 100644 (file)
@@ -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)
index 23a9abd9f466c6704183286a12352e1669fdbdb5..29f6d2bb66dc2ad60eec1192e23ef67b5070bb01 100644 (file)
@@ -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
index eff6caeeddc4e057530154447fab23228c18425b..ac697244cee719cf07fee0485579f7ef524492e3 100644 (file)
@@ -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
index 790aec8957f46c8e7a98f4543f137b0c09e234dd..1edff88295e58222184871d39801a967a7ea0b76 100644 (file)
@@ -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;
index edf6e32ca5bc355480f435cfd932bdbda88869ad..c6f506347e805d59f77fa38d6e440ef528914510 100644 (file)
@@ -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