From d2ce0de0204d67c58935df32983f14fa102929b0 Mon Sep 17 00:00:00 2001 From: Laurent GAY Date: Thu, 31 Jul 2025 13:43:15 +0200 Subject: [PATCH] add event image in iCal export (#842) --- lib/service/export/icalendar.ex | 10 ++++++++++ mix.exs | 2 +- mix.lock | 2 +- test/service/export/icalendar_test.exs | 17 ++++++++++++++--- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/service/export/icalendar.ex b/lib/service/export/icalendar.ex index d72cdb0b2..9ba617b61 100644 --- a/lib/service/export/icalendar.ex +++ b/lib/service/export/icalendar.ex @@ -149,6 +149,16 @@ defmodule Mobilizon.Service.Export.ICalendar do icalendar_event end + icalendar_event = + if event.picture do + %ICalendar.Event{ + icalendar_event + | attach: {event.picture.file.url, event.picture.file.content_type} + } + else + icalendar_event + end + icalendar_event end diff --git a/mix.exs b/mix.exs index 0fd071ffa..ceceb4b2c 100644 --- a/mix.exs +++ b/mix.exs @@ -155,7 +155,7 @@ defmodule Mobilizon.Mixfile do {:geo, "~> 3.0"}, {:geo_postgis, "~> 3.1"}, {:timex, "~> 3.0"}, - {:icalendar, github: "tcitworld/icalendar"}, + {:icalendar, github: "mobilizon-tools/icalendar"}, {:exgravatar, "~> 2.0.1"}, # {:json_ld, "~> 0.3"}, {:jason, "~> 1.2"}, diff --git a/mix.lock b/mix.lock index 3bceb2bc1..2d707756f 100644 --- a/mix.lock +++ b/mix.lock @@ -74,7 +74,7 @@ "html_entities": {:hex, :html_entities, "0.5.2", "9e47e70598da7de2a9ff6af8758399251db6dbb7eebe2b013f2bbd2515895c3c", [:mix], [], "hexpm", "c53ba390403485615623b9531e97696f076ed415e8d8058b1dbaa28181f4fdcc"}, "http_signatures": {:hex, :http_signatures, "0.1.2", "ed1cc7043abcf5bb4f30d68fb7bad9d618ec1a45c4ff6c023664e78b67d9c406", [:mix], [], "hexpm", "f08aa9ac121829dae109d608d83c84b940ef2f183ae50f2dd1e9a8bc619d8be7"}, "httpoison": {:hex, :httpoison, "1.8.2", "9eb9c63ae289296a544842ef816a85d881d4a31f518a0fec089aaa744beae290", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "2bb350d26972e30c96e2ca74a1aaf8293d61d0742ff17f01e0279fef11599921"}, - "icalendar": {:git, "https://github.com/tcitworld/icalendar.git", "1033d922c82a7223db0ec138e2316557b70ff49f", []}, + "icalendar": {:git, "https://github.com/mobilizon-tools/icalendar.git", "b8fc5360b1755f60f2768d40f6aca949ef598a00", []}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "inet_cidr": {:hex, :inet_cidr, "1.0.8", "d26bb7bdbdf21ae401ead2092bf2bb4bf57fe44a62f5eaa5025280720ace8a40", [:mix], [], "hexpm", "d5b26da66603bb56c933c65214c72152f0de9a6ea53618b56d63302a68f6a90e"}, "ip_reserved": {:hex, :ip_reserved, "0.1.1", "e5112d71f1abf05207f82fd9597d369a5fde1e0b6d1bbe77c02a99bb26ecdc33", [:mix], [{:inet_cidr, "~> 1.0.0", [hex: :inet_cidr, repo: "hexpm", optional: false]}], "hexpm", "55fcd2b6e211caef09ea3f54ef37d43030bec486325d12fe865ab5ed8140a4fe"}, diff --git a/test/service/export/icalendar_test.exs b/test/service/export/icalendar_test.exs index 0b0361577..0e17ea787 100644 --- a/test/service/export/icalendar_test.exs +++ b/test/service/export/icalendar_test.exs @@ -19,6 +19,7 @@ defmodule Mobilizon.Service.ICalendarTest do VERSION:2.0 PRODID:-//Elixir ICalendar//Mobilizon #{Mobilizon.Config.instance_version()}//EN BEGIN:VEVENT + ATTACH;FMTTYPE=#{event.picture.file.content_type}:#{event.picture.file.url} CATEGORIES:#{Enum.map_join(event.tags, ",", & &1.title)} DESCRIPTION:Ceci est une description avec une première phrase assez longue\\,\\n puis sur une seconde ligne DTEND:#{Value.to_ics(event.ends_on)}Z @@ -41,16 +42,26 @@ defmodule Mobilizon.Service.ICalendarTest do describe "export the instance's public events" do test "succeds" do - %Event{} = event = insert(:event, title: "I'm public") + %Event{} = event1 = insert(:event, title: "I'm public") %Event{} = event2 = insert(:event, visibility: :private, title: "I'm private") - %Event{} = event3 = insert(:event, title: "Another public") + %Event{} = event3 = insert(:event, title: "Another public", picture: nil) %Event{} = event4 = insert(:event, title: "No description", description: nil) {:commit, ics} = ICalendarService.create_cache("instance") - assert ics =~ event.title + assert ics =~ event1.title refute ics =~ event2.title assert ics =~ event3.title assert ics =~ event4.title + + assert Enum.sort(Regex.scan(~r|ATTACH;FMTTYPE=image.*|, ics)) == + Enum.sort([ + [ + "ATTACH;FMTTYPE=#{event1.picture.file.content_type}:#{event1.picture.file.url}" + ], + [ + "ATTACH;FMTTYPE=#{event4.picture.file.content_type}:#{event4.picture.file.url}" + ] + ]) end test "with 50 events" do