Mayank Ukey
3799dc102f
fix: ICS export — escape X-WR-CALNAME and honour is_utc on DTSTART/DTEND ( #1174 )
...
Two bugs in the export_ics path:
1. X-WR-CALNAME was written raw: calendar names containing commas,
semicolons or backslashes produced invalid ICS (RFC 5545 §3.3.11
requires those characters to be escaped as \, \; and \\).
Fix: wrap cal.name in the existing _ics_escape() helper, which is
already used for SUMMARY, DESCRIPTION, and LOCATION on the lines
immediately below.
2. DTSTART and DTEND on non-all-day events always emitted the naive
ISO string (e.g. 20260602T100000) regardless of CalendarEvent.is_utc.
Consumers treat a naive datetime as floating/local time, so UTC
events imported into Google Calendar or Apple Calendar shifted by
the user's timezone offset. Fix: append 'Z' when is_utc is True,
matching the pattern already used by the serialise_event() helper
at line 408.
2026-06-02 23:02:28 +09:00
..
2026-05-31 23:58:26 +09:00
2026-05-31 23:58:26 +09:00
2026-06-01 14:32:41 +09:00
2026-06-02 20:35:57 +09:00
2026-06-02 13:06:09 +09:00
2026-06-02 20:28:26 +09:00
2026-06-02 20:42:32 +09:00
2026-06-02 01:32:00 +02:00
2026-06-01 02:22:17 +00:00
2026-06-02 05:48:59 +09:00
2026-06-02 20:42:10 +09:00
2026-06-02 06:02:49 +09:00
2026-06-02 05:55:03 +09:00
2026-06-02 12:40:28 +09:00
2026-06-02 20:42:37 +09:00
2026-06-01 13:42:44 +09:00
2026-06-02 20:55:30 +09:00
2026-06-02 21:00:58 +09:00
2026-06-02 20:52:03 +09:00
2026-06-02 20:52:08 +09:00
2026-06-01 22:33:35 +09:00
2026-06-01 22:22:41 +09:00
2026-06-02 20:42:21 +09:00
2026-06-02 20:29:37 +09:00
2026-06-02 13:15:22 +09:00
2026-06-01 22:24:27 +09:00
2026-06-01 12:38:35 +09:00
2026-06-02 12:59:29 +09:00
2026-06-02 22:39:02 +09:00
2026-06-02 22:52:37 +09:00
2026-06-02 12:25:56 +09:00
2026-06-02 11:50:03 +09:00
2026-06-02 20:34:25 +09:00
2026-06-02 12:41:25 +09:00
2026-06-02 11:48:54 +09:00
2026-06-02 20:35:27 +09:00
2026-06-02 06:00:02 +09:00
2026-06-02 20:28:01 +09:00
2026-06-02 13:15:06 +09:00
2026-06-02 20:42:48 +09:00
2026-06-02 11:10:43 +09:00
2026-06-01 14:23:22 -04:00
2026-06-02 22:34:52 +09:00
2026-06-02 22:35:30 +09:00
2026-06-02 20:32:56 +09:00
2026-06-02 20:34:05 +09:00
2026-06-01 22:35:24 +09:00
2026-06-02 11:36:01 +09:00
2026-06-02 21:01:42 +09:00
2026-06-01 22:47:47 +09:00
2026-06-02 13:07:20 +09:00
2026-06-02 22:36:12 +09:00
2026-06-02 23:02:28 +09:00
2026-06-02 11:12:54 +09:00
2026-06-02 11:14:31 +09:00
2026-06-02 05:54:23 +09:00
2026-06-02 11:37:25 +09:00
2026-06-02 20:27:24 +09:00
2026-06-02 11:48:17 +09:00
2026-06-02 20:44:13 +09:00
2026-06-02 11:39:40 +09:00
2026-06-02 20:58:33 +09:00
2026-06-02 23:01:04 +09:00
2026-06-02 20:36:54 +09:00
2026-06-02 11:47:58 +09:00
2026-06-02 11:49:44 +09:00
2026-06-02 22:41:27 +09:00
2026-06-02 11:28:52 +09:00
2026-06-02 11:50:17 +09:00
2026-06-02 11:46:06 +09:00
2026-06-02 11:27:31 +09:00
2026-06-02 20:33:09 +09:00
2026-06-02 20:34:40 +09:00
2026-06-02 21:00:50 +09:00
2026-06-02 20:51:16 +09:00
2026-06-02 20:31:35 +09:00
2026-06-02 11:41:33 +09:00
2026-06-02 12:24:18 +09:00
2026-06-01 18:27:17 +09:00
2026-06-02 20:35:44 +09:00
2026-06-02 11:28:52 +09:00
2026-06-01 22:33:35 +09:00
2026-06-01 22:36:53 +09:00
2026-06-02 20:45:48 +09:00
2026-06-02 20:32:08 +09:00
2026-06-02 20:42:43 +09:00
2026-06-02 11:11:17 +09:00
2026-06-02 12:53:50 +09:00
2026-06-02 22:42:23 +09:00
2026-05-31 23:58:26 +09:00
2026-06-02 11:42:20 +09:00
2026-06-02 20:42:15 +09:00
2026-06-02 22:51:25 +09:00
2026-06-02 11:30:53 +09:00
2026-06-02 11:27:31 +09:00
2026-06-01 23:25:38 +01:00
2026-06-01 22:26:37 +09:00
2026-06-02 05:58:58 +09:00
2026-06-02 12:24:50 +09:00
2026-06-02 20:37:14 +09:00
2026-06-02 11:43:30 +09:00
2026-06-02 10:53:33 +09:00
2026-06-02 20:53:07 +09:00
2026-06-02 21:02:26 +09:00
2026-06-01 23:09:41 +09:00
2026-05-31 23:58:26 +09:00
2026-06-02 20:29:56 +09:00
2026-06-02 12:34:42 +09:00
2026-06-02 21:02:26 +09:00
2026-06-02 20:51:26 +09:00
2026-06-01 16:55:09 +09:00
2026-06-02 11:39:01 +09:00
2026-06-01 23:11:50 +09:00
2026-06-01 22:38:56 +09:00
2026-06-02 12:23:29 +09:00
2026-06-02 11:15:45 +09:00
2026-06-02 20:28:36 +09:00
2026-06-02 11:21:27 +09:00
2026-06-02 10:44:39 +09:00
2026-06-02 20:36:13 +09:00
2026-06-02 20:36:37 +09:00
2026-06-02 20:43:24 +09:00
2026-06-02 20:51:21 +09:00
2026-06-02 11:29:29 +09:00
2026-06-02 20:32:20 +09:00
2026-06-02 20:44:27 +09:00
2026-06-02 20:43:29 +09:00
2026-06-02 12:57:45 +09:00
2026-06-02 20:51:39 +09:00
2026-06-02 20:42:26 +09:00
2026-06-02 12:25:43 +09:00
2026-06-01 13:09:21 +09:00
2026-06-01 22:26:13 +09:00
2026-06-02 20:28:12 +09:00
2026-06-02 11:23:40 +09:00
2026-06-02 20:45:32 +09:00
2026-06-02 20:44:24 +09:00