Fix ticket create (#13)

* don't set ticket as paid on create
* use crud fn in tasks.py
* create ticket is unpaid by default
This commit is contained in:
Tiago Vasconcelos 2023-08-18 07:18:44 +01:00 committed by GitHub
parent c8b31d8e3f
commit 00f552c751
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 24 deletions

52
crud.py
View file

@ -9,34 +9,52 @@ from .models import CreateEvent, Event, Ticket
async def create_ticket( async def create_ticket(
payment_hash: str, wallet: str, event: str, name: str, email: str payment_hash: str, wallet: str, event: str, name: str, email: str) -> Ticket:
) -> Ticket:
await db.execute( await db.execute(
""" """
INSERT INTO events.ticket (id, wallet, event, name, email, registered, paid) INSERT INTO events.ticket (id, wallet, event, name, email, registered, paid)
VALUES (?, ?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?, ?, ?)
""", """,
(payment_hash, wallet, event, name, email, False, True), (payment_hash, wallet, event, name, email, False, False),
)
# UPDATE EVENT DATA ON SOLD TICKET
eventdata = await get_event(event)
assert eventdata, "Couldn't get event from ticket being paid"
sold = eventdata.sold + 1
amount_tickets = eventdata.amount_tickets - 1
await db.execute(
"""
UPDATE events.events
SET sold = ?, amount_tickets = ?
WHERE id = ?
""",
(sold, amount_tickets, event),
) )
ticket = await get_ticket(payment_hash) ticket = await get_ticket(payment_hash)
assert ticket, "Newly created ticket couldn't be retrieved" assert ticket, "Newly created ticket couldn't be retrieved"
return ticket return ticket
async def set_ticket_paid(payment_hash: str) -> Ticket:
ticket = await get_ticket(payment_hash)
assert ticket, "Ticket couldn't be retrieved"
await db.execute(
"""
UPDATE events.ticket
SET paid = ?
WHERE id = ?
""",
(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"
sold = event.sold + 1
amount_tickets = event.amount_tickets - 1
await db.execute(
"""
UPDATE events.events
SET sold = ?, amount_tickets = ?
WHERE id = ?
""",
(sold, amount_tickets, event_id),
)
return
async def get_ticket(payment_hash: str) -> Optional[Ticket]: async def get_ticket(payment_hash: str) -> Optional[Ticket]:
row = await db.fetchone("SELECT * FROM events.ticket WHERE id = ?", (payment_hash,)) row = await db.fetchone("SELECT * FROM events.ticket WHERE id = ?", (payment_hash,))

View file

@ -4,8 +4,7 @@ from lnbits.core.models import Payment
from lnbits.helpers import get_current_extension_name from lnbits.helpers import get_current_extension_name
from lnbits.tasks import register_invoice_listener from lnbits.tasks import register_invoice_listener
from .models import CreateTicket from .crud import set_ticket_paid
from .views_api import api_ticket_send_ticket
async def wait_for_paid_invoices(): async def wait_for_paid_invoices():
@ -25,8 +24,6 @@ async def on_invoice_paid(payment: Payment) -> None:
and payment.extra.get("name") and payment.extra.get("name")
and payment.extra.get("email") and payment.extra.get("email")
): ):
await api_ticket_send_ticket(
payment.memo, await set_ticket_paid(payment.payment_hash)
payment.payment_hash,
)
return return

View file

@ -86,7 +86,6 @@
{% endblock %} {% block scripts %} {% endblock %} {% block scripts %}
<script> <script>
console.log('{{ form_costpword }}')
Vue.component(VueQrcode.name, VueQrcode) Vue.component(VueQrcode.name, VueQrcode)
new Vue({ new Vue({

View file

@ -20,6 +20,7 @@ from .crud import (
get_ticket, get_ticket,
get_tickets, get_tickets,
reg_ticket, reg_ticket,
set_ticket_paid,
update_event, update_event,
) )
from .models import CreateEvent, CreateTicket from .models import CreateEvent, CreateTicket
@ -138,7 +139,9 @@ async def api_ticket_send_ticket(event_id, payment_hash):
) )
payment = await get_standalone_payment(payment_hash) payment = await get_standalone_payment(payment_hash)
assert payment
if not payment.pending and event.price_per_ticket * 1000 == payment.amount: if not payment.pending and event.price_per_ticket * 1000 == payment.amount:
await set_ticket_paid(payment_hash)
return {"paid": True, "ticket_id": ticket.id} return {"paid": True, "ticket_id": ticket.id}
return {"paid": False} return {"paid": False}