diff --git a/models.py b/models.py index 94869a5..2798c12 100644 --- a/models.py +++ b/models.py @@ -1,5 +1,5 @@ from fastapi import Query -from pydantic import BaseModel +from pydantic import BaseModel, EmailStr from typing import Optional @@ -17,7 +17,7 @@ class CreateEvent(BaseModel): class CreateTicket(BaseModel): name: str - email: str + email: EmailStr class Event(BaseModel): diff --git a/templates/events/display.html b/templates/events/display.html index 78f2225..60ec944 100644 --- a/templates/events/display.html +++ b/templates/events/display.html @@ -13,14 +13,33 @@ Buy Ticket - - + + - Submit - Cancel + type="submit" + >Submit + Cancel @@ -28,8 +47,15 @@ - Link to your - ticket! + Link to your ticket! You'll be redirected in a few moments... @@ -37,19 +63,27 @@ - + - + - Copy invoice + Copy invoice Close @@ -108,20 +142,27 @@ dismissMsg() clearInterval(paymentChecker) - setTimeout(function () { }, 10000) + setTimeout(function () {}, 10000) }, + nameValidation(val) { + const regex = /[`!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/g + return ( + !regex.test(val) || + 'Please enter valid name. No special character allowed.' + ) + }, + emailValidation(val) { + let regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/g + return !regex.test(val) || 'Please enter valid email.' + }, + Invoice: function () { var self = this axios - - .get( - '/events/api/v1/tickets/' + - '{{ event_id }}' + - '/' + - self.formDialog.data.name + - '/' + - self.formDialog.data.email - ) + .post(`/events/api/v1/tickets/{{ event_id }}`, { + name: self.formDialog.data.name, + email: self.formDialog.data.email + }) .then(function (response) { self.paymentReq = response.data.payment_request self.paymentCheck = response.data.payment_hash @@ -140,9 +181,7 @@ paymentChecker = setInterval(function () { axios .post( - '/events/api/v1/tickets/' + - '{{ event_id }}/' + - self.paymentCheck, + `/events/api/v1/tickets/{{ event_id }}/${self.paymentCheck}`, { event: '{{ event_id }}', event_name: '{{ event_name }}', @@ -171,12 +210,11 @@ self.ticketLink = { show: true, data: { - link: '/events/ticket/' + res.data.ticket_id + link: `/events/ticket/${res.data.ticket_id}` } } setTimeout(function () { - window.location.href = - '/events/ticket/' + res.data.ticket_id + window.location.href = `/events/ticket/${res.data.ticket_id}` }, 5000) } }) @@ -192,4 +230,4 @@ } }) -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/events/index.html b/templates/events/index.html index 9bd1e4c..cf3bbba 100644 --- a/templates/events/index.html +++ b/templates/events/index.html @@ -4,7 +4,9 @@ - New Event + New Event @@ -15,11 +17,19 @@ Events - Export to CSV + Export to CSV - + {% raw %} @@ -35,20 +45,49 @@ - - + + {{ col.value }} - + - + @@ -64,11 +103,19 @@ Tickets - Export to CSV + Export to CSV - + {% raw %} @@ -81,9 +128,16 @@ - + @@ -91,7 +145,14 @@ - + @@ -119,61 +180,125 @@ - + - + - + Ticket closing date - + Event begins - + Event ends - + - + - + - + :mask="formDialog.data.currency != 'sat' ? '#.##' : '#'" + fill-mask="0" + reverse-fill-mask + > - Update Event - Update Event + Create Event - Cancel + type="submit" + >Create Event + Cancel @@ -206,9 +331,9 @@ currencies: [], eventsTable: { columns: [ - { name: 'id', align: 'left', label: 'ID', field: 'id' }, - { name: 'name', align: 'left', label: 'Name', field: 'name' }, - { name: 'info', align: 'left', label: 'Info', field: 'info' }, + {name: 'id', align: 'left', label: 'ID', field: 'id'}, + {name: 'name', align: 'left', label: 'Name', field: 'name'}, + {name: 'info', align: 'left', label: 'Info', field: 'info'}, { name: 'event_start_date', align: 'left', @@ -260,10 +385,10 @@ }, ticketsTable: { columns: [ - { name: 'id', align: 'left', label: 'ID', field: 'id' }, - { name: 'event', align: 'left', label: 'Event', field: 'event' }, - { name: 'name', align: 'left', label: 'Name', field: 'name' }, - { name: 'email', align: 'left', label: 'Email', field: 'email' }, + {name: 'id', align: 'left', label: 'ID', field: 'id'}, + {name: 'event', align: 'left', label: 'Event', field: 'event'}, + {name: 'name', align: 'left', label: 'Name', field: 'name'}, + {name: 'email', align: 'left', label: 'Email', field: 'email'}, { name: 'registered', align: 'left', @@ -298,7 +423,7 @@ }, deleteTicket: function (ticketId) { var self = this - var tickets = _.findWhere(this.tickets, { id: ticketId }) + var tickets = _.findWhere(this.tickets, {id: ticketId}) LNbits.utils .confirmDialog('Are you sure you want to delete this ticket') @@ -307,7 +432,7 @@ .request( 'DELETE', '/events/api/v1/tickets/' + ticketId, - _.findWhere(self.g.user.wallets, { id: tickets.wallet }).inkey + _.findWhere(self.g.user.wallets, {id: tickets.wallet}).inkey ) .then(function (response) { self.tickets = _.reject(self.tickets, function (obj) { @@ -366,9 +491,9 @@ }) }, updateformDialog: function (formId) { - var link = _.findWhere(this.events, { id: formId }) + var link = _.findWhere(this.events, {id: formId}) - this.formDialog.data = { ...link } + this.formDialog.data = {...link} this.formDialog.show = true }, @@ -396,7 +521,7 @@ }, deleteEvent: function (eventsId) { var self = this - var events = _.findWhere(this.events, { id: eventsId }) + var events = _.findWhere(this.events, {id: eventsId}) LNbits.utils .confirmDialog('Are you sure you want to delete this form link?') @@ -405,7 +530,7 @@ .request( 'DELETE', '/events/api/v1/events/' + eventsId, - _.findWhere(self.g.user.wallets, { id: events.wallet }).inkey + _.findWhere(self.g.user.wallets, {id: events.wallet}).inkey ) .then(function (response) { self.events = _.reject(self.events, function (obj) { @@ -422,7 +547,7 @@ }, async getCurrencies() { try { - const { data } = await LNbits.api.request( + const {data} = await LNbits.api.request( 'GET', '/events/api/v1/currencies', this.inkey @@ -444,4 +569,4 @@ } }) -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/views_api.py b/views_api.py index 1263767..c82338e 100644 --- a/views_api.py +++ b/views_api.py @@ -28,7 +28,7 @@ from .crud import ( set_ticket_paid, update_event, ) -from .models import CreateEvent +from .models import CreateEvent, CreateTicket # Events @@ -101,6 +101,13 @@ async def api_tickets( return [ticket.dict() for ticket in await get_tickets(wallet_ids)] +@events_ext.post("/api/v1/tickets/{event_id}") +async def api_ticket_create(event_id: str, data: CreateTicket): + name = data.name + email = data.email + return await api_ticket_make_ticket(event_id, name, email) + + @events_ext.get("/api/v1/tickets/{event_id}/{name}/{email}") async def api_ticket_make_ticket(event_id, name, email): event = await get_event(event_id)
You'll be redirected in a few moments...