diff --git a/lib/calendar_subscriptions.rb b/lib/calendar_subscriptions.rb index 0d74c8794..1b7b37a9b 100644 --- a/lib/calendar_subscriptions.rb +++ b/lib/calendar_subscriptions.rb @@ -5,6 +5,7 @@ class CalendarSubscriptions def initialize(user) @user = user @preferences = {} + @time_zone = Setting.get('timezone_default').presence || 'UTC' default_preferences = Setting.where(area: 'Defaults::CalendarSubscriptions') default_preferences.each do |calendar_subscription| @@ -42,7 +43,7 @@ class CalendarSubscriptions if @preferences[ object_name ].present? sub_class_name = object_name.to_s.capitalize object = "CalendarSubscriptions::#{sub_class_name}".constantize - instance = object.new(@user, @preferences[ object_name ]) + instance = object.new(@user, @preferences[ object_name ], @time_zone) method = instance.method(method_name) events_data += method.call end @@ -56,8 +57,8 @@ class CalendarSubscriptions events_data.each do |event_data| cal.event do |e| - e.dtstart = Icalendar::Values::DateTime.new(event_data[:dtstart], 'tzid' => 'UTC') - e.dtend = Icalendar::Values::DateTime.new(event_data[:dtend], 'tzid' => 'UTC') + e.dtstart = Icalendar::Values::DateTime.new(event_data[:dtstart], 'tzid' => @time_zone) + e.dtend = Icalendar::Values::DateTime.new(event_data[:dtend], 'tzid' => @time_zone) if event_data[:alarm] e.alarm do |a| a.action = 'DISPLAY' diff --git a/lib/calendar_subscriptions/tickets.rb b/lib/calendar_subscriptions/tickets.rb index c19c41649..43150bd90 100644 --- a/lib/calendar_subscriptions/tickets.rb +++ b/lib/calendar_subscriptions/tickets.rb @@ -2,10 +2,10 @@ class CalendarSubscriptions::Tickets - def initialize(user, preferences) + def initialize(user, preferences, time_zone) @user = user @preferences = preferences - @tzid = 'UTC' + @time_zone = time_zone end def all @@ -86,8 +86,8 @@ class CalendarSubscriptions::Tickets translated_state = Translation.translate(user_locale, ticket.state.name) - event_data[:dtstart] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @tzid) - event_data[:dtend] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @tzid) + event_data[:dtstart] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @time_zone) + event_data[:dtend] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @time_zone) event_data[:summary] = "#{translated_state} #{translated_ticket}: '#{ticket.title}'" event_data[:description] = "T##{ticket.number}" @@ -144,8 +144,8 @@ class CalendarSubscriptions::Tickets translated_state = Translation.translate(user_locale, ticket.state.name) - event_data[:dtstart] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @tzid) - event_data[:dtend] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @tzid) + event_data[:dtstart] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @time_zone) + event_data[:dtend] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @time_zone) event_data[:summary] = "#{translated_state} #{translated_ticket}: '#{ticket.title}' #{customer}: #{ticket.customer.longname}" event_data[:description] = "T##{ticket.number}" if alarm? @@ -198,8 +198,8 @@ class CalendarSubscriptions::Tickets escalation_at = Time.zone.today end - event_data[:dtstart] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @tzid) - event_data[:dtend] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @tzid) + event_data[:dtstart] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @time_zone) + event_data[:dtend] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @time_zone) event_data[:summary] = "#{translated_ticket_escalation}: '#{ticket.title}' #{customer}: #{ticket.customer.longname}" event_data[:description] = "T##{ticket.number}" if alarm? diff --git a/spec/requests/calendar_subscriptions_spec.rb b/spec/requests/calendar_subscriptions_spec.rb index cf97b0c51..e8b1923cc 100644 --- a/spec/requests/calendar_subscriptions_spec.rb +++ b/spec/requests/calendar_subscriptions_spec.rb @@ -10,4 +10,29 @@ RSpec.describe 'iCal endpoints', type: :request do expect(response.body).to eq("HTTP Basic: Access denied.\n") end end + + describe 'time zone', authenticated_as: :user do + let(:group) { create(:group) } + let(:user) { create(:agent) } + + before do + user.groups << group + + create(:ticket, group: group, owner: user, state_name: 'open', pending_time: 1.day.ago) + end + + it 'returns zero offset time if no time zone set' do + get '/ical/tickets' + + expect(response.body).to match %r{DTSTART:\d{8}T0{6}Z} + end + + it 'returns selected time zone' do + Setting.set 'timezone_default', 'Europe/Vilnius' + + get '/ical/tickets' + + expect(response.body).to match %r{DTSTART;TZID=Europe/Vilnius:\d{8}T0{6}} + end + end end