Diary feed: the one a calendar can subscribe to has no deadlines; the one with deadlines needs a browser session #451
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
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#451
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?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, comparing the two whole-diary iCalendar feeds and the wiki page that describes them.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now atapplications/views.py:1038-1079(InterviewCalendarView.getanddated_days); the other locations have not moved.#238 put deadlines, closing dates and answers due into the diary feed, but only into the web view, which needs a signed-in browser. The API feed, the only one a calendar application can hold credentials for, still carries interviews alone. Somebody who subscribes their calendar gets interviews and never the dates #238 was about, and the wiki points them at a Subscribe button that does not exist.
api/routers/interviews.py:67-73,calendar_feed:ical.calendar(_queryset(request).upcoming(), url_for=...)with nodays=.applications/views.py:998-1039,InterviewCalendarView.getanddated_days: the only caller that builds the whole-day entries. The view inheritsOwnedObjectMixin, which is aLoginRequiredMixin(core/mixins.py:7), and answers withContent-Disposition: attachment.templates/applications/interview_list.html:28-30: the page offers a Calendar file download link, not a subscription.postulo.wiki/Tracking-applications.md:412-415: "interviews.ics— Subscribe on the interviews page — holds the deadlines and closing dates of the next six months"./api/v1/interviews/calendar.icswith a read token. The subscription refreshes, and it only ever holds interviews: no deadline, closing date or answer-by day appears. If they subscribe to the interviews page's address instead, the calendar application is sent to the sign-in page and receives HTML. The downloaded file does hold the dates, but it is a snapshot that never refreshes. The docstring ofdated_dayssays it exists "so the feed and the calendar page can never disagree"; the API feed disagrees with both.tests/test_deadlines.py:228-270); the API feed test (tests/test_interviews.py:696-697) checks only that aVEVENTis present.dated_daysout of the view into a function that takes the user and a function that makes an address absolute (inagendaorical, besideFEED_DAYS), and call it from bothInterviewCalendarView.getandcalendar_feed. Then correct the wiki: the interviews page offers a download, and the address to subscribe to is/api/v1/interviews/calendar.icswith a read-scoped token (The capture API already lists it).Related to #238 (closed), whose "include both in the ICS feed" reached only the feed a calendar application cannot subscribe to.
Done when
tests/test_deadlines.pyfetches/api/v1/interviews/calendar.icswith a read token for a user whose application has a deadline five days ahead, and findsDTSTART;VALUE=DATE:for that day; it fails today.