Add support for invoices

master
Drew DeVault 6 years ago
parent b667230570
commit 85ce9c5327
  1. 7
      fosspay/blueprints/html.py
  2. 13
      fosspay/objects.py
  3. 20
      invoice
  4. 60
      templates/invoice.html

@ -295,3 +295,10 @@ def cancel(id):
db.commit() db.commit()
send_cancellation_notice(user, donation) send_cancellation_notice(user, donation)
return redirect("/panel") return redirect("/panel")
@html.route("/invoice/<id>")
def invoice(id):
invoice = Invoice.query.filter(Invoice.external_id == id).first()
if not invoice:
abort(404)
return render_template("invoice.html", invoice=invoice)

@ -8,6 +8,7 @@ from .database import Base
from datetime import datetime from datetime import datetime
from enum import Enum from enum import Enum
import bcrypt import bcrypt
import binascii
import os import os
import hashlib import hashlib
@ -99,3 +100,15 @@ class Project(Base):
def __repr__(self): def __repr__(self):
return "<Project {} {}>".format(self.id, self.name) return "<Project {} {}>".format(self.id, self.name)
class Invoice(Base):
__tablename__ = 'invoices'
id = Column(Integer, primary_key=True)
created = Column(DateTime, nullable=False)
external_id = Column(String(16), index=True)
amount = Column(Integer, nullable=False)
comment = Column(String(512), nullable=False)
def __init__(self):
self.external_id = binascii.hexlify(os.urandom(8)).decode()
self.created = datetime.now()

@ -0,0 +1,20 @@
#!/usr/bin/env python3
from fosspay.database import db
from fosspay.objects import Invoice
from fosspay.config import _cfg
import sys
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} <amount in cents> <comment>")
sys.exit(1)
amount = int(sys.argv[1])
comment = sys.argv[2]
invoice = Invoice()
invoice.amount = amount
invoice.comment = comment
db.add(invoice)
db.commit()
print(f"{_cfg('protocol')}://{_cfg('domain')}/invoice/{invoice.external_id}")

@ -0,0 +1,60 @@
{% extends "layout.html" %}
{% block scripts %}
<script>
window.stripe_key = "{{ _cfg("stripe-publish") }}";
window.your_name = "{{ _cfg("your-name") }}";
window.amount = {{invoice.amount}};
window.invoice = "{{invoice.external_id}}";
window.comment = "{{invoice.comment}}";
const currency = "{{ _cfg("currency") }}";
</script>
<script src="//checkout.stripe.com/checkout.js"></script>
<script src="../static/invoice.js"></script>
{% endblock %}
{% block body %}
<div class="well">
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1>Invoice to {{ _cfg("your-name") }}</h1>
</div>
</div>
</div>
</div>
<noscript>
<div class="container">
<div class="alert alert-danger">
<p>This page requires Javascript. It's necessary to send your credit card number to
<a href="https://stripe.com/">Stripe</a> directly.</p>
</div>
</div>
</noscript>
<div class="container text-center hidden" id="thanks">
<p>Thank you for your payment - it has been processed successfully.</p>
</div>
<div class="container text-center" id="donation-stuff">
<h3>Invoice for ${{"{:.2f}".format(invoice.amount / 100)}}</h3>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<p>
{{invoice.comment}}
</p>
</div>
</div>
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="alert alert-danger hidden" id="errors"><p></p></div>
<button class="btn btn-block btn-success" id="submit">
Submit Payment
</button>
</div>
</div>
</div>
<div class="container text-center">
<p>
<small class="text-muted">
Powered by <a href="https://github.com/SirCmpwn/fosspay">fosspay</a>.
</small>
</p>
</div>
{% endblock %}
Loading…
Cancel
Save