Repository navigation
feat(registrations): approval-required registrations for free events - #663
Draft
harshtandiya wants to merge 11 commits into
Draft
harshtandiya wants to merge 11 commits into
harshtandiya wants to merge 11 commits into
Conversation
Organizers can require approval per ticket type, or for every ticket on the event. A registration that needs approval stays a draft booking with status Approval Pending: no tickets, no capacity taken. The organizer approves or declines it from a Pending tab on the Guests page, one at a time or in bulk. - Approving submits the booking. Capacity is checked then, so approving into a sold-out ticket type fails and the request stays pending. - Declining discards the booking. An optional message goes in the email. - Pending, approved and declined emails are always sent. - Guests can withdraw a pending request. A daily job expires requests whose event has ended. - Hosts get an in-app notification for each new request. - Turning approval off with requests waiting asks the organizer to keep, approve or decline them. - Approval is refused while the event has any priced ticket type or add-on. - Bookings that an organizer adds skip approval. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
Contributor
|
⏸️ UI Demo Check — paused while this is a draft. |
Contributor
Backend test coverage: 93%Commit 83f0268. Test modules are excluded. Coverage by file
106 empty files skipped. |
- Refuse a direct submit of a pending request. Frappe sets docstatus to 1 before before_submit runs, so the old guard never fired. - set_approval also needs ticketing write, since it saves the event or ticket type. - Approving still works after a ticket type stops selling, and is refused once the request carries a price. - A bulk decline skips requests that are no longer pending. - withdraw_booking doesn't reveal whether a booking exists. - A failed host notification or a failed expiry is logged and does not roll back the booking or the rest of the run. - The pending list is capped at 100, and its total counts every request. - Ticket rows show a "Requires approval" badge, and answers line up in a grid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
- Set the approval switch to a target state instead of toggling it, so a retried test doesn't turn approval back off. - Skip a new request when one is already pending. - Drop a label check that ran before the final step. - ensureTestTeam only writes Buzz Team Settings when the paid-events flag is off. Setups run in parallel, and their concurrent writes to the same row deadlocked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
…e ticket type cache Buzz Price.parent is a text column, so an integer filter made MariaDB compare numerically and fail on hash-named rows. The price was also changed in the database without refreshing the cached ticket type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
The server redirects every free booking, approval requests included, to /booking-success, which shows the pending notice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
Contributor
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
harshtandiya
marked this pull request as draft
October 25, 2026 20:56
…equests frappe-ui TabButtons renders a radio group. A retried test now declines the requester's earlier pending request first, since a guest can have only one pending request per event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
…alog opens The dialog that asks about waiting requests rendered behind the open drawer, so an organizer turning approval off for a ticket type could not see or click it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
…equests - A pending request renders as a normal guest row, with Approve and Decline icon buttons at its end. The custom card, its inline answers and the bulk selection bar are removed. - The guest drawer shows a request's answers, attendees and request time. A bordered section in it holds the Approve and Decline buttons. - The event-wide approval switch moves from the main column to an Approval tile in the Registration page's quick actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
- The drawer's approve/decline section is a frappe-ui Alert, with Approve and Decline as its actions. - The Pending row buttons are subtle green and red. - The "Copy check-in link" quick action is removed from the Guests page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
…a string The row's 'Open Approved Requester' button also matched 'Approve' as a substring, and decline_bookings rejects an integer event name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
Organizers can review registrations before guests get a ticket, as on Luma.
How it works
Approval Pending. No tickets are issued and no capacity is used. The guest sees "pending approval" and gets a pending email. The event's team gets an in-app notification.Limits
Demo
These screenshots were rendered from the dashboard with a mocked API.
Guests → Pending

Request in the guest drawer

Registration → Approval quick action

Turning approval off with requests waiting

Guest booking page while pending

Testing
buzz/api/booking/test_approvals.pyandbuzz/ticketing/doctype/event_booking/test_approval_booking.pycover the lifecycle, emails, the free-only rule, turn-off actions and permissions.bookingApproval.test.ts.e2e/tests/approval-registration.spec.tscovers request → approve, decline with a message, and turn-off with "Keep them pending".🤖 Generated with Claude Code
https://claude.ai/code/session_012a5qiK2oG4vUEFh3y5ybNC