Calendar: an interview nobody came to is announced to screen readers as a cancelled interview #453
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#453
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, reading how the calendar says an event's state in words.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now atapplications/agenda.py:219(themuted=line inevents_between),applications/agenda.py:95-116(SPOKENand its comment),applications/agenda.py:181-187(Event.said) andtemplates/applications/calendar.html:42(thesr-onlyspan);applications/services.pyandapplications/ical.pyhave not moved.The calendar mutes an interview when it was cancelled and when the other side did not show up, and the hidden words it reads out are keyed only on whether the event is muted. So a no-show is read as "Cancelled interview:". On screen both are only struck through, which makes the spoken prefix the one place the state is stated, and for a no-show it states the wrong outcome.
applications/agenda.py:203inevents_between:muted=interview.outcome in {InterviewOutcome.CANCELLED, InterviewOutcome.NO_SHOW}.SPOKEN(:95-106) maps(INTERVIEW, True)to_("Cancelled interview:"), andEvent.said(:165-171) looks it up by(kind, muted)alone. Drawn as ansr-onlyspan attemplates/applications/calendar.html:35. The comment aboveSPOKENsays ""cancelled interview" and "interview" are different facts".InterviewOutcome.NO_SHOW) is read out as "Cancelled interview: Aperture Science". The rest of Postulo keeps the two apart:settle_interviewwrites an interview entry for a no-show and an interview cancelled entry for a cancellation (applications/services.py:505-524), and the diary file marks a no-showCONFIRMED, notCANCELLED(applications/ical.py:42-47).statefield ("cancelled","no_show","done") thatsaidreads before falling back tomuted, and add a translated prefix such as_("Interview nobody came to:")for a no-show. Decide at the same time whether a no-show should be muted at all, given the diary file treats it as having happened.Related to #274 (closed), which added the spoken state for muted events but keyed it on muted alone.
Done when
tests/test_calendar.pysettles an interview asInterviewOutcome.NO_SHOWand asserts that itsEvent.saidis not the cancelled prefix, and that a cancelled one still is; it fails today.