From 59a631cff95a317dd3caeb589a1c2b7ce019f54b Mon Sep 17 00:00:00 2001 From: Arnaud Levy <contact@arnaudlevy.com> Date: Wed, 27 Dec 2023 18:02:58 +0100 Subject: [PATCH] ics --- Gemfile | 1 + Gemfile.lock | 4 ++ .../communication/website/agenda/event.rb | 37 +++++++++++++++++++ .../agenda/events/_dates_static.html.erb | 5 ++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 75f3b0ab1..2d06e3a02 100644 --- a/Gemfile +++ b/Gemfile @@ -40,6 +40,7 @@ gem "hal_openscience", "~> 0" # gem "hal_openscience", path: "../hal_openscience" gem "has_scope", "~> 0" gem "hash_dot" +gem "icalendar" gem "i18n_data", "~> 0" gem "i18n_date_range" # gem "i18n_date_range", path: "../../noesya/i18n_date_range" diff --git a/Gemfile.lock b/Gemfile.lock index bc76df437..627344263 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -302,6 +302,9 @@ GEM i18n_date_range (2.0.0) rails rails-i18n + icalendar (2.10.1) + ice_cube (~> 0.16) + ice_cube (0.16.4) image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) @@ -661,6 +664,7 @@ DEPENDENCIES hash_dot i18n_data (~> 0) i18n_date_range + icalendar image_processing jbuilder jquery-rails diff --git a/app/models/communication/website/agenda/event.rb b/app/models/communication/website/agenda/event.rb index d920a9363..aa08c2eb3 100644 --- a/app/models/communication/website/agenda/event.rb +++ b/app/models/communication/website/agenda/event.rb @@ -148,12 +148,49 @@ class Communication::Website::Agenda::Event < ApplicationRecord "#{Static.remove_trailing_slash website.url}#{Static.clean_path current_permalink_in_website(website).path}" end + def to_ics + event = Icalendar::Event.new + event.dtstart = from_datetime + event.dtend = to_datetime if to_datetime.present? + event.summary = "#{title} #{subtitle}" + event.description = "#{summary}\n\n#{url}" + calendar = Icalendar::Calendar.new + calendar.prodid = 'icalendar-osuny' + calendar.add_event(event) + calendar.to_ical + end + def to_s "#{title}" end protected + def from_datetime + from_hour.nil? ? from_day + : date_and_time(from_day, from_hour) + end + + def to_datetime + if to_day.nil? && to_hour.nil? + # Pas de fin + nil + elsif to_day.nil? && to_hour.present? + # Heure de fin, donc on se base sur le jour de début + date_and_time(from_day, to_hour) + elsif to_day.present? && to_hour.nil? + # Jour de fin seul + to_day + elsif to_day.present? && to_hour.nil? + # Jour et heure de fin + date_and_time(to_day, to_hour) + end + end + + def date_and_time(date, time) + DateTime.new(date.year, date.month, date.day, time.hour, time.min, time.sec, time.zone) + end + def check_accessibility accessibility_merge_array blocks end diff --git a/app/views/admin/communication/websites/agenda/events/_dates_static.html.erb b/app/views/admin/communication/websites/agenda/events/_dates_static.html.erb index 0723bc756..5d3fbdef3 100644 --- a/app/views/admin/communication/websites/agenda/events/_dates_static.html.erb +++ b/app/views/admin/communication/websites/agenda/events/_dates_static.html.erb @@ -24,4 +24,7 @@ indentation = ' ' * depth <%= indentation %> day: <%= event.to_day || event.from_day %> <% if event.to_hour %> <%= indentation %> hour: <%= event.to_hour.strftime "%H:%M" %> -<% end %> \ No newline at end of file +<% end %> +<%= indentation %> files: +<%= indentation %> ics: >- +<%= indentation %> <%= prepare_text_for_static event.to_ics, depth + 3 %> \ No newline at end of file -- GitLab