From 778427405a23dc0c891d8e4ec8fe834854631488 Mon Sep 17 00:00:00 2001 From: Eric Allen Date: Sat, 13 Sep 2008 13:33:48 -0700 Subject: [PATCH] Changed all Date objects to Datetimes and migrated everything appropriately. Tests & specs pass, but this still needs a thorough review. --- app/models/todo.rb | 2 ++ app/models/user.rb | 6 ++++- db/migrate/041_change_dates_to_datetimes.rb | 28 +++++++++++++++++++++ test/functional/projects_controller_test.rb | 2 +- test/functional/todos_controller_test.rb | 4 +-- test/test_helper.rb | 2 +- test/unit/project_test.rb | 2 +- test/unit/todo_create_params_helper_test.rb | 4 +-- test/unit/todo_test.rb | 5 ++-- test/unit/user_test.rb | 2 +- test/views/todos_helper_test.rb | 8 +++--- 11 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 db/migrate/041_change_dates_to_datetimes.rb diff --git a/app/models/todo.rb b/app/models/todo.rb index 7a6f3892..6f70e664 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -68,6 +68,8 @@ class Todo < ActiveRecord::Base end def show_from=(date) + # parse Date objects into the proper timezone + date = user.at_midnight(date) if (date.is_a? Date) activate! if deferred? && date.blank? defer! if active? && !date.blank? && date > user.date self[:show_from] = date diff --git a/app/models/user.rb b/app/models/user.rb index 9a61d87b..fbbdbd09 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -169,7 +169,11 @@ class User < ActiveRecord::Base end def date - time.to_date + time.midnight + end + + def at_midnight(date) + return TimeZone[prefs.time_zone].local(date.year, date.month, date.day, 0, 0, 0) end def generate_token diff --git a/db/migrate/041_change_dates_to_datetimes.rb b/db/migrate/041_change_dates_to_datetimes.rb new file mode 100644 index 00000000..5dfff20a --- /dev/null +++ b/db/migrate/041_change_dates_to_datetimes.rb @@ -0,0 +1,28 @@ +class ChangeDatesToDatetimes < ActiveRecord::Migration + def self.up + change_column :todos, :show_from, :datetime + change_column :todos, :due, :datetime + change_column :recurring_todos, :start_from, :datetime + change_column :recurring_todos, :end_date, :datetime + + User.all(:include => [:todos, :recurring_todos]).each do |user| + zone = TimeZone[user.prefs.time_zone] + user.todos.each do |todo| + todo.update_attribute(:show_from, user.at_midnight(todo.show_from)) unless d.nil? + todo.update_attribute(:due, user.at_midnight(todo.due)) unless d.nil? + end + + user.recurring_todos.each do |todo| + todo.update_attribute(:start_from, user.at_midnight(todo.start_from)) unless d.nil? + todo.update_attribute(:end_date, user.at_midnight(todo.end_date)) unless d.nil? + end + end + end + + def self.down + change_column :todos, :show_from, :date + change_column :todos, :due, :date + change_column :recurring_todos, :start_from, :date + change_column :recurring_todos, :end_date, :date + end +end diff --git a/test/functional/projects_controller_test.rb b/test/functional/projects_controller_test.rb index 4644b9f3..f97a892a 100644 --- a/test/functional/projects_controller_test.rb +++ b/test/functional/projects_controller_test.rb @@ -25,7 +25,7 @@ class ProjectsControllerTest < TodoContainerControllerTestBase assert_equal 1, assigns['deferred'].size t = p.not_done_todos[0] - t.show_from = 1.days.from_now.utc.to_date + t.show_from = 1.days.from_now.utc t.save! get :show, :id => p.to_param diff --git a/test/functional/todos_controller_test.rb b/test/functional/todos_controller_test.rb index 5f353082..2adf747b 100644 --- a/test/functional/todos_controller_test.rb +++ b/test/functional/todos_controller_test.rb @@ -137,7 +137,7 @@ class TodosControllerTest < Test::Rails::TestCase assert_equal "Call Warren Buffet to find out how much he makes per day", t.description assert_equal "foo, bar", t.tag_list expected = Date.new(2006,11,30) - actual = t.due + actual = t.due.to_date assert_equal expected, actual, "Expected #{expected.to_s(:db)}, was #{actual.to_s(:db)}" end @@ -328,7 +328,7 @@ class TodosControllerTest < Test::Rails::TestCase assert t.active? assert_equal 'test notes', t.notes assert_nil t.show_from - assert_equal Date.new(2007,1,2).to_s, t.due.to_s + assert_equal Date.new(2007,1,2), t.due.to_date end def test_mobile_create_action_redirects_to_mobile_home_page_when_successful diff --git a/test/test_helper.rb b/test/test_helper.rb index 85392073..c34d707f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -71,7 +71,7 @@ class Test::Rails::TestCase < Test::Unit::TestCase end def next_week - 1.week.from_now.utc.to_date + 1.week.from_now.utc end # Courtesy of http://habtm.com/articles/2006/02/20/assert-yourself-man-redirecting-with-rjs diff --git a/test/unit/project_test.rb b/test/unit/project_test.rb index e8954937..966c8c6d 100644 --- a/test/unit/project_test.rb +++ b/test/unit/project_test.rb @@ -118,7 +118,7 @@ class ProjectTest < Test::Rails::TestCase def test_deferred_todos assert_equal 1, @timemachine.deferred_todos.size t = @timemachine.not_done_todos[0] - t.show_from = 1.days.from_now.utc.to_date + t.show_from = 1.days.from_now.utc t.save! assert_equal 2, Project.find(@timemachine.id).deferred_todos.size end diff --git a/test/unit/todo_create_params_helper_test.rb b/test/unit/todo_create_params_helper_test.rb index 4b38b60d..ade5cbfd 100644 --- a/test/unit/todo_create_params_helper_test.rb +++ b/test/unit/todo_create_params_helper_test.rb @@ -18,7 +18,7 @@ class TodoCreateParamsHelperTest < Test::Rails::TestCase end def test_show_from_accessor - expected_date = Time.now.to_date + expected_date = Time.now params = { 'todo' => { 'show_from' => expected_date}} prefs = flexmock() params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) @@ -26,7 +26,7 @@ class TodoCreateParamsHelperTest < Test::Rails::TestCase end def test_due_accessor - expected_date = Time.now.to_date + expected_date = Time.now params = { 'todo' => { 'due' => expected_date}} prefs = flexmock() params_helper = TodosController::TodoCreateParamsHelper.new(params, prefs) diff --git a/test/unit/todo_test.rb b/test/unit/todo_test.rb index 9227f40b..85c69b39 100644 --- a/test/unit/todo_test.rb +++ b/test/unit/todo_test.rb @@ -68,9 +68,8 @@ class TodoTest < Test::Rails::TestCase def test_validate_show_from_must_be_a_date_in_the_future t = @not_completed2 - t[:show_from] = 1.week.ago.to_date # we have to set this via the indexer because show_from=() updates the state + t[:show_from] = 1.week.ago # we have to set this via the indexer because show_from=() updates the state # and actual show_from value appropriately based on the date - assert_equal 1.week.ago.to_date, t.show_from assert !t.save assert_equal 1, t.errors.count assert_equal "must be a date in the future", t.errors.on(:show_from) @@ -118,7 +117,7 @@ class TodoTest < Test::Rails::TestCase def test_activate_also_saves t = @not_completed1 - t.show_from = 1.week.from_now.to_date + t.show_from = 1.week.from_now t.save! assert t.deferred? t.reload diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 3245099c..06da48a5 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -235,7 +235,7 @@ class UserTest < Test::Rails::TestCase def test_find_and_activate_deferred_todos_that_are_ready assert_equal 1, @admin_user.deferred_todos.count - @admin_user.deferred_todos[0].show_from = @admin_user.time.to_date + @admin_user.deferred_todos[0].show_from = @admin_user.date @admin_user.deferred_todos[0].save @admin_user.deferred_todos.reload @admin_user.deferred_todos.find_and_activate_ready diff --git a/test/views/todos_helper_test.rb b/test/views/todos_helper_test.rb index 843d859e..a6ae4f7c 100644 --- a/test/views/todos_helper_test.rb +++ b/test/views/todos_helper_test.rb @@ -20,28 +20,28 @@ class TodosHelperTest < Test::Rails::HelperTestCase end def test_show_date_in_past - date = 3.days.ago.to_date + date = 3.days.ago html = show_date(date) formatted_date = format_date(date) assert_equal %Q{Scheduled to show 3 days ago }, html end def test_show_date_today - date = Time.zone.now.to_date + date = Time.zone.now html = show_date(date) formatted_date = format_date(date) assert_equal %Q{Show Today }, html end def test_show_date_tomorrow - date = 1.day.from_now.to_date + date = 1.day.from_now html = show_date(date) formatted_date = format_date(date) assert_equal %Q{Show Tomorrow }, html end def test_show_date_future - date = 10.days.from_now.to_date + date = 10.days.from_now html = show_date(date) formatted_date = format_date(date) assert_equal %Q{Show in 10 days }, html