From e02c4f97c13f0ebcbf2f06dc8ab150876d4f6933 Mon Sep 17 00:00:00 2001 From: Stefan Hacker Date: Mon, 13 Apr 2026 09:28:44 +0200 Subject: [PATCH] feat(calendar): Live-Refresh ueber CalDAV, Tagklick-Navigation, Listen-Ansicht - caldav.py sendet SSE-Notifications bei Event-PUT/DELETE und Kalender-Loeschung, damit das Web-UI auch auf Aenderungen aus DAVx5 sofort reagiert. - FullCalendar navLinks: Klick auf Tagesnummer im Monatsraster wechselt in die Tagesansicht. - Neue Listen-Ansicht mit Volltext-Suche, Datumsbereich, Kalender-Filter, Sortierung nach Datum/Titel und Loeschen-Button pro Zeile. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/dav/caldav.py | 16 ++- frontend/src/views/CalendarView.vue | 164 +++++++++++++++++++++++++++- 2 files changed, 178 insertions(+), 2 deletions(-) diff --git a/backend/app/dav/caldav.py b/backend/app/dav/caldav.py index 6c5358e..7857288 100644 --- a/backend/app/dav/caldav.py +++ b/backend/app/dav/caldav.py @@ -26,8 +26,14 @@ from functools import wraps from flask import Response, request from app.extensions import db -from app.models.calendar import Calendar, CalendarEvent +from app.models.calendar import Calendar, CalendarEvent, CalendarShare from app.models.user import User +from app.services.events import notify_calendar_change + + +def _cal_recipients(cal: 'Calendar'): + return [s.shared_with_id for s in + CalendarShare.query.filter_by(calendar_id=cal.id).all()] from . import dav_bp @@ -513,6 +519,8 @@ def put_event(username, cal_part, filename): existing.ical_data = _extract_vevent_block(raw) existing.updated_at = datetime.now(timezone.utc) db.session.commit() + notify_calendar_change(cal.owner_id, cal.id, 'event', + shared_with=_cal_recipients(cal)) status = 201 if request.method == 'PUT' and not if_match else 204 return Response('', status, {'ETag': _etag_for_event(existing)}) @@ -541,6 +549,8 @@ def delete_event(username, cal_part, filename): return Response('', 404) db.session.delete(ev) db.session.commit() + notify_calendar_change(cal.owner_id, cal.id, 'event', + shared_with=_cal_recipients(cal)) return Response('', 204) @@ -558,8 +568,12 @@ def delete_calendar(username, cal_part): cal = _calendar_for(user, cal_id) if cal_id else None if not cal: return Response('', 404) + recipients = _cal_recipients(cal) + owner_id = cal.owner_id + cid = cal.id db.session.delete(cal) db.session.commit() + notify_calendar_change(owner_id, cid, 'deleted', shared_with=recipients) return Response('', 204) diff --git a/frontend/src/views/CalendarView.vue b/frontend/src/views/CalendarView.vue index c01cab6..47a5a7b 100644 --- a/frontend/src/views/CalendarView.vue +++ b/frontend/src/views/CalendarView.vue @@ -3,6 +3,7 @@

Kalender

+
@@ -21,7 +22,7 @@
- + + +
+
+ + + + + + +