From 4c431e515d549db517234eba8bc066531670bb4c Mon Sep 17 00:00:00 2001 From: Jean-Marie Favreau Date: Wed, 26 Jun 2024 16:19:02 +0200 Subject: [PATCH] Ajout d'un export ical --- src/agenda_culturel/calendar.py | 5 ++ src/agenda_culturel/models.py | 62 +++++++++++++------ .../templates/agenda_culturel/page-month.html | 1 + .../templates/agenda_culturel/page-week.html | 1 + src/agenda_culturel/urls.py | 4 ++ src/agenda_culturel/views.py | 23 ++++++- 6 files changed, 75 insertions(+), 21 deletions(-) diff --git a/src/agenda_culturel/calendar.py b/src/agenda_culturel/calendar.py index 2add4ef..213f79c 100644 --- a/src/agenda_culturel/calendar.py +++ b/src/agenda_culturel/calendar.py @@ -175,6 +175,11 @@ class CalendarList: def calendar_days_list(self): return list(self.calendar_days.values()) + def export_to_ics(self): + from .models import Event + events = [event for day in self.calendar_days.values() for event in day.events] + return Event.export_to_ics(events) + class CalendarMonth(CalendarList): def __init__(self, year, month, filter): diff --git a/src/agenda_culturel/models.py b/src/agenda_culturel/models.py index 771f42f..ae9261c 100644 --- a/src/agenda_culturel/models.py +++ b/src/agenda_culturel/models.py @@ -1099,28 +1099,50 @@ class Event(models.Model): cal.add("version", "2.0") for event in events: + ed = event.get_consolidated_end_day() eventIcal = icalEvent() # mapping - eventIcal.add( - "dtstart", - datetime( - event.start_day.year, - event.start_day.month, - event.start_day.day, - event.start_time.hour, - event.start_time.minute, - ), - ) - eventIcal.add( - "dtend", - datetime( - event.end_day.year, - event.end_day.month, - event.end_day.day, - event.end_time.hour, - event.end_time.minute, - ), - ) + if event.start_time is None: + eventIcal.add( + "dtstart", + date( + event.start_day.year, + event.start_day.month, + event.start_day.day, + ), + ) + else: + eventIcal.add( + "dtstart", + datetime( + event.start_day.year, + event.start_day.month, + event.start_day.day, + event.start_time.hour, + event.start_time.minute, + ), + ) + if not event.end_day is None: + if event.end_time is None: + eventIcal.add( + "dtend", + date( + event.end_day.year, + event.end_day.month, + event.end_day.day, + ), + ) + else: + eventIcal.add( + "dtend", + datetime( + event.end_day.year, + event.end_day.month, + event.end_day.day, + event.end_time.hour, + event.end_time.minute, + ), + ) eventIcal.add("summary", event.title) eventIcal.add("name", event.title) eventIcal.add( diff --git a/src/agenda_culturel/templates/agenda_culturel/page-month.html b/src/agenda_culturel/templates/agenda_culturel/page-month.html index 8819750..35ce48a 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-month.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-month.html @@ -61,6 +61,7 @@ {% if calendar.today_in_calendar %} Aujourd'hui Cette semaine + Export ical {% picto_from_name "calendar" %} {% endif %} diff --git a/src/agenda_culturel/templates/agenda_culturel/page-week.html b/src/agenda_culturel/templates/agenda_culturel/page-week.html index e85672e..888a7b8 100644 --- a/src/agenda_culturel/templates/agenda_culturel/page-week.html +++ b/src/agenda_culturel/templates/agenda_culturel/page-week.html @@ -65,6 +65,7 @@ Semaine du {{ calendar.calendar_days_list.0.date|date|frdate }} {% if calendar.firstdate.month != calendar.lastdate.month %} {{ calendar.lastdate | date:"F o" }} {% endif %} + Export ical {% picto_from_name "calendar" %} diff --git a/src/agenda_culturel/urls.py b/src/agenda_culturel/urls.py index 695051e..2dfabf3 100644 --- a/src/agenda_culturel/urls.py +++ b/src/agenda_culturel/urls.py @@ -162,6 +162,10 @@ urlpatterns = [ "event/////ical", export_event_ical, name="export_event_ical"), + path( + "ical", + export_ical, + name="export_ical"), ] if settings.DEBUG: diff --git a/src/agenda_culturel/views.py b/src/agenda_culturel/views.py index 29a0d9d..ea8db0c 100644 --- a/src/agenda_culturel/views.py +++ b/src/agenda_culturel/views.py @@ -58,7 +58,7 @@ from django.contrib.auth.decorators import login_required, permission_required from django.contrib import messages from django.contrib.messages.views import SuccessMessageMixin -from .calendar import CalendarMonth, CalendarWeek, CalendarDay +from .calendar import CalendarMonth, CalendarWeek, CalendarDay, CalendarList from .import_tasks.importer import URL2Events from .import_tasks.extractor import Extractor @@ -203,6 +203,12 @@ class EventFilter(django_filters.FilterSet): def get_cities(self): return self.form.cleaned_data["city"] + def to_str(self, prefix=''): + result = ' '.join([c.name for c in self.get_categories()] + [t for t in self.get_tags()] + [c for c in self.get_cities()]) + if len(result) > 0: + result = prefix + result + return result + def get_status_names(self): if "status" in self.form.cleaned_data: return [ @@ -616,6 +622,21 @@ def export_event_ical(request, year, month, day, pk): return response +def export_ical(request): + now = date.today() + + filter = EventFilter(request.GET, queryset=get_event_qs(request), request=request) + calendar = CalendarList(now + timedelta(days=-7), now + timedelta(days=+60), filter) + ical = calendar.export_to_ics() + + response = HttpResponse(content_type="text/calendar") + response.content = ical.to_ical().decode("utf-8").replace("\r\n", "\n") + response["Content-Disposition"] = "attachment; filename={0}{1}{2}".format( + 'Pommes de lune', filter.to_str(' '), ".ics" + ) + + return response + class EventFilterAdmin(django_filters.FilterSet): status = django_filters.MultipleChoiceFilter( choices=Event.STATUS.choices, widget=forms.CheckboxSelectMultiple