class Candl::EventLoaderModel
Public Class Methods
get_events(calendar_adress, from, to, view)
click to toggle source
load events prepared for agenda view
# File lib/candl/event_loader_model.rb, line 9 def self.get_events(calendar_adress, from, to, view) begin events = parse_calendar(calendar_adress, from, to) initialization_successful = true rescue => exception logger.error "ERROR: #{exception}" initialization_successful = false end if view == :month sorted_events = (events).sort_by do |el| [el.dtstart, el.summary] end elsif view == :agenda spreaded_events = spread_multiday_events(events, from, to) sorted_events = (events + spreaded_events.to_a).sort_by do |el| [el.dtstart, el.summary] end else raise `Unknown view type: #{view}` end { events: sorted_events, success: initialization_successful } end
Private Class Methods
build_google_request_path(calendar_adress, from, to)
click to toggle source
build request path to calendar host (google calendar)
# File lib/candl/event_loader_model.rb, line 38 def self.build_google_request_path(calendar_adress, from, to) google_test_path = "#{calendar_adress[:path]}#{calendar_adress[:id]}/events?key=#{calendar_adress[:key]}&singleEvents=true&orderBy=startTime&timeMin=#{CGI.escape(from.to_s)}&timeMax=#{CGI.escape(to.to_s)}" end
parse_calendar(calendar_adress, from, to)
click to toggle source
parses json response form calendar host (google calendar)
# File lib/candl/event_loader_model.rb, line 43 def self.parse_calendar(calendar_adress, from, to) google_test_path = build_google_request_path(calendar_adress, from.to_datetime, to.to_datetime) requested_events = JSON.parse(Net::HTTP.get(URI.parse(google_test_path))) if requested_events["items"] != nil restructured_events = parse_event_time_type(requested_events) else raise "Calendar event request failed and responded with:\n #{requested_events}" end restructured_events.to_a end
parse_event_time_type(events)
click to toggle source
# File lib/candl/event_loader_model.rb, line 57 def self.parse_event_time_type(events) events["items"].map{ |e| if e["start"]["date"] != nil parsedStart = Date.parse(e["start"]["date"]) parsedEnd = Date.parse(e["end"]["date"]) else parsedStart = DateTime.parse(e["start"]["dateTime"]) parsedEnd = DateTime.parse(e["end"]["dateTime"]) end Event.new(parsedStart, parsedEnd, e["summary"], e["description"], e["location"], e["id"]) } end
spread_multiday_events(events, from, to)
click to toggle source
inserts new event starts for events that are multiple day's long so in the agenda one can see them filling multiple day's
# File lib/candl/event_loader_model.rb, line 70 def self.spread_multiday_events(events, from, to) unspreaded_events = events.select{ |event| (event.dtend - event.dtstart).to_i > 0 } spreaded_events = unspreaded_events.map do |event| ([from, (event.dtstart + 1.day)].max .. [(event.dtend - 1.day), to].min).to_a.map do |date| Event.new.tap do |e| e.dtstart = date.to_date e.dtend = event.dtend.to_date e.summary = event.summary e.location = event.location e.description = event.description e.uid = event.uid end end end.flatten! end