diff --git a/app/models/query.rb b/app/models/query.rb index 1aa09d2a2e..d94f980e92 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -281,7 +281,10 @@ class Query < ActiveRecord::Base "=!p" => :label_any_issues_not_in_project, "!p" => :label_no_issues_in_project, "*o" => :label_any_open_issues, - "!o" => :label_no_open_issues + "!o" => :label_no_open_issues, + "nd" => :label_tomorrow, + "nw" => :label_next_week, + "nm" => :label_next_month } class_attribute :operators_by_filter_type @@ -290,7 +293,7 @@ class Query < ActiveRecord::Base :list_status => [ "o", "=", "!", "c", "*" ], :list_optional => [ "=", "!", "!*", "*" ], :list_subprojects => [ "*", "!*", "=", "!" ], - :date => [ "=", ">=", "<=", "><", "t+", ">t-", " [ "=", ">=", "<=", "><", "t+", ">t-", " [ "=", ">=", "<=", "><", ">t-", " [ "~", "=", "!~", "!", "!*", "*" ], :text => [ "~", "!~", "!*", "*" ], @@ -453,7 +456,7 @@ class Query < ActiveRecord::Base # filter requires one or more values (values_for(field) and !values_for(field).first.blank?) or # filter doesn't require any value - ["o", "c", "!*", "*", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "*o", "!o"].include? operator_for(field) + ["o", "c", "!*", "*", "t", "ld", "w", "lw", "l2w", "m", "lm", "y", "*o", "!o", "nd", "nw", "nm"].include? operator_for(field) end if filters end @@ -1207,6 +1210,9 @@ class Query < ActiveRecord::Base when "ld" # = yesterday sql = relative_date_clause(db_table, db_field, -1, -1, is_custom_filter) + when "nd" + # = tomorrow + sql = relative_date_clause(db_table, db_field, 1, 1, is_custom_filter) when "w" # = this week first_day_of_week = l(:general_first_day_of_week).to_i @@ -1225,6 +1231,12 @@ class Query < ActiveRecord::Base day_of_week = User.current.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) sql = relative_date_clause(db_table, db_field, - days_ago - 14, - days_ago - 1, is_custom_filter) + when "nw" + # = next week + first_day_of_week = l(:general_first_day_of_week).to_i + day_of_week = User.current.today.cwday + from = -(day_of_week >= first_day_of_week ? day_of_week - first_day_of_week : day_of_week + 7 - first_day_of_week) + 7 + sql = relative_date_clause(db_table, db_field, from, from + 6, is_custom_filter) when "m" # = this month date = User.current.today @@ -1233,6 +1245,10 @@ class Query < ActiveRecord::Base # = last month date = User.current.today.prev_month sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) + when "nm" + # = next month + date = User.current.today.next_month + sql = date_clause(db_table, db_field, date.beginning_of_month, date.end_of_month, is_custom_filter) when "y" # = this year date = User.current.today diff --git a/config/locales/en.yml b/config/locales/en.yml index cdc79640bc..fa2ff56f22 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -743,12 +743,15 @@ en: label_today: today label_all_time: all time label_yesterday: yesterday + label_tomorrow: tomorrow label_this_week: this week label_last_week: last week + label_next_week: next week label_last_n_weeks: "last %{count} weeks" label_last_n_days: "last %{count} days" label_this_month: this month label_last_month: last month + label_next_month: next month label_this_year: this year label_date_range: Date range label_less_than_ago: less than days ago diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 75848dd2cc..2e85d254f2 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -301,6 +301,9 @@ function toggleOperator(field) { case "c": case "*o": case "!o": + case "nd": + case "nw": + case "nm": enableValues(field, []); break; case "><": diff --git a/test/unit/query_test.rb b/test/unit/query_test.rb index e868ef4568..2a68ee9181 100644 --- a/test/unit/query_test.rb +++ b/test/unit/query_test.rb @@ -638,8 +638,16 @@ class QueryTest < ActiveSupport::TestCase issues.each {|issue| assert_equal Date.today, issue.due_date} end + def test_operator_tomorrow + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nd', ['']) + issues = find_issues_with_query(query) + assert !issues.empty? + issues.each {|issue| assert_equal Date.today.tomorrow, issue.due_date} + end + def test_operator_date_periods - %w(t ld w lw l2w m lm y).each do |operator| + %w(t ld w lw l2w m lm y nd nw nm).each do |operator| query = IssueQuery.new(:name => '_') query.add_filter('due_date', operator, ['']) assert query.valid? @@ -648,7 +656,7 @@ class QueryTest < ActiveSupport::TestCase end def test_operator_datetime_periods - %w(t ld w lw l2w m lm y).each do |operator| + %w(t ld w lw l2w m lm y nd nw nm).each do |operator| query = IssueQuery.new(:name => '_') query.add_filter('created_on', operator, ['']) assert query.valid? @@ -710,6 +718,40 @@ class QueryTest < ActiveSupport::TestCase query.statement end + def test_range_for_next_week_with_week_starting_on_monday + I18n.locale = :fr + assert_equal '1', I18n.t(:general_first_day_of_week) + + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nw', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-05-01"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-08"} 23:59:59(\.\d+)?/, + query.statement + I18n.locale = :en + end + + def test_range_for_next_week_with_week_starting_on_sunday + I18n.locale = :en + assert_equal '7', I18n.t(:general_first_day_of_week) + + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nw', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-07"} 23:59:59(\.\d+)?/, + query.statement + end + + def test_range_for_next_month + Date.stubs(:today).returns(Date.parse('2011-04-29')) # Friday + + query = IssueQuery.new(:project => Project.find(1), :name => '_') + query.add_filter('due_date', 'nm', ['']) + assert_match /issues\.due_date > '#{quoted_date "2011-04-30"} 23:59:59(\.\d+)?' AND issues\.due_date <= '#{quoted_date "2011-05-31"} 23:59:59(\.\d+)?/, + query.statement + end + def test_filter_assigned_to_me user = User.find(2) group = Group.find(10)