From 0c530ba6fc51f34f0ff35622cee42dc69b448253 Mon Sep 17 00:00:00 2001 From: Ketan <73937490+devketanpro@users.noreply.github.com> Date: Thu, 28 Nov 2024 08:50:24 +0530 Subject: [PATCH] Fix iCalendar DTEND Handling for Multi-Day All-Day Events[CPCN-840] (#1179) * fix calendar DTEND time in Icalendar format [CPCN-840] * remove print --- newsroom/agenda/formatters/ical_formatter.py | 5 ++++- tests/core/test_ical_formatter.py | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/newsroom/agenda/formatters/ical_formatter.py b/newsroom/agenda/formatters/ical_formatter.py index ac189aac9..5eab44b4c 100644 --- a/newsroom/agenda/formatters/ical_formatter.py +++ b/newsroom/agenda/formatters/ical_formatter.py @@ -6,6 +6,7 @@ from newsroom.agenda.contacts import get_contact_name, get_contact_email from newsroom.formatter import BaseFormatter +from datetime import timedelta def datetime(value): @@ -67,7 +68,9 @@ def format_event(self, item): event.add("dtstart", start.date() if dates.get("all_day") else start) if dates.get("end"): end = datetime(dates["end"]) - event.add("dtend", end.date() if dates.get("no_end_time") or dates.get("all_day") else end) + event.add( + "dtend", end.date() + timedelta(days=1) if dates.get("no_end_time") or dates.get("all_day") else end + ) try: rrule = item["event"]["dates"]["recurring_rule"] event.add("rrule", get_rrule_kwargs(rrule)) diff --git a/tests/core/test_ical_formatter.py b/tests/core/test_ical_formatter.py index 9f4e56f26..7cf992505 100644 --- a/tests/core/test_ical_formatter.py +++ b/tests/core/test_ical_formatter.py @@ -78,7 +78,7 @@ def test_onclusive_all_day(): formatter = iCalFormatter() output = formatter.format_item(event, item_type="agenda").decode("utf-8") assert "DTSTART;VALUE=DATE:20240101" in output - assert "DTEND;VALUE=DATE:20240103" in output + assert "DTEND;VALUE=DATE:20240104" in output def test_onclusive_no_end_time(): @@ -93,4 +93,19 @@ def test_onclusive_no_end_time(): formatter = iCalFormatter() output = formatter.format_item(event, item_type="agenda").decode("utf-8") assert "DTSTART;VALUE=DATE-TIME:20240101T100000Z" in output - assert "DTEND;VALUE=DATE:20240103" in output + assert "DTEND;VALUE=DATE:20240104" in output + + +def test_onclusive_multiday(): + event = { + "name": "test", + "dates": { + "start": "2024-11-18T00:00:00", + "end": "2024-11-20T00:00:00", + "all_day": True, + }, + } + formatter = iCalFormatter() + output = formatter.format_item(event, item_type="agenda").decode("utf-8") + assert "DTSTART;VALUE=DATE:20241118" in output + assert "DTEND;VALUE=DATE:20241121" in output