No reviewers
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo!994
Loading…
Reference in a new issue
No description provided.
Delete branch "sec2-a2-contact-deletion"
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?
#956 (High): "Delete the letters they wrote as well" deleted other members' uploads
ContactDeleteViewreadreference_lettersthrough the contact with no owner filter, both to count and to delete. On a shared contact each member may hold their own letter from the referee, so the owner's tick deleted every member'sUploadedDocument. Both reads now go through oneown_letters()(the requester's rows), so the dialog count and the deletion are the deleter's only.#961 (Medium): data-protection branch skipped the copy others are promised
The
gdpr.is_offeredbranch returned beforeKeepsOthersCopies.form_valid, sodetach.after_losingnever ran anderase_contactcascaded other owners' careerReferencerows and unlinked their applications, appointments and letters. The copy step is nowKeepsOthersCopies.keep_others_copies()and runs first in the erasure branch, inside the same savepoint (a refused erasure rolls the copies back with the rest).erase_contact(contact, reader=None)counts the reader's rows only in the summary it shows.Tests
tests/security/test_sharing_sweep.py: a shared referee with letters from two members, the grantee also holding an application naming the contact and a careerReference; read and read/write grants, data-protection module on and off. They check that the grantee's upload survives, that the dialog counts one letter, that the summary mentions no application or letter of the grantee, and that the grantee'sReference, application and letter point at a copy they own. Without the fix 5 of the 6 cases fail (the copy case with the module off passed before, as that path was already right).Deviation:
Reference.save()refuses a referee that is not the owner's own, so the test builds the grantee'sReferenceand then repoints it withQuerySet.update, the state a grantee is left in; the model check is unchanged.Full unit suite: 18845 passed; the 25 failures of the first run were all translation/language tests (stale uncompiled catalogues in the fresh worktree), and the five files they sit in pass after
messages.py compile(384 passed). The browser suite was not run; no template or JS was touched.Wiki:
Files-and-what-you-sent.mdcommit 4736b81 (not pushed).Closes #956, Closes #961
🤖 Generated with Claude Code
c86767d4027ea2fec72f