From 3fda8bf06fd0145ff9fb1cd8bac18aa72bc3558b Mon Sep 17 00:00:00 2001 From: Ben Arc Date: Fri, 13 Aug 2021 23:23:18 +0100 Subject: [PATCH] flatrate added --- lnbits/extensions/lnticket/crud.py | 23 ++++---- lnbits/extensions/lnticket/migrations.py | 55 +++++++++++++++++++ lnbits/extensions/lnticket/models.py | 3 +- .../lnticket/templates/lnticket/display.html | 31 ++++++++--- .../lnticket/templates/lnticket/index.html | 54 +++++++++++++----- lnbits/extensions/lnticket/views.py | 3 +- lnbits/extensions/lnticket/views_api.py | 3 +- 7 files changed, 136 insertions(+), 36 deletions(-) diff --git a/lnbits/extensions/lnticket/crud.py b/lnbits/extensions/lnticket/crud.py index 45be7124..47be3d02 100644 --- a/lnbits/extensions/lnticket/crud.py +++ b/lnbits/extensions/lnticket/crud.py @@ -49,7 +49,7 @@ async def set_ticket_paid(payment_hash: str) -> Tickets: amount = formdata.amountmade + row[7] await db.execute( """ - UPDATE lnticket.form + UPDATE lnticket.forms SET amountmade = ? WHERE id = ? """, @@ -108,34 +108,35 @@ async def create_form( name: str, webhook: Optional[str] = None, description: str, - costpword: int, + amount: int, + flatrate: int, ) -> Forms: form_id = urlsafe_short_hash() await db.execute( """ - INSERT INTO lnticket.form (id, wallet, name, webhook, description, costpword, amountmade) - VALUES (?, ?, ?, ?, ?, ?, ?) + INSERT INTO lnticket.forms (id, wallet, name, webhook, description, flatrate, amount, amountmade) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) """, - (form_id, wallet, name, webhook, description, costpword, 0), + (form_id, wallet, name, webhook, description, flatrate, amount, 0), ) form = await get_form(form_id) - assert form, "Newly created form couldn't be retrieved" + assert form, "Newly created forms couldn't be retrieved" return form async def update_form(form_id: str, **kwargs) -> Forms: q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) await db.execute( - f"UPDATE lnticket.form SET {q} WHERE id = ?", (*kwargs.values(), form_id) + f"UPDATE lnticket.forms SET {q} WHERE id = ?", (*kwargs.values(), form_id) ) - row = await db.fetchone("SELECT * FROM lnticket.form WHERE id = ?", (form_id,)) + row = await db.fetchone("SELECT * FROM lnticket.forms WHERE id = ?", (form_id,)) assert row, "Newly updated form couldn't be retrieved" return Forms(**row) async def get_form(form_id: str) -> Optional[Forms]: - row = await db.fetchone("SELECT * FROM lnticket.form WHERE id = ?", (form_id,)) + row = await db.fetchone("SELECT * FROM lnticket.forms WHERE id = ?", (form_id,)) return Forms(**row) if row else None @@ -145,11 +146,11 @@ async def get_forms(wallet_ids: Union[str, List[str]]) -> List[Forms]: q = ",".join(["?"] * len(wallet_ids)) rows = await db.fetchall( - f"SELECT * FROM lnticket.form WHERE wallet IN ({q})", (*wallet_ids,) + f"SELECT * FROM lnticket.forms WHERE wallet IN ({q})", (*wallet_ids,) ) return [Forms(**row) for row in rows] async def delete_form(form_id: str) -> None: - await db.execute("DELETE FROM lnticket.form WHERE id = ?", (form_id,)) + await db.execute("DELETE FROM lnticket.forms WHERE id = ?", (form_id,)) diff --git a/lnbits/extensions/lnticket/migrations.py b/lnbits/extensions/lnticket/migrations.py index 82d5f3b8..cfd2f646 100644 --- a/lnbits/extensions/lnticket/migrations.py +++ b/lnbits/extensions/lnticket/migrations.py @@ -145,3 +145,58 @@ async def m003_changed(db): ), ) await db.execute("DROP TABLE lnticket.forms") + + +async def m004_changed(db): + + await db.execute( + """ + CREATE TABLE lnticket.forms ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + name TEXT NOT NULL, + webhook TEXT, + description TEXT NOT NULL, + flatrate INTEGER DEFAULT 0, + amount INTEGER NOT NULL, + amountmade INTEGER NOT NULL, + time TIMESTAMP NOT NULL DEFAULT """ + + db.timestamp_now + + """ + ); + """ + ) + + for row in [list(row) for row in await db.fetchall("SELECT * FROM lnticket.form")]: + usescsv = "" + + for i in range(row[5]): + if row[7]: + usescsv += "," + str(i + 1) + else: + usescsv += "," + str(1) + usescsv = usescsv[1:] + await db.execute( + """ + INSERT INTO lnticket.forms ( + id, + wallet, + name, + webhook, + description, + amount, + amountmade, + ) + VALUES (?, ?, ?, ?, ?, ?, ?) + """, + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + row[6], + ), + ) + await db.execute("DROP TABLE lnticket.form") diff --git a/lnbits/extensions/lnticket/models.py b/lnbits/extensions/lnticket/models.py index 362bc223..fdf4a5ff 100644 --- a/lnbits/extensions/lnticket/models.py +++ b/lnbits/extensions/lnticket/models.py @@ -7,7 +7,8 @@ class Forms(NamedTuple): name: str webhook: str description: str - costpword: int + amount: int + flatrate: int amountmade: int time: int diff --git a/lnbits/extensions/lnticket/templates/lnticket/display.html b/lnbits/extensions/lnticket/templates/lnticket/display.html index d570ad79..d1ba6524 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/display.html +++ b/lnbits/extensions/lnticket/templates/lnticket/display.html @@ -23,11 +23,20 @@ label="Your email (optional, if you want a reply)" > +

