A Calendar page beside Reminders: a month view of interviews and the other dated things of a search #204
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Postulo/postulo#204
Loading…
Add table
Add a link
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?
The change
A Calendar page, as a companion to Reminders: a full calendar view, month view by
default, showing job interviews and the other dated things of a search. What populates
it beyond interviews is decided later; this issue is the view.
What Postulo has today
Everything dated is a list, and the lists are in different places:
Interview,applications/models.py:507): a start, an end, a place,a kind, the people, an outcome, and a calendar
uid. Listed soonest-first byInterviewListView(views.py:514, past on request), reached from the dashboardrather than the navigation, and exported as iCalendar — one
.icsper interview and onefeed for all of them (
applications/ical.py,interview_calendaraturls.py:35),written by hand in UTC. The dav plugin pushes them to a CalDAV calendar called Postulo.
Reminder,:415): a sentence, a moment it is due, done or not,notified or not. A navigation item of its own (
navigation.py:76) and a list.deadline, a posting'scloses_at, and — once #202 exists — an employment office's appointments and itsdeclaration cadence.
Nothing draws a month. A person asking "what is on this week" opens two lists and reads
dates.
What a fix has to settle
applications:calendaror acalendarnamespace — with anavigation item beside Reminders, which means a
NavIteminnavigation.py, aplace in
HIDEABLEso it can be hidden like the rest, and a line intests/e2e/test_accessibility.py's walk sotest_page_coverage.pysees it visited.static/js/vendor:htmx and zxcvbn) and its content-security policy allows no inline script and no CDN
(
base.html:24-25, Accessibility in the wiki). A month grid is a table the server canrender — seven columns, a row per week, the days of the month in the person's time zone
(
core/middleware.py:32activatesProfile.time_zone) — with previous and next aslinks carrying
?month=2026-09, so it is bookmarkable and works with nothing loaded. Acalendar library is a decision to take deliberately if week or day views want one, not
a starting point.
title, a link, a kind for colour and words — that interviews and reminders fill now
and the rest can fill later without the page changing. The report has this pattern
already (
reports.Evidence). Interviews are spans (starts_attoends_at);reminders are moments; a deadline is a day. A reminder that is done is drawn as done,
not dropped.
a month grid at 390 pixels is thirty-one cells of nothing. Month first; the others are
the same events in another shape, and the request says month by default rather than
month only.
cannot hold five sentences; a count and the first one, with the day opening the agenda
for that day, is the usual answer. Decide it rather than truncate.
and deadlines makes "everything in this calendar as a feed" the obvious next ask, and
ical.pyis where it would go — later.:290-300);the calendar gets its section there, and the Getting started table of pages a row.
Not in this issue: what populates the calendar beyond interviews and reminders, creating
events from the calendar, or syncing anything.