-
Notifications
You must be signed in to change notification settings - Fork 27
feat: link event ticket to zoom webinar registration and display join URL #114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
… URL - Add zoom_webinar_registration custom field on Event Ticket - Store registration reference when creating Zoom registration on ticket submit - Return zoom_join_url in get_ticket_details API - Display "Webinar Access" section with join button in ticket details frontend Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
📝 WalkthroughWalkthroughThis change integrates Zoom webinar functionality with the event ticketing system. It adds a custom field to link tickets with Zoom webinar registrations, stores the registration reference when created, fetches the join URL in the API response, and displays webinar access details in the ticket UI. Changes
Sequence DiagramsequenceDiagram
participant User
participant Ticket as Event Ticket
participant Registration as Zoom Registration
participant API as Backend API
participant UI as Ticket Details UI
User->>Ticket: Create ticket
Ticket->>Registration: Create Zoom registration
Registration-->>Ticket: Registration created
Ticket->>Ticket: Store registration reference
User->>API: Fetch ticket details
API->>Ticket: Query ticket data
Ticket-->>API: Ticket with registration ref
API->>Registration: Fetch join_url & webinar
Registration-->>API: Return webinar metadata
API-->>UI: Return ticket + zoom_join_url
UI->>UI: Render Webinar Access section
User->>UI: Click join link
UI->>User: Open Zoom URL in new tab
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
buzz/api.py (1)
726-737: Consider wrapping in try-except for robustness when zoom_integration is not installed.If
zoom_integrationapp is uninstalled but tickets still havezoom_webinar_registrationreferences,frappe.db.get_value("Zoom Webinar Registration", ...)will raise an error since the DocType won't exist.♻️ Suggested defensive handling
# Get Zoom webinar join URL if applicable details.zoom_join_url = None + details.zoom_webinar = None if hasattr(ticket_doc, "zoom_webinar_registration") and ticket_doc.zoom_webinar_registration: - zoom_registration = frappe.db.get_value( - "Zoom Webinar Registration", - ticket_doc.zoom_webinar_registration, - ["join_url", "webinar"], - as_dict=True, - ) - if zoom_registration: - details.zoom_join_url = zoom_registration.join_url - details.zoom_webinar = zoom_registration.webinar + try: + zoom_registration = frappe.db.get_value( + "Zoom Webinar Registration", + ticket_doc.zoom_webinar_registration, + ["join_url", "webinar"], + as_dict=True, + ) + if zoom_registration: + details.zoom_join_url = zoom_registration.join_url + details.zoom_webinar = zoom_registration.webinar + except Exception: + pass # zoom_integration app may not be installed
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
buzz/api.pybuzz/install.pybuzz/ticketing/doctype/event_ticket/event_ticket.pydashboard/src/pages/TicketDetails.vue
🧰 Additional context used
📓 Path-based instructions (2)
**/*.vue
📄 CodeRabbit inference engine (.github/instructions/frappe-ui.instructions.md)
**/*.vue: UsecreateResource()from frappe-ui to make backend API calls with configuration for url, params, and methods likefetch()andsubmit()in Vue components
UsecreateDocumentResource()to manage individual document records with support for whitelisted methods, events (onError, onSuccess, transform), and methods likereload(),setValue(),delete(), and custom whitelisted method calls
UseuseList()hook to create a list resource for fetching records of a DocType from Frappe backend with options for fields, filters, orderBy, pageLength, caching, and events (onError, onSuccess, transform)
UseListViewcomponent with propscolumns,rows,row-key, andoptionsto render tabular data with support for selection, tooltips, resizable columns, and custom rendering slots
Define ListView columns with requiredlabelandkeyproperties, optionalwidth(as multiplier or px/rem),align(start/left, center/middle, end/right), and custom attributes for rendering
Define ListView rows with unique identifier matching therow-keyprop, and field values as strings or objects withlabelproperty for custom rendering
For grouped ListView rows, structure data as array of objects withgroupstring,collapsedboolean, androwsarray containing row objects
UseBadgecomponent with propsvariant('solid', 'subtle', 'outline', 'ghost'),theme('gray', 'blue', 'green', 'orange', 'red'), andsize('sm', 'md', 'lg') for displaying status indicators
UseFormControlcomponent withtypeprop ('text', 'number', 'email', 'date', 'password', 'search', 'textarea', 'select', 'autocomplete', 'checkbox'),size('sm', 'md', 'lg', 'xl'),variant('subtle', 'outline'), and optionalprefixandsuffixslots
Usetoastfrom frappe-ui for notifications with methodstoast.success(),toast.warning(), andtoast.error()to provide user feedback
UseDropdowncomponent withoptionsprop containing action items withlabel,icon(lucide i...
Files:
dashboard/src/pages/TicketDetails.vue
{main.js,**/*.vue}
📄 CodeRabbit inference engine (.github/instructions/frappe-ui.instructions.md)
For Options API components using resources, register the
resourcesPluginin main.js and declare resources under theresourceskey as functions, accessible viathis.$resources.[name]
Files:
dashboard/src/pages/TicketDetails.vue
🧠 Learnings (3)
📚 Learning: 2025-12-30T06:17:13.961Z
Learnt from: CR
Repo: BuildWithHussain/buzz PR: 0
File: .github/instructions/frappe-ui.instructions.md:0-0
Timestamp: 2025-12-30T06:17:13.961Z
Learning: Applies to **/*.vue : Use `Dropdown` component with `options` prop containing action items with `label`, `icon` (lucide icon name), `onClick` handler, optional `theme` ('red' for danger actions), and support for `group`, `items`, and `submenu` for hierarchical menus
Applied to files:
dashboard/src/pages/TicketDetails.vue
📚 Learning: 2025-12-30T06:17:13.961Z
Learnt from: CR
Repo: BuildWithHussain/buzz PR: 0
File: .github/instructions/frappe-ui.instructions.md:0-0
Timestamp: 2025-12-30T06:17:13.961Z
Learning: Applies to **/*.vue : Use `Badge` component with props `variant` ('solid', 'subtle', 'outline', 'ghost'), `theme` ('gray', 'blue', 'green', 'orange', 'red'), and `size` ('sm', 'md', 'lg') for displaying status indicators
Applied to files:
dashboard/src/pages/TicketDetails.vue
📚 Learning: 2025-12-30T06:17:13.961Z
Learnt from: CR
Repo: BuildWithHussain/buzz PR: 0
File: .github/instructions/frappe-ui.instructions.md:0-0
Timestamp: 2025-12-30T06:17:13.961Z
Learning: Applies to **/*.vue : Use `Dialog` component with `options` prop for title, message, size ('sm', 'lg', '4xl'), icon, and actions, or use slots (`body-title`, `body-content`, `actions`) for custom content layouts
Applied to files:
dashboard/src/pages/TicketDetails.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Server
🔇 Additional comments (4)
buzz/ticketing/doctype/event_ticket/event_ticket.py (1)
66-71: LGTM! Registration reference correctly stored after successful submission.The
db_setcall is appropriately placed afterregistration.submit()succeeds, ensuring the ticket only links to a successfully submitted Zoom registration.dashboard/src/pages/TicketDetails.vue (2)
342-342: LGTM!Icon import follows the established pattern in the file.
219-242: No refactoring needed—the current implementation is correct.The styled anchor tag with
rel="noopener noreferrer"is the appropriate pattern for external third-party links. While theButtoncomponent is used elsewhere in the file, it's designed for internal navigation and API endpoints (e.g., the Download button links to/api/method/...). UsingButtonfor an external Zoom link would be inconsistent with the component's intended use. The current implementation correctly handles the security requirements for external links.buzz/install.py (1)
38-47: LGTM! Custom field definition is correct.The field is appropriately configured:
read_only: 1prevents manual editing since it's set programmatically- Links to the
Zoom Webinar RegistrationDocType from the zoom_integration app- Placement after
coupon_usedis valid (confirmed by auto-generated types in event_ticket.py)
|
LGTM. |
Summary
zoom_webinar_registrationcustom field on Event Ticket to link tickets to their Zoom registrationszoom_join_urlinget_ticket_detailsAPITest plan
bench migrateto create the custom fieldzoom_webinar_registrationfield populated🤖 Generated with Claude Code
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.