{% raw %}{{amountWords}}{% endraw %}

@@ -87,6 +96,7 @@ return { paymentReq: null, redirectUrl: null, + flatrate: parseInt('{{form_flatrate}}'), formDialog: { show: false, data: { @@ -108,21 +118,24 @@ }, computed: { amountWords() { - var regex = /\s+/gi - var nwords = this.formDialog.data.text - .trim() - .replace(regex, ' ') - .split(' ').length - var sats = nwords * parseInt('{{ form_costpword }}') - if (sats === parseInt('{{ form_costpword }}')) { + if (this.formDialog.data.text.length == '') { return '0 Sats to pay' } else { + var regex = /\s+/gi + var nwords = this.formDialog.data.text + .trim() + .replace(regex, ' ') + .split(' ').length + if (this.flatrate) { + var sats = parseInt('{{ form_amount }}') + } else { + var sats = nwords * parseInt('{{ form_amount }}') + } this.formDialog.data.sats = sats return sats + ' Sats to pay' } } }, - methods: { resetForm: function (e) { e.preventDefault() diff --git a/lnbits/extensions/lnticket/templates/lnticket/index.html b/lnbits/extensions/lnticket/templates/lnticket/index.html index becb5137..1f2d42ec 100644 --- a/lnbits/extensions/lnticket/templates/lnticket/index.html +++ b/lnbits/extensions/lnticket/templates/lnticket/index.html @@ -206,13 +206,25 @@ type="textarea" label="Description " > - +
+
+ +
+
+ +
+
+
Create Form @@ -275,10 +287,16 @@ field: 'description' }, { - name: 'costpword', + name: 'flatrate', align: 'left', - label: 'Cost Per Word', - field: 'costpword' + label: 'Flat Rate', + field: 'flatrate' + }, + { + name: 'amount', + align: 'left', + label: 'Amount', + field: 'amount' } ], pagination: { @@ -299,11 +317,20 @@ }, formDialog: { show: false, - data: {} + data: {flatrate: false} }, cancelListener: () => {} } }, + computed: { + flatRate: function () { + if (this.formDialog.data.flatrate) { + return 'Charge per word' + } else { + return 'Charge flat rate' + } + } + }, methods: { getTickets: function () { var self = this @@ -400,7 +427,8 @@ this.formDialog.data.wallet = link.wallet this.formDialog.data.name = link.name this.formDialog.data.description = link.description - this.formDialog.data.costpword = link.costpword + this.formDialog.data.flatrate = link.flatrate + this.formDialog.data.amount = link.amount this.formDialog.show = true }, updateForm: function (wallet, data) { diff --git a/lnbits/extensions/lnticket/views.py b/lnbits/extensions/lnticket/views.py index 362de7d5..00ba3239 100644 --- a/lnbits/extensions/lnticket/views.py +++ b/lnbits/extensions/lnticket/views.py @@ -28,6 +28,7 @@ async def display(form_id): form_id=form.id, form_name=form.name, form_desc=form.description, - form_costpword=form.costpword, + form_amount=form.amount, + form_flatrate=form.flatrate, form_wallet=wallet.inkey, ) diff --git a/lnbits/extensions/lnticket/views_api.py b/lnbits/extensions/lnticket/views_api.py index 6201a801..11247a40 100644 --- a/lnbits/extensions/lnticket/views_api.py +++ b/lnbits/extensions/lnticket/views_api.py @@ -47,7 +47,8 @@ async def api_forms(): "name": {"type": "string", "empty": False, "required": True}, "webhook": {"type": "string", "empty": False, "required": False}, "description": {"type": "string", "min": 0, "required": True}, - "costpword": {"type": "integer", "min": 0, "required": True}, + "amount": {"type": "integer", "min": 0, "required": True}, + "flatrate": {"type": "integer", "required": True}, } ) async def api_form_create(form_id=None):