1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-11 22:24:21 +01:00
fab-manager/app/models/concerns/i_calendar_concern.rb

71 lines
2.0 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# Adds support for iCalendar formar (RFC 5545) to reservations
module ICalendarConcern
extend ActiveSupport::Concern
require 'icalendar'
require 'icalendar/tzinfo'
included do
def to_ics
cal = Icalendar::Calendar.new
cal.add_timezone Time.zone.tzinfo.ical_timezone Time.zone.now
build_icalendar(cal)
cal.to_ical
end
def ics_filename
"#{self.class.name.downcase}-#{id}.ics"
end
def build_icalendar(cal)
grouped_slots.each do |_date, daily_groups|
daily_groups.each do |start_time, group_slots|
cal.event do |e|
e.dtstart = start_time
e.dtend = group_slots.last[:end_at]
e.summary = title
e.description = description(group_slots)
e.ip_class = 'PRIVATE'
e.alarm do |a|
a.action = 'DISPLAY'
a.summary = I18n.t('reservation_ics.alarm_summary')
a.trigger = '-P1DT0H0M0S'
end
end
end
end
cal
end
private
def title
case reservable_type
when 'Machine', 'Training', 'Space'
reservable.name
when 'Event'
reservable.title
else
Rails.logger.warn "Unexpected reservable type #{reservable_type}"
reservable_type
end
end
def description(group_slots)
case reservable_type
when 'Machine', 'Space'
2023-02-24 17:26:55 +01:00
I18n.t('reservation_ics.description_slot', **{ COUNT: group_slots.count, ITEM: reservable.name })
when 'Training'
2023-02-24 17:26:55 +01:00
I18n.t('reservation_ics.description_training', **{ TYPE: reservable.name })
when 'Event'
2023-02-24 17:26:55 +01:00
I18n.t('reservation_ics.description_event', **{ NUMBER: nb_reserve_places + (tickets.map(&:booked).reduce(:+) || 0) })
else
Rails.logger.warn "Unexpected reservable type #{reservable_type}"
2023-02-24 17:26:55 +01:00
I18n.t('reservation_ics.description_slot', **{ COUNT: group_slots.count, ITEM: reservable_type })
end
end
end
end