From b5332b854e6863407328070acb8734901aac5519 Mon Sep 17 00:00:00 2001 From: GULAM GAUSH Date: Mon, 5 Jan 2026 00:35:54 +0530 Subject: [PATCH 1/3] fix: prevent event booking after event ends --- .../doctype/event_booking/event_booking.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/buzz/ticketing/doctype/event_booking/event_booking.py b/buzz/ticketing/doctype/event_booking/event_booking.py index 120a950..778fece 100644 --- a/buzz/ticketing/doctype/event_booking/event_booking.py +++ b/buzz/ticketing/doctype/event_booking/event_booking.py @@ -5,6 +5,7 @@ import frappe from frappe import _ from frappe.model.document import Document +from frappe.utils import get_datetime, now_datetime from buzz.payments import mark_payment_as_received @@ -42,6 +43,7 @@ def validate(self): self.set_currency() self.set_total() self.apply_taxes_if_applicable() + self.validate_event_dates() def set_currency(self): self.currency = self.attendees[0].currency @@ -173,3 +175,18 @@ def cancel_all_tickets(self): tickets = frappe.db.get_all("Event Ticket", filters={"booking": self.name}, pluck="name") for ticket in tickets: frappe.get_cached_doc("Event Ticket", ticket).cancel() + + def validate_event_dates(self): + event_end_date, event_end_time = frappe.db.get_value( + "Buzz Event", self.event, ["end_date", "end_time"] + ) + + if event_end_date: + time_part = str(event_end_time) if event_end_time else "23:59:59" + event_end_datetime = get_datetime(f"{event_end_date} {time_part}") + + if now_datetime() > event_end_datetime: + frappe.throw( + _("Cannot book tickets for an event that has already ended."), + title=_("Event Ended"), + ) From 91e53b1eb490c26b0b9594f44d6dae750c2bad00 Mon Sep 17 00:00:00 2001 From: GULAM GAUSH <=> Date: Mon, 5 Jan 2026 23:03:24 +0530 Subject: [PATCH 2/3] feat: validate event expiry with timezone support --- .../doctype/event_booking/event_booking.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/buzz/ticketing/doctype/event_booking/event_booking.py b/buzz/ticketing/doctype/event_booking/event_booking.py index 778fece..a68cb0e 100644 --- a/buzz/ticketing/doctype/event_booking/event_booking.py +++ b/buzz/ticketing/doctype/event_booking/event_booking.py @@ -3,9 +3,10 @@ import json import frappe +import pytz from frappe import _ from frappe.model.document import Document -from frappe.utils import get_datetime, now_datetime +from frappe.utils import get_datetime, get_system_timezone, now_datetime from buzz.payments import mark_payment_as_received @@ -38,12 +39,12 @@ class EventBooking(Document): # end: auto-generated types def validate(self): + self.validate_event_dates() self.validate_ticket_availability() self.fetch_amounts_from_ticket_types() self.set_currency() self.set_total() self.apply_taxes_if_applicable() - self.validate_event_dates() def set_currency(self): self.currency = self.attendees[0].currency @@ -177,16 +178,30 @@ def cancel_all_tickets(self): frappe.get_cached_doc("Event Ticket", ticket).cancel() def validate_event_dates(self): - event_end_date, event_end_time = frappe.db.get_value( - "Buzz Event", self.event, ["end_date", "end_time"] - ) + event_doc = frappe.get_cached_doc("Buzz Event", self.event) - if event_end_date: - time_part = str(event_end_time) if event_end_time else "23:59:59" - event_end_datetime = get_datetime(f"{event_end_date} {time_part}") + if not event_doc.end_date: + return - if now_datetime() > event_end_datetime: - frappe.throw( - _("Cannot book tickets for an event that has already ended."), - title=_("Event Ended"), - ) + time_part = str(event_doc.end_time) if event_doc.end_time else "23:59:59" + event_end_naive = get_datetime(f"{event_doc.end_date} {time_part}") + current_naive = now_datetime() + + if event_doc.time_zone: + # Localize Event End Time to the Event's Timezone + event_tz = pytz.timezone(event_doc.time_zone) + event_end_aware = event_tz.localize(event_end_naive) + + # Localize Current System Time to the Server's Timezone + system_tz = pytz.timezone(get_system_timezone()) + current_aware = system_tz.localize(current_naive) + + if current_aware > event_end_aware: + self.throw_event_ended_error() + + else: + if current_naive > event_end_naive: + self.throw_event_ended_error() + + def throw_event_ended_error(self): + frappe.throw(_("Cannot book tickets. This event has already ended."), title=_("Event Ended")) From 081273ca5907f77bf128cd534f010d8d689cd6ff Mon Sep 17 00:00:00 2001 From: GULAM GAUSH <=> Date: Tue, 6 Jan 2026 16:11:15 +0530 Subject: [PATCH 3/3] refactor: validate event expiry with timezone --- .../doctype/event_booking/event_booking.py | 28 ++++++------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/buzz/ticketing/doctype/event_booking/event_booking.py b/buzz/ticketing/doctype/event_booking/event_booking.py index a68cb0e..8d466ed 100644 --- a/buzz/ticketing/doctype/event_booking/event_booking.py +++ b/buzz/ticketing/doctype/event_booking/event_booking.py @@ -3,10 +3,9 @@ import json import frappe -import pytz from frappe import _ from frappe.model.document import Document -from frappe.utils import get_datetime, get_system_timezone, now_datetime +from frappe.utils import get_datetime, get_datetime_in_timezone, now_datetime from buzz.payments import mark_payment_as_received @@ -39,7 +38,7 @@ class EventBooking(Document): # end: auto-generated types def validate(self): - self.validate_event_dates() + self.validate_event_has_ended() self.validate_ticket_availability() self.fetch_amounts_from_ticket_types() self.set_currency() @@ -177,7 +176,7 @@ def cancel_all_tickets(self): for ticket in tickets: frappe.get_cached_doc("Event Ticket", ticket).cancel() - def validate_event_dates(self): + def validate_event_has_ended(self): event_doc = frappe.get_cached_doc("Buzz Event", self.event) if not event_doc.end_date: @@ -185,23 +184,14 @@ def validate_event_dates(self): time_part = str(event_doc.end_time) if event_doc.end_time else "23:59:59" event_end_naive = get_datetime(f"{event_doc.end_date} {time_part}") - current_naive = now_datetime() if event_doc.time_zone: - # Localize Event End Time to the Event's Timezone - event_tz = pytz.timezone(event_doc.time_zone) - event_end_aware = event_tz.localize(event_end_naive) + current_time_aware = get_datetime_in_timezone(event_doc.time_zone) + current_time_at_venue = current_time_aware.replace(tzinfo=None) - # Localize Current System Time to the Server's Timezone - system_tz = pytz.timezone(get_system_timezone()) - current_aware = system_tz.localize(current_naive) - - if current_aware > event_end_aware: - self.throw_event_ended_error() + if current_time_at_venue > event_end_naive: + frappe.throw(_("Cannot book tickets. This event has already ended."), title=_("Event Ended")) else: - if current_naive > event_end_naive: - self.throw_event_ended_error() - - def throw_event_ended_error(self): - frappe.throw(_("Cannot book tickets. This event has already ended."), title=_("Event Ended")) + if now_datetime() > event_end_naive: + frappe.throw(_("Cannot book tickets. This event has already ended."), title=_("Event Ended"))