diff --git a/app/models/fullcalendar_engine/event.rb b/app/models/fullcalendar_engine/event.rb index bbc0ef8..26c196b 100644 --- a/app/models/fullcalendar_engine/event.rb +++ b/app/models/fullcalendar_engine/event.rb @@ -3,7 +3,7 @@ class Event < ActiveRecord::Base attr_accessor :period, :frequency, :commit_button - validates_presence_of :title, :description + validates :title, :description, :presence => true validate :validate_timings belongs_to :event_series @@ -25,22 +25,20 @@ def validate_timings def update_events(events, event) events.each do |e| begin - st, et = e.starttime, e.endtime + old_start_time, old_end_time = e.starttime, e.endtime e.attributes = event if event_series.period.downcase == 'monthly' or event_series.period.downcase == 'yearly' - nst = DateTime.parse("#{e.starttime.hour}:#{e.starttime.min}:#{e.starttime.sec}, #{e.starttime.day}-#{st.month}-#{st.year}") - net = DateTime.parse("#{e.endtime.hour}:#{e.endtime.min}:#{e.endtime.sec}, #{e.endtime.day}-#{et.month}-#{et.year}") + new_start_time = make_date_time(e.starttime, old_start_time) + new_end_time = make_date_time(e.starttime, old_end_time, e.endtime) else - nst = DateTime.parse("#{e.starttime.hour}:#{e.starttime.min}:#{e.starttime.sec}, #{st.day}-#{st.month}-#{st.year}") - net = DateTime.parse("#{e.endtime.hour}:#{e.endtime.min}:#{e.endtime.sec}, #{et.day}-#{et.month}-#{et.year}") + new_start_time = make_date_time(e.starttime, old_end_time) + new_end_time = make_date_time(e.endtime, old_end_time) end - #puts "#{nst} ::::::::: #{net}" rescue - nst = net = nil + new_start_time = new_end_time = nil end - if nst and net - # e.attributes = event - e.starttime, e.endtime = nst, net + if new_start_time and new_end_time + e.starttime, e.endtime = new_start_time, new_end_time e.save end end @@ -48,5 +46,11 @@ def update_events(events, event) event_series.attributes = event event_series.save end + + private + + def make_date_time(original_time, difference_time, event_time = nil) + DateTime.parse("#{original_time.hour}:#{original_time.min}:#{original_time.sec}, #{event_time.try(:day) || difference_time.day}-#{difference_time.month}-#{difference_time.year}") + end end end diff --git a/app/models/fullcalendar_engine/event_series.rb b/app/models/fullcalendar_engine/event_series.rb index ec77f7c..5b262cf 100644 --- a/app/models/fullcalendar_engine/event_series.rb +++ b/app/models/fullcalendar_engine/event_series.rb @@ -1,49 +1,58 @@ module FullcalendarEngine class EventSeries < ActiveRecord::Base attr_accessor :title, :description, :commit_button - - validates_presence_of :frequency, :period, :starttime, :endtime - validates_presence_of :title, :description - + + validates :frequency, :period, :starttime, :endtime, :title, :description, :presence => true + has_many :events, :dependent => :destroy after_create :create_events_until_end_time - + def create_events_until_end_time(end_time=RECURRING_EVENTS_UPTO) - st = starttime - et = endtime - p = r_period(period) - nst, net = st, et - - while frequency.send(p).from_now(st) <= end_time - # puts "#{nst} ::::::::: #{net}" if nst and net - self.events.create(:title => title, :description => description, :all_day => all_day, :starttime => nst, :endtime => net) - nst = st = frequency.send(p).from_now(st) - net = et = frequency.send(p).from_now(et) - + old_start_time = starttime + old_end_time = endtime + frequency_period = recurring_period(period) + new_start_time, new_end_time = old_start_time, old_end_time + + while frequency.send(frequency_period).from_now(old_start_time) <= end_time + self.events.create( + :title => title, + :description => description, + :all_day => all_day, + :starttime => new_start_time, + :endtime => new_end_time + ) + new_start_time = old_start_time = frequency.send(frequency_period).from_now(old_start_time) + new_end_time = old_end_time = frequency.send(frequency_period).from_now(old_end_time) + if period.downcase == 'monthly' or period.downcase == 'yearly' begin - nst = DateTime.parse("#{starttime.hour}:#{starttime.min}:#{starttime.sec}, #{starttime.day}-#{st.month}-#{st.year}") - net = DateTime.parse("#{endtime.hour}:#{endtime.min}:#{endtime.sec}, #{endtime.day}-#{et.month}-#{et.year}") + new_start_time = make_date_time(starttime, old_start_time) + new_end_time = make_date_time(endtime, old_end_time) rescue - nst = net = nil + new_start_time = new_end_time = nil end end end end - - def r_period(period) + + def recurring_period(period) case period when 'Daily' - p = 'days' - when "Weekly" - p = 'weeks' - when "Monthly" - p = 'months' - when "Yearly" - p = 'years' + 'days' + when 'Weekly' + 'weeks' + when 'Monthly' + 'months' + when 'Yearly' + 'years' end - return p end + + private + + def make_date_time(original_time, difference_time) + DateTime.parse("#{original_time.hour}:#{original_time.min}:#{original_time.sec}, #{original_time.day}-#{difference_time.month}-#{difference_time.year}") + end end end