Uh oh!
There was an error while loading. Please reload this page.
feat(proposals): speakers can see and edit their talk proposals - #274
Conversation
Guest form submissions leave owner/submitted_by as Guest, so speakers could never see their own proposals. Row-level access now derives from the speakers child table: permission_query_conditions scopes list queries and a has_permission hook guards single documents, replacing the if_owner restriction on Buzz User. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Returns proposals where the session user is the submitter or a listed speaker, so the dashboard list stays personal even for roles that can read all proposals. Rows are validated through a pydantic model. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
useList with a submitted_by filter missed guest-submitted proposals and co-speaker talks; the API scopes rows to submitter-or-speaker server-side. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Greptile SummaryThis PR lets registered speakers view and edit talk proposals submitted as guests. The main changes are:
Confidence Score: 5/5This looks safe to merge.
|
| Filename | Overview |
|---|---|
| buzz/proposals/doctype/talk_proposal/talk_proposal.py | Adds query and document permission checks for submitters, owners, speakers, and managers. |
| buzz/api/proposals.py | Adds a typed endpoint returning proposals submitted by or associated with the current user. |
| buzz/hooks.py | Registers the new Talk Proposal permission hooks. |
| dashboard/src/pages/ProposalsList.vue | Uses the personal-proposals endpoint and scopes its resource cache by session user. |
| dashboard/src/pages/Account.vue | Makes the Talk Proposals tab available without a submitter-only precheck. |
| buzz/proposals/doctype/talk_proposal/test_talk_proposal.py | Adds permission tests for speakers, submitters, managers, unrelated users, and mixed-case emails. |
| buzz/api/test_proposals.py | Adds endpoint tests for proposal visibility and response shape. |
Reviews (4): Last reviewed commit: "Merge branch 'develop' into feat/speaker..." | Re-trigger Greptile
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
The Talk Proposals tab is always shown, so the useList existed only for a commented-out conditional and needlessly delayed the unknown-tab redirect settle check. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Speaker email match in has_permission is now case-insensitive: user emails are stored lowercase while guest-entered speaker emails keep their casing. The proposals list cache key is scoped to the session user again so a user switch cannot serve stale rows. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
harshtandiya
commented
Jul 22, 2026
Review findings actioned in 2b9f5c3:
🤖 Generated with Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Backport branch created but failed to create PR. (see action log for full response) |
Successfully created backport PR for |
feat(proposals): speakers can see and edit their talk proposals (#274) * feat(proposals): let speakers access talk proposals via speaker email Guest form submissions leave owner/submitted_by as Guest, so speakers could never see their own proposals. Row-level access now derives from the speakers child table: permission_query_conditions scopes list queries and a has_permission hook guards single documents, replacing the if_owner restriction on Buzz User. * feat(api): add get_my_proposals endpoint with typed response Returns proposals where the session user is the submitter or a listed speaker, so the dashboard list stays personal even for roles that can read all proposals. Rows are validated through a pydantic model. * feat(dashboard): list proposals via get_my_proposals API useList with a submitted_by filter missed guest-submitted proposals and co-speaker talks; the API scopes rows to submitter-or-speaker server-side. * chore(dashboard): drop unused proposals fetch from Account page The Talk Proposals tab is always shown, so the useList existed only for a commented-out conditional and needlessly delayed the unknown-tab redirect settle check. * chore(dashboard): inline Talk Proposals tab into static tab list * fix(proposals): address review findings on speaker access Speaker email match in has_permission is now case-insensitive: user emails are stored lowercase while guest-entered speaker emails keep their casing. The proposals list cache key is scoped to the session user again so a user switch cannot serve stale rows. --------- (cherry picked from commit 45a7887) Co-authored-by: Harsh Tandiya <harsh.tandiya@gmail.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Problem
Guest form submissions store
submitted_by(andowner) asGuest. The dashboard listed proposals bysubmitted_by = session.user, and theif_ownerDocPerm restricted reads toowner = user— so speakers who submitted as guest and created an account later could never see or edit their proposals, even though their email is right there in thespeakerschild table.Fix
Visibility now derives from the
speakerschild table (any listed speaker email), plus submitter/owner:permission_query_conditionsscopes list queries,has_permissionguards single-document read/write. System Manager / Event Manager stay unrestricted. Replaces theif_ownerrestriction on Buzz User (which hooks cannot override and which blocked guest-owned docs).buzz.api.proposals.get_my_proposals— typed (pydantic) endpoint returning proposals where the session user is submitter or listed speaker, so the dashboard tab stays personal even for managers who can read everything.ProposalsList.vue— swapsuseList+submitted_byfilter for the new API.Tests
TDD — 10 new integration tests (
test_talk_proposal.py,test_proposals.py) covering speaker read/write/list on guest-submitted proposals, submitter-without-speaker-row, non-speaker denial, and manager access.buzz.api.test_formsstill green.Note: speaker emails are self-reported on guest forms, so anyone listed as speaker gains view/edit on that proposal — same trust level as the form itself, flagged as a conscious call.
🤖 Generated with Claude Code