From 999f947aa4dbadbf71ad10856dc1acd8de4b790d Mon Sep 17 00:00:00 2001 From: echarp Date: Sat, 27 Apr 2019 14:44:29 +0200 Subject: [PATCH] Attempt to manage ical time zones using proper time zone TZID. Refs #76 and refs #136 --- app/models/region.rb | 13 +++++++++++++ app/views/events/index.ics.haml | 11 +++++++---- app/views/events/show.ics.haml | 11 ++++++++--- test/fixtures/regions.yml | 13 +++++++++++++ test/models/event_test.rb | 2 +- test/models/region_test.rb | 15 ++++++++++++--- 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/app/models/region.rb b/app/models/region.rb index dad5551f..3c2be68e 100644 --- a/app/models/region.rb +++ b/app/models/region.rb @@ -18,4 +18,17 @@ class Region < ApplicationRecord def to_s name end + + # Attempt to get a corresponding timezone, used for ical + def tzid + country = TZInfo::Country.get region.try(:code) || code + if country.present? && country.zone_identifiers.length.positive? + country.zone_identifiers[0] + else + Time.now.zone + end + rescue TZInfo::InvalidCountryCode + # Mostly useful for non country calendars + Time.now.zone + end end diff --git a/app/views/events/index.ics.haml b/app/views/events/index.ics.haml index b318f032..08b6b7ff 100644 --- a/app/views/events/index.ics.haml +++ b/app/views/events/index.ics.haml @@ -2,14 +2,17 @@ # Create a calendar with an event (standard method) cal = Icalendar::Calendar.new @events.each do |event| + tzid = event.region.tzid cal.event do |e| - e.dtstamp = Icalendar::Values::DateTime.new event.decision_time + e.dtstamp = Icalendar::Values::DateTime.new event.decision_time, tzid: tzid e.uid = "#{event.id}@#{request.domain}" - e.dtstart = Icalendar::Values::DateTime.new event.start_time - e.dtend = Icalendar::Values::DateTime.new event.end_time + e.dtstart = Icalendar::Values::DateTime.new event.start_time, tzid: tzid + e.dtend = Icalendar::Values::DateTime.new event.end_time, tzid: tzid e.summary = event.title - e.description = event.description.tr '\'', '’' + e.description = to_markdown event.description.tr '\'', '’' e.location = event.full_address.tr '\'', '’' + e.organizer = "mailto:#{event.contact}" + e.x_alt_desc = Icalendar::Values::Text.new event.description, FMTTYPE: 'text/html' end end diff --git a/app/views/events/show.ics.haml b/app/views/events/show.ics.haml index 9c769671..3b20e267 100644 --- a/app/views/events/show.ics.haml +++ b/app/views/events/show.ics.haml @@ -1,12 +1,17 @@ :ruby # Create a calendar with an event (standard method) cal = Icalendar::Calendar.new + tzid = @event.region.tzid cal.event do |e| - e.dtstart = Icalendar::Values::DateTime.new @event.start_time - e.dtend = Icalendar::Values::DateTime.new @event.end_time + e.dtstamp = Icalendar::Values::DateTime.new @event.decision_time, tzid: tzid + e.uid = "#{event.id}@#{request.domain}" + e.dtstart = Icalendar::Values::DateTime.new @event.start_time, tzid: tzid + e.dtend = Icalendar::Values::DateTime.new @event.end_time, tzid: tzid e.summary = @event.title - e.description = strip_tags(@event.description).tr '\'', '’' + e.description = to_markdown @event.description.tr '\'', '’' e.location = @event.full_address + e.organizer = "mailto:#{@event.contact}" + e.x_alt_desc = Icalendar::Values::Text.new @event.description, FMTTYPE: 'text/html' end cal.publish diff --git a/test/fixtures/regions.yml b/test/fixtures/regions.yml index e21f58da..c5b45206 100644 --- a/test/fixtures/regions.yml +++ b/test/fixtures/regions.yml @@ -1,7 +1,20 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html +region_france: + name: France + code: FR + +region_quebec: + name: Quebec + code: QC + region_one: name: Alsace + region: region_france region_two: name: Aquitaine + region: region_france + +region_other: + name: Other diff --git a/test/models/event_test.rb b/test/models/event_test.rb index 42d9e615..2a886327 100644 --- a/test/models/event_test.rb +++ b/test/models/event_test.rb @@ -118,6 +118,6 @@ class EventTest < ActiveSupport::TestCase @event.city = 'world' @event.region.name = 'here' @event.region.code = 'xyz' - assert_equal 'hello, world', @event.full_address + assert_equal 'hello, world, here, France', @event.full_address end end diff --git a/test/models/region_test.rb b/test/models/region_test.rb index b822223f..0ba8b2c1 100644 --- a/test/models/region_test.rb +++ b/test/models/region_test.rb @@ -2,7 +2,16 @@ require 'test_helper' # Mostly a data holder model, to maintain coutry > region data class RegionTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + test 'proper timezone' do + assert regions(:region_one).tzid.present? + assert regions(:region_one).tzid == 'Europe/Paris' + end + + test 'check québec timezone is local timezone' do + assert regions(:region_quebec).tzid == Time.now.zone + end + + test 'check other timezone is local timezone' do + assert regions(:region_other).tzid == Time.now.zone + end end