From 5e391a04bc5825730a697d1a8e345c92fc5bde6a Mon Sep 17 00:00:00 2001 From: Tiago Vasconcelos Date: Tue, 12 Dec 2023 10:42:50 +0000 Subject: [PATCH] [FEAT] Fiat event tickets (#10) --- crud.py | 16 ++- migrations.py | 65 +++++++++ models.py | 6 +- tasks.py | 1 - templates/events/display.html | 92 +++++------- templates/events/index.html | 255 ++++++++++++---------------------- views_api.py | 39 +++++- 7 files changed, 237 insertions(+), 237 deletions(-) diff --git a/crud.py b/crud.py index f347936..0d9c25b 100644 --- a/crud.py +++ b/crud.py @@ -9,7 +9,8 @@ from .models import CreateEvent, Event, Ticket async def create_ticket( - payment_hash: str, wallet: str, event: str, name: str, email: str) -> Ticket: + payment_hash: str, wallet: str, event: str, name: str, email: str +) -> Ticket: await db.execute( """ INSERT INTO events.ticket (id, wallet, event, name, email, registered, paid) @@ -22,9 +23,12 @@ async def create_ticket( assert ticket, "Newly created ticket couldn't be retrieved" return ticket + async def set_ticket_paid(payment_hash: str) -> Ticket: ticket = await get_ticket(payment_hash) assert ticket, "Ticket couldn't be retrieved" + if ticket.paid: + return ticket await db.execute( """ @@ -34,11 +38,12 @@ async def set_ticket_paid(payment_hash: str) -> Ticket: """, (True, ticket.id), ) - + await update_event_sold(ticket.event) return ticket + async def update_event_sold(event_id: str): event = await get_event(event_id) assert event, "Couldn't get event from ticket being paid" @@ -54,7 +59,7 @@ async def update_event_sold(event_id: str): ) return - + async def get_ticket(payment_hash: str) -> Optional[Ticket]: row = await db.fetchone("SELECT * FROM events.ticket WHERE id = ?", (payment_hash,)) @@ -87,8 +92,8 @@ async def create_event(data: CreateEvent) -> Event: event_id = urlsafe_short_hash() await db.execute( """ - INSERT INTO events.events (id, wallet, name, info, closing_date, event_start_date, event_end_date, amount_tickets, price_per_ticket, sold) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + INSERT INTO events.events (id, wallet, name, info, closing_date, event_start_date, event_end_date, currency, amount_tickets, price_per_ticket, sold) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( event_id, @@ -98,6 +103,7 @@ async def create_event(data: CreateEvent) -> Event: data.closing_date, data.event_start_date, data.event_end_date, + data.currency, data.amount_tickets, data.price_per_ticket, 0, diff --git a/migrations.py b/migrations.py index 77424eb..8052e3f 100644 --- a/migrations.py +++ b/migrations.py @@ -88,3 +88,68 @@ async def m003_add_register_timestamp(db): await db.execute( "ALTER TABLE events.ticket ADD COLUMN reg_timestamp TIMESTAMP;" ) # NULL means not registered, or old ticket + + +async def m004_add_currency(db): + """ + Add a currency table to allow fiat denomination + of tickets. Make price a float. + """ + await db.execute("ALTER TABLE events.events RENAME TO events_old") + await db.execute( + """ + CREATE TABLE events.events ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + name TEXT NOT NULL, + info TEXT NOT NULL, + closing_date TEXT NOT NULL, + event_start_date TEXT NOT NULL, + event_end_date TEXT NOT NULL, + currency TEXT NOT NULL, + amount_tickets INTEGER NOT NULL, + price_per_ticket REAL NOT NULL, + sold INTEGER NOT NULL, + time TIMESTAMP NOT NULL DEFAULT """ + + db.timestamp_now + + """ + ); + """ + ) + + for row in [ + list(row) for row in await db.fetchall("SELECT * FROM events.events_old") + ]: + await db.execute( + """ + INSERT INTO events.events ( + id, + wallet, + name, + info, + closing_date, + event_start_date, + event_end_date, + currency, + amount_tickets, + price_per_ticket, + sold + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + row[6], + "sat", + row[7], + row[8], + row[9], + ), + ) + + await db.execute("DROP TABLE events.events_old") diff --git a/models.py b/models.py index 62cba60..94869a5 100644 --- a/models.py +++ b/models.py @@ -10,8 +10,9 @@ class CreateEvent(BaseModel): closing_date: str event_start_date: str event_end_date: str + currency: str = "sat" amount_tickets: int = Query(..., ge=0) - price_per_ticket: int = Query(..., ge=0) + price_per_ticket: float = Query(..., ge=0) class CreateTicket(BaseModel): @@ -27,8 +28,9 @@ class Event(BaseModel): closing_date: str event_start_date: str event_end_date: str + currency: str amount_tickets: int - price_per_ticket: int + price_per_ticket: float sold: int time: int diff --git a/tasks.py b/tasks.py index d2ed732..286cedc 100644 --- a/tasks.py +++ b/tasks.py @@ -24,6 +24,5 @@ async def on_invoice_paid(payment: Payment) -> None: and payment.extra.get("name") and payment.extra.get("email") ): - await set_ticket_paid(payment.payment_hash) return diff --git a/templates/events/display.html b/templates/events/display.html index 74fd871..78f2225 100644 --- a/templates/events/display.html +++ b/templates/events/display.html @@ -5,35 +5,22 @@

{{ event_name }}


-
{{ event_info }}
+

+
+ + + +
Buy Ticket
- - + +
- Submit - Cancel + Submit + Cancel
@@ -41,15 +28,8 @@
- Link to your ticket! + Link to your + ticket!

You'll be redirected in a few moments...

@@ -57,27 +37,19 @@ - +
- Copy invoice + Copy invoice Close
@@ -115,7 +87,15 @@ } } }, - + created() { + this.info = '{{ event_info | tojson }}' + this.info = this.info.substring(1, this.info.length - 1) + }, + computed: { + formatDescription() { + return LNbits.utils.convertMarkdown(this.info) + } + }, methods: { resetForm: function (e) { e.preventDefault() @@ -128,7 +108,7 @@ dismissMsg() clearInterval(paymentChecker) - setTimeout(function () {}, 10000) + setTimeout(function () { }, 10000) }, Invoice: function () { var self = this @@ -136,11 +116,11 @@ .get( '/events/api/v1/tickets/' + - '{{ event_id }}' + - '/' + - self.formDialog.data.name + - '/' + - self.formDialog.data.email + '{{ event_id }}' + + '/' + + self.formDialog.data.name + + '/' + + self.formDialog.data.email ) .then(function (response) { self.paymentReq = response.data.payment_request @@ -161,8 +141,8 @@ axios .post( '/events/api/v1/tickets/' + - '{{ event_id }}/' + - self.paymentCheck, + '{{ event_id }}/' + + self.paymentCheck, { event: '{{ event_id }}', event_name: '{{ event_name }}', @@ -212,4 +192,4 @@ } }) -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/templates/events/index.html b/templates/events/index.html index 57afb19..9bd1e4c 100644 --- a/templates/events/index.html +++ b/templates/events/index.html @@ -4,9 +4,7 @@
- New Event + New Event @@ -17,19 +15,11 @@
Events
- Export to CSV + Export to CSV
- + {% raw %}