feat(tasks): implement clear_due_date via FiZ \$empty sentinel (v0.4.16)

The Family Wall API (FiZ framework) uses the special string "\$empty"
to clear optional date fields. Sending dueDate=\$empty to taskupdate2
reliably removes the due date (verified via direct API probing).

- update_task(clear_due_date=True) now sends dueDate=\$empty instead
  of returning an error
- Remove the "not supported" limitation message from the docstring
- Update SPEC.md, README.md, CLAUDE.md to document the discovery
- Bump version to 0.4.16

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-16 10:57:21 +02:00
parent 6c955d67c8
commit 0517241ee5
6 changed files with 39 additions and 37 deletions
+23 -18
View File
@@ -315,28 +315,33 @@ Hinweis: `taskListId` ist optional ohne diesen Parameter bleibt der Task in
**Response-Struktur:** kein spezifischer Rückgabewert Erfolg = kein `ex`/`un`-Key auf Top-Level.
**dueDate Clearing nicht implementierbar (Stand: April 2026):**
**dueDate Clearing `"$empty"` Sentinel (verifiziert April 2026, v0.4.16):**
Ausgiebig getestete Werte für `dueDate`, die alle fehlschlugen:
Der FiZ-Framework verwendet den Sentinel-Wert `"$empty"` um optionale Felder zu leeren.
```
POST taskupdate2
metaId=task/23431854_726333919&dueDate=$empty
→ dueDate wird auf null gesetzt ✓
```
`update_task(clear_due_date=True)` sendet intern `dueDate=$empty`.
**Getestete Werte die fehlschlugen (vor der Lösung):**
| Wert | API-Response |
|---|---|
| `""` (leerer String) | `a00.un.un: " is not a valid Date"` |
| `"null"` | `a00.un.un: "Cannot parse date val=null"` |
| `"0"` | API-Fehler (ungültiges Datum) |
| `"-1"` | `a00.un.un: "-1 is not a valid Date"` |
| `"remove"` / `"clear"` | `a00.un.un: "Cannot parse date val=..."` |
| `"0000-00-00T00:00:00"` | API-Fehler |
| `"1970-01-01T00:00:00"` | **Erfolgreich** setzt dueDate auf Unix-Epoch (kein echtes Clearing!) |
| Separate Parameter (`removeDueDate`, `clearDueDate`, `clearFields`) | werden ignoriert, dueDate bleibt unverändert |
| Feld weglassen (kein `dueDate` in Request) | dueDate bleibt unverändert |
| `""` (leerer String) | `a00.un: " is not a valid Date"` |
| `"null"` | `a00.un: "Cannot parse date val=null"` |
| `"undefined"` | `a00.un: "Cannot parse date val=undefined"` |
| `"0"`, `"-1"` | `a00.un: "... is not a valid Date"` |
| `"remove"` / `"clear"` | `a00.un: "Cannot parse date val=..."` |
| `"1970-01-01T00:00:00"` | Erfolgreich setzt dueDate auf Unix-Epoch (kein Clearing!) |
| Feld weglassen | dueDate bleibt unverändert |
| `removeDueDate=1`, `clearDueDate=1` | werden ignoriert |
**Wichtig:** Die Fehler werden als `a00.un.un` zurückgegeben (nicht Top-Level `un`).
Der `fw_client` prüfte ursprünglich nur Top-Level `un` → silent fail (ab v0.4.15 behoben:
`a00.un` wird ebenfalls erkannt und als `FamilyWallError` geworfen).
Das `dueDate`-Feld kann einmal gesetzt nicht mehr entfernt werden.
`update_task(clear_due_date=True)` gibt eine klare Fehlermeldung zurück.
**Wichtig:** Die Fehler werden als `a00.un` zurückgegeben (nicht Top-Level `un`).
Ab v0.4.15 erkennt `fw_client` diese und wirft `FamilyWallError`.
### `taskmark` Task als erledigt/offen markieren
POST https://api.familywall.com/api/taskmark
@@ -543,4 +548,4 @@ AND `moodStarShortcut: false` AND `moodMap: {}`.
- ~~`taskcreate2` / `taskupdate2`: Zuweisung-Parameter~~ → **`assignee`** (Member-ID String; mehrere Werte = mehrfach senden); gespeichert als `assigneeIds[]` (verifiziert)
- ~~`taskupdate2`: Task verschieben~~ → **`taskListId`** als optionaler Parameter setzt neue Liste (verifiziert)
- `taskupdate2`: Alle Zuweisungen entfernen (leere `assignee`-Liste) → noch nicht verifiziert
- ~~`taskupdate2`: `dueDate` entfernen (Clearing)~~**nicht möglich** (verifiziert, April 2026) — alle getesteten Werte werden als ungültiges Datum abgelehnt (siehe unten)
- ~~`taskupdate2`: `dueDate` entfernen (Clearing)~~**`dueDate=$empty`** (FiZ-Sentinel, verifiziert April 2026, v0.4.16)