Browse Source

Working events extension

Login
benarc 5 years ago
parent
commit
b296c38795
  1. 14
      lnbits/extensions/events/README.md
  2. 2
      lnbits/extensions/events/config.json.example
  3. 1
      lnbits/extensions/events/crud.py
  4. 14
      lnbits/extensions/events/templates/events/_api_docs.html
  5. 1
      lnbits/extensions/events/templates/events/display.html
  6. 13
      lnbits/extensions/events/templates/events/register.html
  7. 16
      lnbits/extensions/events/templates/events/ticket.html
  8. 9
      lnbits/extensions/events/views_api.py

14
lnbits/extensions/events/README.md

@ -1,11 +1,3 @@
<h1>Example Extension</h1>
<h2>*tagline*</h2>
This is an example extension to help you organise and build you own.
Try to include an image
<img src="https://i.imgur.com/9i4xcQB.png">
<h2>If your extension has API endpoints, include useful ones here</h2>
<code>curl -H "Content-type: application/json" -X POST https://YOUR-LNBITS/YOUR-EXTENSION/api/v1/EXAMPLE -d '{"amount":"100","memo":"example"}' -H "X-Api-Key: YOUR_WALLET-ADMIN/INVOICE-KEY"</code>
<h1>Events</h1>
<h2>Events: Sell and register event tickets</h2>
Events alows you to make a wave of tickets for an event, each ticket is in the form of a unqiue QRcode, which the user presents at registration. Events comes with a shareable ticket scanner, which can be used to register attendees.

2
lnbits/extensions/events/config.json.example

@ -1,6 +1,6 @@
{
"name": "Events",
"short_description": "Sell/register event tickets",
"short_description": "Sell and register event tickets",
"icon": "local_activity",
"contributors": ["benarc"]
}

1
lnbits/extensions/events/crud.py

@ -78,6 +78,7 @@ def update_event(event_id: str, **kwargs) -> Events:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
with open_ext_db("events") as db:
db.execute(f"UPDATE events SET {q} WHERE id = ?", (*kwargs.values(), event_id))
row = db.fetchone("SELECT * FROM events WHERE id = ?", (event_id,))
return Events(**row) if row else None

14
lnbits/extensions/events/templates/events/_api_docs.html

@ -7,21 +7,11 @@
>
<q-card>
<q-card-section>
<h5 class="text-subtitle1 q-my-none">Events: Sell and register tickets for an event</h5>
<p>Events alows you to make a wave of tickets for an event. Once an attendee has paid for a ticket they get a unqiue code. Events comes with a shareable scanning frontend, so you can register the attendees<br/>
<h5 class="text-subtitle1 q-my-none">Events: Sell and register ticket waves for an event</h5>
<p>Events alows you to make a wave of tickets for an event, each ticket is in the form of a unqiue QRcode, which the user presents at registration. Events comes with a shareable ticket scanner, which can be used to register attendees.<br/>
<small> Created by, <a href="https://github.com/benarc">Ben Arc</a></small></p>
</q-card>
</q-card-section>
</q-card-section>
</q-expansion-item>
<q-expansion-item
group="extras"
icon="swap_vertical_circle"
label="API info"
:content-inset-level="0.5"
>
</q-expansion-item>

1
lnbits/extensions/events/templates/events/display.html

@ -154,6 +154,7 @@
axios
.post('/events/api/v1/tickets/' + self.paymentCheck, {
event: '{{ event_id }}',
event_name: '{{ event_name }}',
name: self.formDialog.data.name,
email: self.formDialog.data.email
})

13
lnbits/extensions/events/templates/events/register.html

@ -84,6 +84,7 @@
type="text/css"
href="{{ url_for('static', filename='vendor/vue-qrcode-reader@2.2.0/vue-qrcode-reader.min.css') }}"
/>
{% endblock %} {% block scripts %}
<script src="{{ url_for('static', filename='vendor/vue-qrcode@1.0.2/vue-qrcode.min.js') }}"></script>
{% assets filters='rjsmin', output='__bundle__/core/chart.js',
@ -135,6 +136,9 @@
}
},
methods: {
hoverEmail: function (tmp) {
this.tickets.data.emailtemp = tmp
},
closeCamera: function () {
this.sendCamera.show = false
},
@ -148,15 +152,17 @@
LNbits.api
.request('GET', '/events/api/v1/register/ticket/' + res)
.then(function (response) {
self.tickets = response.data.map(function (obj) {
self.$q.notify({
timeout: 5,
type: 'positive',
message: 'Registered!'
})
self.tickets = response.data.map(function (obj) {
return mapEvents(obj)
})
})
.catch(function (error) {
LNbits.utils.notifyApiError(error)
})
},
getEventTickets: function () {
var self = this
@ -171,6 +177,9 @@
return mapEvents(obj)
})
})
.catch(function (error) {
LNbits.utils.notifyApiError(error)
})
}
},
created: function () {

16
lnbits/extensions/events/templates/events/ticket.html

@ -7,7 +7,7 @@
<h3 class="q-my-none">{{ ticket_name }} Ticket</h3>
<br />
<h5 class="q-my-none">
Bookmark or screenshot this page,<br />
Bookmark, print or screenshot this page,<br />
and present it for registration!
</h5>
<br />
@ -17,6 +17,10 @@
:options="{width: 340}"
class="rounded-borders"
></qrcode>
<br />
<q-btn @click="printWindow" color="grey" class="q-ml-auto">
<q-icon left size="3em" name="print"></q-icon> Print</q-btn
>
</center>
</q-card-section>
</q-card>
@ -28,7 +32,15 @@
Vue.component(VueQrcode.name, VueQrcode)
new Vue({
el: '#vue',
mixins: [windowMixin]
mixins: [windowMixin],
data: function () {
return {}
},
methods: {
printWindow: function () {
window.print()
}
}
})
</script>
{% endblock %}

9
lnbits/extensions/events/views_api.py

@ -156,5 +156,14 @@ def api_event_tickets(wallet_id, event_id):
@events_ext.route("/api/v1/register/ticket/<ticket_id>", methods=["GET"])
def api_event_register_ticket(ticket_id):
ticket = get_ticket(ticket_id)
if not ticket:
return jsonify({"message": "Ticket does not exist."}), HTTPStatus.FORBIDDEN
if ticket.registered == True:
return jsonify({"message": "Ticket already registered"}), HTTPStatus.FORBIDDEN
return jsonify([ticket._asdict() for ticket in reg_ticket(ticket_id)]), HTTPStatus.OK

Loading…
Cancel
Save