From 9d246f70cd515f3bea6774e72eda0c1424da2149 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 29 Nov 2008 15:55:16 +0100 Subject: [PATCH] Fix #795. Similar hack as http://github.com/bsag/tracks/commit/f43447e33f404f0d8e4a44f44bcf553289c5bf6a --- app/controllers/todos_controller.rb | 8 ++++---- app/models/recurring_todo.rb | 17 ++++++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/controllers/todos_controller.rb b/app/controllers/todos_controller.rb index 6e61585e..265fcea3 100644 --- a/app/controllers/todos_controller.rb +++ b/app/controllers/todos_controller.rb @@ -779,8 +779,8 @@ class TodosController < ApplicationController if todo.from_recurring_todo? recurring_todo = todo.recurring_todo - # check if there are active todos belonging to this recurring todo. - # only add new one if all active todos are completed + # check if there are active todos belonging to this recurring todo. only + # add new one if all active todos are completed if recurring_todo.todos.active.count == 0 # check for next todo either from the due date or the show_from date @@ -788,7 +788,7 @@ class TodosController < ApplicationController # if both due and show_from are nil, check for a next todo from now date_to_check = Time.zone.now if date_to_check.nil? - + if recurring_todo.active? && recurring_todo.has_next_todo(date_to_check) # shift the reference date to yesterday if date_to_check is furher in @@ -799,7 +799,7 @@ class TodosController < ApplicationController # that new todos due for today will be created instead of new todos # for tomorrow. date = date_to_check.at_midnight >= Time.zone.now.at_midnight ? date_to_check : Time.zone.now-1.day - + new_recurring_todo = create_todo_from_recurring_todo(recurring_todo, date) end end diff --git a/app/models/recurring_todo.rb b/app/models/recurring_todo.rb index 4561ed58..be4e2414 100644 --- a/app/models/recurring_todo.rb +++ b/app/models/recurring_todo.rb @@ -471,12 +471,23 @@ class RecurringTodo < ActiveRecord::Base start = determine_start(previous) day = self.every_other1 n = self.every_other2 - + case self.recurrence_selector when 0 # specific day of the month - if start.mday >= day + if start.mday >= day # there is no next day n in this month, search in next month - start += n.months + # + # start += n.months + # + # The above seems to not work. Fiddle with timezone. Looks like we hit a + # bug in rails here where 2008-12-01 +0100 plus 1.month becomes + # 2008-12-31 +0100. For now, just calculate in UTC and convert back to + # local timezone. + # + # TODO: recheck if future rails versions have this problem too + start = Time.utc(start.year, start.month, start.day)+n.months + start = Time.zone.local(start.year, start.month, start.day) + # go back to day end return Time.zone.local(start.year, start.month, day)