From bc945d78a62507b61480f6520903b9115783cc40 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 27 May 2012 19:39:26 +0000 Subject: [PATCH] Merged r9719, r9726, r9727 from trunk. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/2.0-stable@9729 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/activities_controller.rb | 2 +- app/helpers/application_helper.rb | 4 +- app/models/query.rb | 14 +++++-- app/models/user.rb | 9 +++++ app/models/wiki_page.rb | 2 +- config/application.rb | 1 + test/fixtures/issues.yml | 48 ++++++++++++------------ test/unit/user_test.rb | 33 +++++++++++++++- 8 files changed, 80 insertions(+), 33 deletions(-) diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb index 6838b73c7..aba96d764 100644 --- a/app/controllers/activities_controller.rb +++ b/app/controllers/activities_controller.rb @@ -43,7 +43,7 @@ class ActivitiesController < ApplicationController if events.empty? || stale?(:etag => [@activity.scope, @date_to, @date_from, @with_subprojects, @author, events.first, User.current, current_language]) respond_to do |format| format.html { - @events_by_day = events.group_by(&:event_date) + @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)} render :layout => false if request.xhr? } format.atom { diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a84d4a9a1..794cc6f54 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -178,7 +178,7 @@ module ApplicationHelper end def format_activity_day(date) - date == Date.today ? l(:label_today).titleize : format_date(date) + date == User.current.today ? l(:label_today).titleize : format_date(date) end def format_activity_description(text) @@ -352,7 +352,7 @@ module ApplicationHelper def time_tag(time) text = distance_of_time_in_words(Time.now, time) if @project - link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => time.to_date}, :title => format_time(time)) + link_to(text, {:controller => 'activities', :action => 'index', :id => @project, :from => User.current.time_to_date(time)}, :title => format_time(time)) else content_tag('acronym', text, :title => format_time(time)) end diff --git a/app/models/query.rb b/app/models/query.rb index 9e2254f60..b66b091f7 100644 --- a/app/models/query.rb +++ b/app/models/query.rb @@ -848,12 +848,18 @@ class Query < ActiveRecord::Base s = [] if from from_yesterday = from - 1 - from_yesterday_utc = Time.gm(from_yesterday.year, from_yesterday.month, from_yesterday.day) - s << ("#{table}.#{field} > '%s'" % [connection.quoted_date(from_yesterday_utc.end_of_day)]) + from_yesterday_time = Time.local(from_yesterday.year, from_yesterday.month, from_yesterday.day) + if self.class.default_timezone == :utc + from_yesterday_time = from_yesterday_time.utc + end + s << ("#{table}.#{field} > '%s'" % [connection.quoted_date(from_yesterday_time.end_of_day)]) end if to - to_utc = Time.gm(to.year, to.month, to.day) - s << ("#{table}.#{field} <= '%s'" % [connection.quoted_date(to_utc.end_of_day)]) + to_time = Time.local(to.year, to.month, to.day) + if self.class.default_timezone == :utc + to_time = to_time.utc + end + s << ("#{table}.#{field} <= '%s'" % [connection.quoted_date(to_time.end_of_day)]) end s.join(' AND ') end diff --git a/app/models/user.rb b/app/models/user.rb index e59c752b2..904420315 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -370,6 +370,15 @@ class User < Principal end end + # Returns the day of +time+ according to user's time zone + def time_to_date(time) + if time_zone.nil? + time.to_date + else + time.in_time_zone(time_zone).to_date + end + end + def logged? true end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index a216a014f..2f7803f2a 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -143,7 +143,7 @@ class WikiPage < ActiveRecord::Base if time = read_attribute(:updated_on) # content updated_on was eager loaded with the page begin - @updated_on = Time.zone ? Time.zone.parse(time.to_s) : Time.parse(time.to_s) + @updated_on = (self.class.default_timezone == :utc ? Time.parse(time.to_s).utc : Time.parse(time.to_s).localtime) rescue end else diff --git a/config/application.rb b/config/application.rb index 1397b7721..1e9234dc4 100644 --- a/config/application.rb +++ b/config/application.rb @@ -26,6 +26,7 @@ module RedmineApp config.active_record.observers = :message_observer, :issue_observer, :journal_observer, :news_observer, :document_observer, :wiki_content_observer, :comment_observer config.active_record.store_full_sti_class = true + config.active_record.default_timezone = :local # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. diff --git a/test/fixtures/issues.yml b/test/fixtures/issues.yml index 5d8687bca..531089de0 100644 --- a/test/fixtures/issues.yml +++ b/test/fixtures/issues.yml @@ -1,8 +1,8 @@ --- issues_001: - created_on: <%= 3.days.ago.to_date.to_s(:db) %> + created_on: <%= 3.days.ago.to_s(:db) %> project_id: 1 - updated_on: <%= 1.day.ago.to_date.to_s(:db) %> + updated_on: <%= 1.day.ago.to_s(:db) %> priority_id: 4 subject: Can't print recipes id: 1 @@ -60,9 +60,9 @@ issues_003: lft: 1 rgt: 2 issues_004: - created_on: <%= 5.days.ago.to_date.to_s(:db) %> + created_on: <%= 5.days.ago.to_s(:db) %> project_id: 2 - updated_on: <%= 2.days.ago.to_date.to_s(:db) %> + updated_on: <%= 2.days.ago.to_s(:db) %> priority_id: 4 subject: Issue on project 2 id: 4 @@ -77,9 +77,9 @@ issues_004: lft: 1 rgt: 2 issues_005: - created_on: <%= 5.days.ago.to_date.to_s(:db) %> + created_on: <%= 5.days.ago.to_s(:db) %> project_id: 3 - updated_on: <%= 2.days.ago.to_date.to_s(:db) %> + updated_on: <%= 2.days.ago.to_s(:db) %> priority_id: 4 subject: Subproject issue id: 5 @@ -94,9 +94,9 @@ issues_005: lft: 1 rgt: 2 issues_006: - created_on: <%= 1.minute.ago.to_date.to_s(:db) %> + created_on: <%= 1.minute.ago.to_s(:db) %> project_id: 5 - updated_on: <%= 1.minute.ago.to_date.to_s(:db) %> + updated_on: <%= 1.minute.ago.to_s(:db) %> priority_id: 4 subject: Issue of a private subproject id: 6 @@ -113,9 +113,9 @@ issues_006: lft: 1 rgt: 2 issues_007: - created_on: <%= 10.days.ago.to_date.to_s(:db) %> + created_on: <%= 10.days.ago.to_s(:db) %> project_id: 1 - updated_on: <%= 10.days.ago.to_date.to_s(:db) %> + updated_on: <%= 10.days.ago.to_s(:db) %> priority_id: 5 subject: Issue due today id: 7 @@ -133,9 +133,9 @@ issues_007: lft: 1 rgt: 2 issues_008: - created_on: <%= 10.days.ago.to_date.to_s(:db) %> + created_on: <%= 10.days.ago.to_s(:db) %> project_id: 1 - updated_on: <%= 10.days.ago.to_date.to_s(:db) %> + updated_on: <%= 10.days.ago.to_s(:db) %> priority_id: 5 subject: Closed issue id: 8 @@ -153,9 +153,9 @@ issues_008: lft: 1 rgt: 2 issues_009: - created_on: <%= 1.minute.ago.to_date.to_s(:db) %> + created_on: <%= 1.minute.ago.to_s(:db) %> project_id: 5 - updated_on: <%= 1.minute.ago.to_date.to_s(:db) %> + updated_on: <%= 1.minute.ago.to_s(:db) %> priority_id: 5 subject: Blocked Issue id: 9 @@ -172,9 +172,9 @@ issues_009: lft: 1 rgt: 2 issues_010: - created_on: <%= 1.minute.ago.to_date.to_s(:db) %> + created_on: <%= 1.minute.ago.to_s(:db) %> project_id: 5 - updated_on: <%= 1.minute.ago.to_date.to_s(:db) %> + updated_on: <%= 1.minute.ago.to_s(:db) %> priority_id: 5 subject: Issue Doing the Blocking id: 10 @@ -191,9 +191,9 @@ issues_010: lft: 1 rgt: 2 issues_011: - created_on: <%= 3.days.ago.to_date.to_s(:db) %> + created_on: <%= 3.days.ago.to_s(:db) %> project_id: 1 - updated_on: <%= 1.day.ago.to_date.to_s(:db) %> + updated_on: <%= 1.day.ago.to_s(:db) %> priority_id: 5 subject: Closed issue on a closed version id: 11 @@ -210,9 +210,9 @@ issues_011: lft: 1 rgt: 2 issues_012: - created_on: <%= 3.days.ago.to_date.to_s(:db) %> + created_on: <%= 3.days.ago.to_s(:db) %> project_id: 1 - updated_on: <%= 1.day.ago.to_date.to_s(:db) %> + updated_on: <%= 1.day.ago.to_s(:db) %> priority_id: 5 subject: Closed issue on a locked version id: 12 @@ -229,9 +229,9 @@ issues_012: lft: 1 rgt: 2 issues_013: - created_on: <%= 5.days.ago.to_date.to_s(:db) %> + created_on: <%= 5.days.ago.to_s(:db) %> project_id: 3 - updated_on: <%= 2.days.ago.to_date.to_s(:db) %> + updated_on: <%= 2.days.ago.to_s(:db) %> priority_id: 4 subject: Subproject issue two id: 13 @@ -247,9 +247,9 @@ issues_013: rgt: 2 issues_014: id: 14 - created_on: <%= 15.days.ago.to_date.to_s(:db) %> + created_on: <%= 15.days.ago.to_s(:db) %> project_id: 3 - updated_on: <%= 15.days.ago.to_date.to_s(:db) %> + updated_on: <%= 15.days.ago.to_s(:db) %> priority_id: 5 subject: Private issue on public project fixed_version_id: diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 2b658a1dc..2ff55f9f3 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -424,7 +424,38 @@ class UserTest < ActiveSupport::TestCase assert_equal 'jsmith', @jsmith.reload.name end end - + + def test_today_should_return_the_day_according_to_user_time_zone + preference = User.find(1).pref + date = Date.new(2012, 05, 15) + time = Time.gm(2012, 05, 15, 23, 30).utc # 2012-05-15 23:30 UTC + Date.stubs(:today).returns(date) + Time.stubs(:now).returns(time) + + preference.update_attribute :time_zone, 'Baku' # UTC+4 + assert_equal '2012-05-16', User.find(1).today.to_s + + preference.update_attribute :time_zone, 'La Paz' # UTC-4 + assert_equal '2012-05-15', User.find(1).today.to_s + + preference.update_attribute :time_zone, '' + assert_equal '2012-05-15', User.find(1).today.to_s + end + + def test_time_to_date_should_return_the_date_according_to_user_time_zone + preference = User.find(1).pref + time = Time.gm(2012, 05, 15, 23, 30).utc # 2012-05-15 23:30 UTC + + preference.update_attribute :time_zone, 'Baku' # UTC+4 + assert_equal '2012-05-16', User.find(1).time_to_date(time).to_s + + preference.update_attribute :time_zone, 'La Paz' # UTC-4 + assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s + + preference.update_attribute :time_zone, '' + assert_equal '2012-05-15', User.find(1).time_to_date(time).to_s + end + def test_fields_for_order_statement_should_return_fields_according_user_format_setting with_settings :user_format => 'lastname_coma_firstname' do assert_equal ['users.lastname', 'users.firstname', 'users.id'], User.fields_for_order_statement