Skip to content

Conversation

@NagariaHussain
Copy link
Contributor

@NagariaHussain NagariaHussain commented Jan 12, 2026

Summary

  • Add zoom_webinar_registration custom field on Event Ticket to link tickets to their Zoom registrations
  • 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

Test plan

  • Run bench migrate to create the custom field
  • Create a Buzz Event with a linked Zoom Webinar (category: Webinars)
  • Create a booking and submit the ticket
  • Verify Event Ticket has zoom_webinar_registration field populated
  • View ticket in frontend dashboard and verify "Webinar Access" section appears
  • Click join URL to verify it opens Zoom correctly

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Integrated Zoom webinar access directly into ticket details page
    • Displays Zoom webinar join links for event tickets with associated webinar registrations
    • Added "Webinar Access" section in Ticket Details with convenient external link to join scheduled webinars
    • Enhanced ticket registration flow to capture and link Zoom webinar details

✏️ Tip: You can customize this high-level summary in your review settings.

… 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>
@coderabbitai
Copy link

coderabbitai bot commented Jan 12, 2026

📝 Walkthrough

Walkthrough

This 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

Cohort / File(s) Summary
Backend Configuration
buzz/install.py
Added "Event Ticket" custom field group with "Zoom Webinar Registration" Link field (read-only) after "coupon_used" to the ZOOM_INTEGRATION_CUSTOM_FIELDS mapping.
Backend Model
buzz/ticketing/doctype/event_ticket/event_ticket.py
Stores Zoom webinar registration reference on ticket via db_set after successful registration submission in create_zoom_registration_if_applicable.
Backend API
buzz/api.py
Fetches Zoom webinar join URL and webinar details from the "Zoom Webinar Registration" record and attaches them as zoom_join_url and zoom_webinar to ticket details response.
Frontend UI
dashboard/src/pages/TicketDetails.vue
Added "Webinar Access" section rendering when zoom_join_url is present, including external link button with LucideExternalLink icon to open Zoom webinar URL.

Sequence Diagram

sequenceDiagram
    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
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A ticket hops into Zoom's embrace,
Registration linked with webinar grace,
Join URLs dance from database to screen,
The cutest integration we've ever seen!
Webinars and tickets, now best of friends! 🎉

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main changes: linking event tickets to Zoom webinar registrations and displaying the join URL in the UI.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a 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_integration app is uninstalled but tickets still have zoom_webinar_registration references, 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

📥 Commits

Reviewing files that changed from the base of the PR and between 20a47dd and c96d2b9.

📒 Files selected for processing (4)
  • buzz/api.py
  • buzz/install.py
  • buzz/ticketing/doctype/event_ticket/event_ticket.py
  • dashboard/src/pages/TicketDetails.vue
🧰 Additional context used
📓 Path-based instructions (2)
**/*.vue

📄 CodeRabbit inference engine (.github/instructions/frappe-ui.instructions.md)

**/*.vue: Use createResource() from frappe-ui to make backend API calls with configuration for url, params, and methods like fetch() and submit() in Vue components
Use createDocumentResource() to manage individual document records with support for whitelisted methods, events (onError, onSuccess, transform), and methods like reload(), setValue(), delete(), and custom whitelisted method calls
Use useList() 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)
Use ListView component with props columns, rows, row-key, and options to render tabular data with support for selection, tooltips, resizable columns, and custom rendering slots
Define ListView columns with required label and key properties, optional width (as multiplier or px/rem), align (start/left, center/middle, end/right), and custom attributes for rendering
Define ListView rows with unique identifier matching the row-key prop, and field values as strings or objects with label property for custom rendering
For grouped ListView rows, structure data as array of objects with group string, collapsed boolean, and rows array containing row objects
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
Use FormControl component with type prop ('text', 'number', 'email', 'date', 'password', 'search', 'textarea', 'select', 'autocomplete', 'checkbox'), size ('sm', 'md', 'lg', 'xl'), variant ('subtle', 'outline'), and optional prefix and suffix slots
Use toast from frappe-ui for notifications with methods toast.success(), toast.warning(), and toast.error() to provide user feedback
Use Dropdown component with options prop containing action items with label, 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 resourcesPlugin in main.js and declare resources under the resources key as functions, accessible via this.$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_set call is appropriately placed after registration.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 the Button component is used elsewhere in the file, it's designed for internal navigation and API endpoints (e.g., the Download button links to /api/method/...). Using Button for 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: 1 prevents manual editing since it's set programmatically
  • Links to the Zoom Webinar Registration DocType from the zoom_integration app
  • Placement after coupon_used is valid (confirmed by auto-generated types in event_ticket.py)

@NagariaHussain
Copy link
Contributor Author

NagariaHussain commented Jan 12, 2026

LGTM.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants