docs(calendar): Kalender im README und Stand im Plan nachtragen
Der Kalender kam im README bislang mit keinem Wort vor -- weder in der
Phasentabelle noch als Abschnitt, obwohl er ein eigener Zugangsweg mit
eigener Anmeldung ist. Jetzt steht er neben WebDAV, wo er hingehoert:
gleiche Adresse-plus-App-Passwort-Logik, gleiche Sperre nach zehn
Fehlversuchen.
Zwei Dinge stehen dort ausdruecklich, weil sie beim Einrichten sonst
eine halbe Stunde Suche kosten:
- Die Kalenderfarbe holt DAVx5 nur beim Erfassen der Sammlungen, nicht
bei jedem Abgleich. Sie bleibt im Telefon alt, bis man dort einmal
"Kalenderliste aktualisieren" antippt. Am Geraet nachgemessen.
- Kalender verwalten kann die Kalender-App des Telefons gar nicht;
Android ueberlaesst das der Sync-App.
Im Plan die Phasen 1 bis 3 auf erledigt, und darunter das, was ueber die
Phasen hinaus dazukam, weil es sich beim Pruefen als noetig erwies:
Umhaengen, EXDATE, getctag/calendar-color, Kalenderverwaltung vom Client
aus, die beiden Selbsttests.
Abbild veroeffentlicht als 2026.09.06 und latest.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
f71ab710e1
commit
ac61df9796
2 files changed
+81
-5
No files matched your search
@@ -507,6 +507,52 @@ hunderte pro Minute.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Kalender (CalDAV)
|
||||||
|
|
||||||
|
Adresse: `https://<deine-domain>/caldav/` – oder gar nichts eintippen und die
|
||||||
|
automatische Einrichtung über `/.well-known/caldav` laufen lassen, die jeder
|
||||||
|
verbreitete Client von selbst versucht.
|
||||||
|
|
||||||
|
Angemeldet wird sich wie bei WebDAV mit **Benutzername und App-Passwort**; das
|
||||||
|
Kontopasswort wird auch hier abgewiesen. Dieselbe Sperre nach zehn
|
||||||
|
Fehlanmeldungen gilt ebenfalls.
|
||||||
|
|
||||||
|
Was geht:
|
||||||
|
|
||||||
|
- **Termine** lesen und schreiben, mit Wiederholungen, Ausnahmen einzelner
|
||||||
|
Termine (`EXDATE`), Ganztagsterminen und Zeitzonen.
|
||||||
|
- **Mehrere Kalender**, jeder mit Name und Farbe. Anlegen, umbenennen,
|
||||||
|
umfärben und löschen geht in der Weboberfläche **und** vom Client aus
|
||||||
|
(`MKCALENDAR`, `MKCOL`, `PROPPATCH`, `DELETE`).
|
||||||
|
- **Termin in einen anderen Kalender umhängen**, ohne dass er dabei seine
|
||||||
|
Kennung verliert – für Clients derselbe Termin an neuer Adresse, kein neuer.
|
||||||
|
- **Farben** in beide Richtungen: die des Kalenders (`calendar-color`) und die
|
||||||
|
einzelner Termine (`COLOR` nach RFC 7986, als CSS3-Name, weil DAVx5 sie so
|
||||||
|
liest).
|
||||||
|
- **Im- und Export** ganzer Kalender als `.ics`.
|
||||||
|
|
||||||
|
Zwei Dinge, die man beim Einrichten wissen sollte:
|
||||||
|
|
||||||
|
**Die Kalenderfarbe holt DAVx5 nur beim Erfassen der Sammlungen**, nicht bei
|
||||||
|
jedem Abgleich. Ändert sich die Farbe hier, bleibt sie im Telefon so lange
|
||||||
|
alt, bis man dort einmal *Kalenderliste aktualisieren* (⟳) antippt. Das ist
|
||||||
|
kein Fehler, sondern DAVx5' Sparsamkeit – kostet aber eine halbe Stunde
|
||||||
|
Suche, wenn man es nicht weiß.
|
||||||
|
|
||||||
|
**Kalender verwalten kann die Kalender-App des Telefons nicht.** Android
|
||||||
|
überlässt das der Sync-App: Anlegen und Löschen geschieht in DAVx5 selbst,
|
||||||
|
nicht in der Samsung- oder Google-Kalender-App.
|
||||||
|
|
||||||
|
Noch nicht da: `sync-collection` (RFC 6578). Jeder Abgleich holt deshalb die
|
||||||
|
volle Terminliste statt nur der Änderungen – richtig, aber sparsamer ginge es.
|
||||||
|
Ebenso offen: Aufgaben (`VTODO`) in der Weboberfläche und das Teilen von
|
||||||
|
Kalendern mit anderen Nutzern.
|
||||||
|
|
||||||
|
Zwei Selbsttests decken den Bereich ab, einer je Zugangsweg – siehe
|
||||||
|
[`TESTING.md`](TESTING.md).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Office (Collabora / OnlyOffice / Euro-Office)
|
## Office (Collabora / OnlyOffice / Euro-Office)
|
||||||
|
|
||||||
Aether ist **WOPI-Host**. Das ist die Schnittstelle, über die Office-Server
|
Aether ist **WOPI-Host**. Das ist die Schnittstelle, über die Office-Server
|
||||||
@@ -850,5 +896,6 @@ kostet einen Container und eine Zeile `.env`, nicht mehr.
|
|||||||
| 6 | Dokumente: OCR + Volltextsuche ✅, Etiketten ✅, Absender ✅, PDF-Betrachter ✅ – Inbox vertagt | 🔄 |
|
| 6 | Dokumente: OCR + Volltextsuche ✅, Etiketten ✅, Absender ✅, PDF-Betrachter ✅ – Inbox vertagt | 🔄 |
|
||||||
| 7 | Office (WOPI-Host, Collabora / OnlyOffice) – [Anleitung](#office-collabora--onlyoffice) | ✅ (im Test) |
|
| 7 | Office (WOPI-Host, Collabora / OnlyOffice) – [Anleitung](#office-collabora--onlyoffice) | ✅ (im Test) |
|
||||||
| 8 | Härtung, 2FA, Observability, Extension-Points | 🔲 |
|
| 8 | Härtung, 2FA, Observability, Extension-Points | 🔲 |
|
||||||
|
| — | [Kalender](#kalender-caldav): CalDAV, mehrere Kalender, Weboberfläche (Monat/Woche/Liste) – `sync-collection`, Aufgaben und Teilen offen | ✅ (im Test) |
|
||||||
|
|
||||||
> Manuelle Test-Checkliste für die fertigen Phasen: siehe [`TESTING.md`](TESTING.md).
|
> Manuelle Test-Checkliste für die fertigen Phasen: siehe [`TESTING.md`](TESTING.md).
|
||||||
+34
-5
@@ -81,14 +81,34 @@ Die abgeleiteten Spalten sind nur zum Vorsortieren da.
|
|||||||
|
|
||||||
## Phasen
|
## Phasen
|
||||||
|
|
||||||
| | Inhalt | Aufwand |
|
| | Inhalt | Stand |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| **1** | CalDAV lesend und schreibend, ein Kalender, Anmeldung über App-Passwörter, Auffindpfade (`/.well-known/caldav`, `current-user-principal`, `calendar-home-set`). Ziel: DAVx5 gleicht ab. | 1–2 Abende |
|
| **1** | CalDAV lesend und schreibend, ein Kalender, Anmeldung über App-Passwörter, Auffindpfade (`/.well-known/caldav`, `current-user-principal`, `calendar-home-set`). Ziel: DAVx5 gleicht ab. | ✅ |
|
||||||
| **2** | Mehrere Kalender, Farbe, Umbenennen, Löschen. Export als `.ics`, Import einer bestehenden Datei. | 1 Abend |
|
| **2** | Mehrere Kalender, Farbe, Umbenennen, Löschen. Export als `.ics`, Import einer bestehenden Datei. | ✅ |
|
||||||
| **3** | Weboberfläche in Aether: Monat, Woche, Liste; Termin anlegen, ändern, löschen. Der Teil, der Spaß macht – und dessen Fehler man **sieht**. | 2–3 Abende |
|
| **3** | Weboberfläche in Aether: Monat, Woche, Liste; Termin anlegen, ändern, löschen. Der Teil, der Spaß macht – und dessen Fehler man **sieht**. | ✅ |
|
||||||
| **4** | `sync-collection` statt Vollabgleich, Aufgabenansicht, Teilen mit anderen Nutzern, öffentlicher Abo-Link, Kalender in der HoneyOS-Leiste. | offen |
|
| **4** | `sync-collection` statt Vollabgleich, Aufgabenansicht, Teilen mit anderen Nutzern, öffentlicher Abo-Link, Kalender in der HoneyOS-Leiste. | offen |
|
||||||
| **5** | Kontakte (CardDAV). Dieselbe Maschinerie, dieselbe Bibliothek – und **einfacher**, weil es dort keine Wiederholungen gibt. | später entscheiden |
|
| **5** | Kontakte (CardDAV). Dieselbe Maschinerie, dieselbe Bibliothek – und **einfacher**, weil es dort keine Wiederholungen gibt. | später entscheiden |
|
||||||
|
|
||||||
|
Über die Phasen hinaus dazugekommen, weil es sich beim Prüfen als nötig
|
||||||
|
erwies:
|
||||||
|
|
||||||
|
- **Termin umhängen** in einen anderen Kalender, unter Erhalt der UID – per
|
||||||
|
Ziehen in der Oberfläche, am Handy mit langem Drücken.
|
||||||
|
- **Einzelnen Termin aus einer Reihe streichen** (`EXDATE`), statt nur die
|
||||||
|
ganze Reihe löschen zu können.
|
||||||
|
- **`getctag` und `calendar-color`**, die go-webdav nicht kennt: aus der
|
||||||
|
Anfrage genommen und der Antwort selbst wieder angehängt
|
||||||
|
(`internal/calendar/propfind.go`).
|
||||||
|
- **Kalender vom Client aus verwalten** – `MKCALENDAR`, erweitertes `MKCOL`,
|
||||||
|
`PROPPATCH`, `DELETE` einer Sammlung (`internal/calendar/collections.go`).
|
||||||
|
Dafür Migration 23: Bei `MKCALENDAR` sucht der Client die Adresse aus, die
|
||||||
|
seither in `path_segment` steht. Leer = es gilt weiterhin die UUID, damit
|
||||||
|
eingerichtete Geräte ihre Kalender unter der gewohnten Adresse behalten.
|
||||||
|
- **Zwei Selbsttests**, einer je Zugangsweg: `scripts/kalender-selbsttest.py`
|
||||||
|
(JSON, 36 Prüfungen) und `scripts/caldav-selbsttest.py` (CalDAV, 62). Beide
|
||||||
|
Wege führen auf dieselben Daten, aber über völlig verschiedenen Code – ein
|
||||||
|
grüner Lauf des einen sagt nichts über den anderen.
|
||||||
|
|
||||||
## Teilen – drei Bedeutungen, zwei davon gehen
|
## Teilen – drei Bedeutungen, zwei davon gehen
|
||||||
|
|
||||||
„Geteilter Kalender" meint je nach Person etwas anderes:
|
„Geteilter Kalender" meint je nach Person etwas anderes:
|
||||||
@@ -237,7 +257,16 @@ Zwei verschiedene Dinge, die man leicht verwechselt:
|
|||||||
de-facto-Standard: Nextcloud, Thunderbird und DAVx5 können es. **Geht.**
|
de-facto-Standard: Nextcloud, Thunderbird und DAVx5 können es. **Geht.**
|
||||||
- **Farbe eines einzelnen Termins** – `COLOR` aus RFC 7986. In unserer eigenen
|
- **Farbe eines einzelnen Termins** – `COLOR` aus RFC 7986. In unserer eigenen
|
||||||
Oberfläche jederzeit möglich; wie weit DAVx5 und Samsung Kalender das
|
Oberfläche jederzeit möglich; wie weit DAVx5 und Samsung Kalender das
|
||||||
weiterreichen, ist offen und muss am Gerät geprüft werden.
|
weiterreichen, ist offen und muss am Gerät geprüft werden. Geschrieben wird
|
||||||
|
sie als CSS3-**Name** (`tomato`), nicht als Hex-Wert – so verlangt es RFC
|
||||||
|
7986, und so liest DAVx5 sie. Der genaue Wert steht zusätzlich in
|
||||||
|
`X-AETHER-COLOR`, damit die eigene Palette verlustfrei zurückkommt.
|
||||||
|
|
||||||
|
**Am Gerät geprüft (06.09.2026):** Die Kalenderfarbe kommt an – aber erst,
|
||||||
|
nachdem in DAVx5 einmal *Kalenderliste aktualisieren* angetippt wurde. Beim
|
||||||
|
normalen Abgleich fragt DAVx5 `calendar-color` gar nicht ab; ein Mitschnitt
|
||||||
|
der Anfragen hat das gezeigt. Wer das nicht weiß, sucht den Fehler auf der
|
||||||
|
Serverseite, wo keiner ist.
|
||||||
|
|
||||||
**Emojis im Kalendernamen** sind kein Protokollthema – der Name ist Text.
|
**Emojis im Kalendernamen** sind kein Protokollthema – der Name ist Text.
|
||||||
„🏠 Haushalt" kommt überall an.
|
„🏠 Haushalt" kommt überall an.
|
||||||
|
|||||||
Reference in new issue
Block a user