Sync reminders, and each application's submission and final response, with a CalDAV task list (VTODO) #12
Labels
No labels
bug
documentation
enhancement
performance
security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo-dav#12
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Over CalDAV, postulo-dav syncs interviews only: its parser drops
VTODO(src/postulo_dav/text.py), and the calendar it makes takesVEVENTalone (src/postulo_dav/dav.py), for good (RFC 4791 §5.2.3). The ask: "The TODO component (tasks) is what best resembles a application submission, an update, a final response, a reminder. Once again, 'paired' to Postulo element based on a URI."Only a reminder is an editable record of its own; a submission (a status change stamping
applied_at), a final response (an ending) and an update (an append-only timeline entry) are not, so those mappings are readings. "Based on a URI" is read as #7 settles it everywhere: list plus UID as the key, the task's address (which a move changes) a cache.What the plugin should do
A task list of its own, since that calendar cannot hold tasks: chosen by address in #13, with its own switch, or made by the first sync (never by Test or in read-only). A server without tasks gets a note, not a failed run. By their documentation (untried here), Nextcloud, Radicale, Fastmail and DAVx5's task apps carry tasks; Google CalDAV and upgraded iCloud Reminders do not, as the README should say.
Reminders, both ways:
SUMMARY,DUE,STATUS,COMPLETEDin UTC. From the phone, an edit changes the reminder, a movedDUEpostpones it, a tick completes it at its moment, an untick reopens it,CANCELLEDcompletes it. A task made in the list becomes a reminder, about an application if made under its task (RELATED-TO); one withoutDUE(optional in RFC 5545) stays unadopted, with a note. Done ones leave after 90 days (HISTORY), as interviews do. An interview's reminder, already its event'sVALARM, gets no task while events are on.Submission: a draft application has an
Apply to <role> at <company>task,DUEits deadline,COMPLETEDatapplied_at,CANCELLEDif withdrawn unsent. A tick filessuggest(..., suggested_status="applied")with the tick's moment asoccurred_at, which accepting stamps intoapplied_at; declined, the next run unticks it. Assuggestnever files oneexternal_idtwice, even once declined (src/postulo/applications/suggestions.pyin the core), the id is the UID plusCOMPLETED.Final response: a sent, open application has a
Hear back from <company> about <role>task,COMPLETEDwhen accepted or rejected,CANCELLEDwhen withdrawn or ghosted. An offer, not an ending, leaves it open.Writing tasks: only these properties are written; what else the phone set (
DESCRIPTION,CATEGORIES, its own alarms) is kept.PRIORITYgoes on milestone tasks from the application's, inverted (RFC 5545 §3.8.1.9: 1 highest, 9 lowest): high 1, normal 5, low 9. Nesting is tracked: aVALARM'sDESCRIPTIONnever lands on its task (the fault #11 fixes). A task deleted on the phone flags its link; the reminder stays. Deleting here removes only tasks Postulo made, and cancels the person's own.Decisions
change_statuson the surface, which postulo/postulo#331 advises against; a status-less suggestion.IN-PROCESS.REFID(RFC 9253) on an application's tasks, and its reminders under its open milestone task byRELATED-TO(RFC 5545 §3.8.4.5), which Nextcloud Tasks shows as subtasks (others unverified). Alternatives: a parent task per application; none.Needs from the core
Reminderand its services, for the reminder half. The milestone tasks need onlyApplication,suggestandSyncLink, all on the surface, so can come first.synclink_one_per_recordallows one twin per record per connection; an application may have two tasks and a deadline event (#11). Until then, one milestone task per application, moving to Hear-back once sent.New strings go through
uv run postulo-messages extract, fr-fr and pt-pt filled on the commit (the test gates them), the 23 EU catalogues before a tag (uv run pytest -m release). New surface names mean repinning the core (thepyproject.tomldev group pins1d6cdd7e0) and extendingtests/test_surface.py.Done when
In
tests/test_dav.py:DUE); a task made under an application's task becomes its reminder;applied_atwith the tick's moment, declining unticks it;VALARMnever overwrites a task'sDESCRIPTION; unwritten properties survive a push; Test and read-only make no list; a server without tasks leaves the rest syncing.From the list of DAV plugin improvements of 2026-09-30.
From postulo/postulo-dav#14, which closed with
32cca53: one thing it asked for can only be done here.A
LANGUAGEparameter found on a task made elsewhere survives a push. The parameter is a BCP 47 language tag (RFC 5545 §3.2.10), and this issue is where a task is patched instead of rebuilt, so it is where one that is already there must be kept as it was written. If Postulo ever writes one of its own, it writes the tag in its canonical form, as the core does since postulo/postulo#337 (pt-BR, notpt-br).Worth a test of its own here: a task carrying
LANGUAGE=pt-BRon a property comes back from a push with it.The maintainer's list of 2026-10-02 asks for iCalendar as the format for events and dated things. A core issue now covers part of this one: postulo/postulo#661.
It exports a reminder as a
VTODO(SUMMARY,DUE,STATUS,COMPLETED,RELATED-TOthe application), a mapping it offers on the plugin surface. It also proposes a storeduidonReminder, which has none today (src/postulo/applications/models.py:600in the core), because pairing by list and UID needs one. Both fit the reminders half of this issue.This issue keeps its own scope: the task list, the “Apply to” and “Hear back” tasks,
suggeston a tick, grouping, and writing only the properties Postulo owns.From the list of improvements of 2026-10-02.
From the status review of 2026-10-30: suggested order for this repository is this issue first (reminders and deadlines as tasks are what a phone shows every day), then #5 and #6 (WebDAV store and backup destination), which together make the plugin the Nextcloud integration most self-hosters look for.