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