sutty/app/models/metadata_event.rb

74 lines
2.2 KiB
Ruby

# frozen_string_literal: true
# Gestiona eventos compatibles con jekyll-ical
class MetadataEvent < MetadataTemplate
# Preferimos los husos horarios en números porque los husos con
# nombres dejan afuera territorios que comparten el mismo huso que
# otras ciudades más hegemónicas.
#
# @see {https://en.wikipedia.org/wiki/List_of_UTC_time_offsets}
TIMEZONES = %w[-12:00 -11:00 -10:00 -09:30 -09:00 -08:00 -07:00 -06:00
-05:00 -04:00 -03:30 -03:00 -02:00 -01:00 00:00 +01:00 +02:00 +03:00
+03:30 +04:00 +04:30 +05:00 +05:30 +05:45 +06:00 +06:30 +07:00 +08:00
+08:45 +09:00 +09:30 +10:00 +10:30 +11:00 +12:00 +12:45 +13:00
+14:00].freeze
# El valor por defecto es un Hash con algunas llaves pero queremos que
# sea opcional.
#
# @return [Hash]
def default_value
super || {}
end
def to_param
{ name => {} }
end
# Dates are required and need to be parseable
def validate
self.errors = []
times = []
%w[dtstart dtend].each do |dt|
errors << I18n.t("metadata.#{type}.zone_missing") unless TIMEZONES.include? value.dig(dt, 'zone')
errors << I18n.t("metadata.#{type}.date_missing") if value.dig(dt, 'date').blank?
begin
Date.parse value.dig(dt, 'date')
rescue ArgumentError, TypeError
errors << I18n.t("metadata.#{type}.date_non_parseable")
end
unless (time = value.dig(dt, 'time')).blank?
errors << I18n.t("metadata.#{type}.time_non_parseable") unless /[0-5][0-9]:[0-5][0-9]/ =~ time
end
times << value.dig(dt, 'date') + ' ' + value.dig(dt, 'time')
end
begin
dtstart, dtend = times.map { |t| Time.parse t }
errors << I18n.t("metadata.#{type}.end_in_the_past") if dtstart > dtend
rescue ArgumentError
errors << I18n.t("metadata.#{type}.time_non_parseable")
end
errors.empty?
end
def sanitize(hash)
self[:value] = %w[dtstart dtend].map do |dt|
time = hash.dig(dt, 'time')
[
dt, {
'zone' => hash.dig(dt, 'zone'),
'date' => Date.parse(hash.dig(dt, 'date')).to_s,
'time' => time.blank? ? '00:00' : time
}
]
end.to_h
end
end