From 8cc9bbb8bad27743a22a2456aa81705d09a57fd7 Mon Sep 17 00:00:00 2001 From: Julian Weng Date: Mon, 15 Apr 2024 19:14:22 -0400 Subject: [PATCH 1/4] Integrate ticket price field into ticket creation/list views, as well into ticket creation frontend. --- backend/clubs/views.py | 18 ++++++++- .../components/ClubEditPage/TicketsModal.tsx | 37 +++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/backend/clubs/views.py b/backend/clubs/views.py index bbd974356..bb96dad64 100644 --- a/backend/clubs/views.py +++ b/backend/clubs/views.py @@ -46,6 +46,7 @@ DurationField, ExpressionWrapper, F, + Max, Prefetch, Q, Sum, @@ -2542,6 +2543,8 @@ def tickets(self, request, *args, **kwargs): type: string count: type: integer + price: + type: number available: type: array items: @@ -2551,15 +2554,24 @@ def tickets(self, request, *args, **kwargs): type: string count: type: integer + price: + type: number --- """ event = self.get_object() tickets = Ticket.objects.filter(event=event) - totals = tickets.values("type").annotate(count=Count("type")).order_by("type") + # Take price of first ticket of given type for now + totals = ( + tickets.values("type") + .annotate(price=Max("price")) + .annotate(count=Count("type")) + .order_by("type") + ) available = ( tickets.filter(owner__isnull=True, holder__isnull=True) .values("type") + .annotate(price=Max("price")) .annotate(count=Count("type")) .order_by("type") ) @@ -2586,6 +2598,8 @@ def create_tickets(self, request, *args, **kwargs): type: string count: type: integer + price: + type: number order_limit: type: int required: false @@ -2608,7 +2622,7 @@ def create_tickets(self, request, *args, **kwargs): Ticket.objects.filter(event=event).delete() # Idempotency tickets = [ - Ticket(event=event, type=item["type"]) + Ticket(event=event, type=item["type"], price=item["price"]) for item in quantities for _ in range(item["count"]) ] diff --git a/frontend/components/ClubEditPage/TicketsModal.tsx b/frontend/components/ClubEditPage/TicketsModal.tsx index 7b8158b1f..60fbffc89 100644 --- a/frontend/components/ClubEditPage/TicketsModal.tsx +++ b/frontend/components/ClubEditPage/TicketsModal.tsx @@ -55,12 +55,14 @@ const TicketItem = ({ ticket, changeName, changeCount, + changePrice, deleteTicket, deletable, index, }): ReactElement => { const [name, setName] = useState(ticket.name) const [count, setCount] = useState(ticket.count) + const [price, setPrice] = useState(ticket.price) const handleNameChange = (e) => { setName(e.target.value) @@ -72,6 +74,12 @@ const TicketItem = ({ changeCount(e.target.value, index) } + const handlePriceChange = (e) => { + const rounded = Math.round(parseFloat(e.target.value) * 100) / 100 + setPrice(rounded.toString()) + changePrice(rounded.toString(), index) + } + return (
+