tracks/app/models/recurring_todos/abstract_repeat_pattern.rb

92 lines
2.2 KiB
Ruby
Raw Normal View History

module RecurringTodos
class AbstractRepeatPattern
attr_accessor :attributes
def initialize(user)
@user = user
end
def start_from
get :start_from
end
def end_date
get :end_date
end
def ends_on
get :ends_on
end
def target
get :target
end
def show_always
get :show_always
end
def show_from_delta
get :show_from_delta
end
def build_recurring_todo(attributes)
@recurring_todo = @user.recurring_todos.build(attributes)
end
def update_recurring_todo(recurring_todo, attributes)
recurring_todo.assign_attributes(attributes)
recurring_todo
end
def build_from_recurring_todo(recurring_todo)
@recurring_todo = recurring_todo
@attributes = recurring_todo.attributes
end
def validate
starts_and_ends_on_validations
set_recurrence_on_validations
end
def starts_and_ends_on_validations
errors[:base] << "The start date needs to be filled in" if start_from.blank?
case ends_on
when 'ends_on_number_of_times'
errors[:base] << "The number of recurrences needs to be filled in for 'Ends on'" if number_of_occurences.blank?
when "ends_on_end_date"
errors[:base] << "The end date needs to be filled in for 'Ends on'" if end_date.blank?
else
errors[:base] << "The end of the recurrence is not selected" unless ends_on == "no_end_date"
end
end
def set_recurrence_on_validations
# show always or x days before due date. x not null
case target
when 'show_from_date'
# no validations
when 'due_date'
errors[:base] << "Please select when to show the action" if show_always.nil?
unless show_always
errors[:base] << "Please fill in the number of days to show the todo before the due date" if show_from_delta.blank?
end
else
raise Exception.new, "unexpected value of recurrence target selector '#{target}'"
end
end
def errors
@recurring_todo.errors
end
def get attribute
# handle attribute as symbol and as string
@attributes[attribute] || @attributes[attribute.to_s]
end
end
end