Applications → bulk Move to status: the person's own username is recorded as the actor, so each timeline says \"via alex\ #410
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#410
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 every caller ofchange_statusand what it passes asactor.Checked again on 2026-10-01 against
mainat0a5cad587: still present.ApplicationEvent.actoris for entries written by something other than the person at the keyboard: an API token, a plugin, an import. The bulk status action on the Applications table fills it with the person's own username, so a move they made themselves in the browser is labelled as if something else made it, and the same act is recorded two ways depending on which button they pressed.applications/views.py:328(ApplicationBulkView._status:change_status(application, wanted, actor=str(request.user))); the field's contract atapplications/models.py:561-563("Who wrote it when it was not the person at the keyboard … Blank means the person themselves"); the marker attemplates/applications/partials/timeline.html:44-48.User.__str__returns the username (accounts/models.py:127-128), so each of the ten entries storesactor="alex", and each timeline shows the move followed by "via alex", the muted marker that elsewhere means "API token laptop-agent" or "imap plugin". The single status card (ApplicationStatusView.post,applications/views.py:543), the board and the edit form pass no actor for the same move.actorgets it too: the API's event payloads (api/schemas.py:677,:706), the export (core/export.py:213,:226), and thestatus_changednotification data handed to notifier plugins (notifications/slow.py:176). Anything that uses a non-blank actor to tell automation from the person counts bulk moves as automated.actorargument in_status, as every other browser path does. If the bulk origin is worth keeping, say it in the entry's note, not inactor.Done when
tests/security/test_bulk_actions.py, besidetest_a_status_change_writes_a_timeline_entry, asserts that the entry a bulk status move writes hasactor == ""; it fails today with the username.