feat(calendar): einzelnen Termin aus einer Reihe streichen
Beim Löschen eines Serientermins gibt es jetzt zwei Wege statt einem: "Nur diesen Termin" und "Ganze Reihe". Das sind zwei verschiedene Absichten, und sie sind nicht ineinander umkehrbar -- eine einzelne Ja/Nein-Rückfrage musste sich bisher für eine davon entscheiden, und die andere war gar nicht erreichbar. "Nur diesen" wird als EXDATE in der Reihe vermerkt, so wie das iCalendar-Format eine Ausnahme ausdrückt: Die Reihe behält ihre Regel und ihre UID, jeder CalDAV-Client versteht es ohne Zutun. Bewusst nicht über ein Aufspalten in zwei Reihen gelöst -- das änderte die UID, und alle Geräte hielten den Rest für einen neuen Termin. Ein zweites Streichen desselben Termins bleibt folgenlos (sonst liefe die Datei mit der Zeit mit doppelten EXDATE-Zeilen voll), und bei einem Einzeltermin ohne Wiederholung sind beide Wege dasselbe -- der Server löscht dann einfach, statt den Aufrufer mit einer Unterscheidung zu behelligen, die es dort nicht gibt. Selbsttest um sechs Prüfungen erweitert (25 grün): Reihe steht, Streichen liefert 204, der gestrichene Termin fehlt und der Rest bleibt, EXDATE steht im .ics, zweimal Streichen ist harmlos, ganze Reihe löschen räumt alles weg. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
0c9cc69493
commit
688bb13bde
6 files changed
+223
-13
No files matched your search
@@ -167,6 +167,34 @@ check("Bearbeiten erlaubt (200)", st == 200, st)
|
||||
got = starts("T monat wochentag")
|
||||
check("jetzt jeden 2. Monat, 1. Freitag", got == ["2026-09-04", "2026-11-06", "2027-01-01"], got)
|
||||
|
||||
print("\n── Aus einer Reihe einen einzelnen Termin streichen ──")
|
||||
create(summary="T ausnahme", start="2026-10-05T08:00:00Z",
|
||||
end="2026-10-05T09:00:00Z", all_day=False,
|
||||
recurrence={"freq": "WEEKLY", "interval": 1, "count": 4})
|
||||
check("Reihe steht", starts("T ausnahme") == ["2026-10-05", "2026-10-12",
|
||||
"2026-10-19", "2026-10-26"],
|
||||
starts("T ausnahme"))
|
||||
serie = [e for e in events("2026-10-01T00:00:00Z", "2026-11-01T00:00:00Z")
|
||||
if e["summary"] == "T ausnahme"][1] # der zweite Termin
|
||||
st, _ = api("DELETE", f"{EV}/{serie['uid']}?occurrence={serie['start']}", None, CSRF)
|
||||
check("nur diesen streichen (204)", st == 204, st)
|
||||
got = starts("T ausnahme")
|
||||
check("der 12. fehlt, Rest bleibt",
|
||||
got == ["2026-10-05", "2026-10-19", "2026-10-26"], got)
|
||||
|
||||
st, ics = api("GET", f"/api/v1/calendars/{CAL}/export", raw=True)
|
||||
blk = [b for b in ics.split("BEGIN:VEVENT") if "T ausnahme" in b]
|
||||
check("als EXDATE im .ics vermerkt",
|
||||
blk and any("EXDATE" in l and "20261012" in l for l in blk[0].splitlines()),
|
||||
[l for l in (blk[0].splitlines() if blk else []) if "EXDATE" in l])
|
||||
|
||||
st, _ = api("DELETE", f"{EV}/{serie['uid']}?occurrence={serie['start']}", None, CSRF)
|
||||
check("zweimal streichen bleibt harmlos", st == 204 and starts("T ausnahme") ==
|
||||
["2026-10-05", "2026-10-19", "2026-10-26"], starts("T ausnahme"))
|
||||
|
||||
st, _ = api("DELETE", f"{EV}/{serie['uid']}", None, CSRF)
|
||||
check("ganze Reihe löschen", st == 204 and starts("T ausnahme") == [], starts("T ausnahme"))
|
||||
|
||||
print("\n── Zeitfenster begrenzt wirklich ──")
|
||||
win = [e for e in events("2026-09-14T00:00:00Z", "2026-09-20T00:00:00Z")
|
||||
if e["summary"] == "T wochentage"]
|
||||
|
||||
Reference in new issue
Block a user