Source code for eucrim.event.utils

# SPDX-FileCopyrightText: 2024 Thomas Breitner <t.breitner@csl.mpg.de>
#
# SPDX-License-Identifier: EUPL-1.2

from datetime import datetime, time, timedelta
import hashlib


[docs] def export_event(event, response_format="ical"): # Only ical format supported at the moment if response_format != "ical": return # Begin event # VEVENT format: http://www.kanzaki.com/docs/ical/vevent.html ical_components = [ "BEGIN:VCALENDAR", "VERSION:2.0", "PRODID:-//ecactj//wagtail//EN", ] # Work out number of days the event lasts if event.date_to is not None: days = (event.date_to - event.date_from).days + 1 else: days = 1 for day in range(days): # Get date date = event.date_from + timedelta(days=day) # Get times if event.time_from is not None: start_time = event.time_from else: start_time = time.min if event.time_to is not None: end_time = event.time_to else: end_time = time.max # Combine dates and times start_datetime = datetime.combine(date, start_time) end_datetime = datetime.combine(date, end_time) def add_slashes(string): string.replace('"', '\\"') string.replace("\\", "\\\\") string.replace(",", "\\,") string.replace(":", "\\:") string.replace(";", "\\;") string.replace("\n", "\\n") return string # Make a uid event_string = event.url + str(start_datetime) uid = hashlib.sha1(event_string.encode("utf-8")).hexdigest() + "@wagtaildemo" # Make event ical_components.extend( [ "BEGIN:VEVENT", "UID:" + add_slashes(uid), "URL:" + add_slashes(event.url), "DTSTAMP:" + start_time.strftime("%Y%m%dT%H%M%S"), "SUMMARY:" + add_slashes(event.title), "DESCRIPTION:" + add_slashes(event.search_description), "LOCATION:" + add_slashes(event.location), "DTSTART;TZID=Europe/London:" + start_datetime.strftime("%Y%m%dT%H%M%S"), "DTEND;TZID=Europe/London:" + end_datetime.strftime("%Y%m%dT%H%M%S"), "END:VEVENT", ] ) # Finish event ical_components.extend( [ "END:VCALENDAR", ] ) # Join components return "\r".join(ical_components)