Switch invoice download to API endpoint

This starts using the recently added Go API endpoint for invoice
downloads in the front-end.

This removes all usage of weasyprint from meta.sr.ht.
This commit is contained in:
Conrad Hoffmann 2023-02-24 12:53:39 +01:00 committed by Drew DeVault
parent 835f74056f
commit 68fc1966da
3 changed files with 12 additions and 91 deletions

View File

@ -1,3 +1,4 @@
import requests
import stripe
from datetime import datetime, timedelta
from flask import Blueprint, render_template, request, redirect
@ -7,7 +8,8 @@ from metasrht.billing import charge_user
from metasrht.types import User, UserType, PaymentInterval, Invoice
from metasrht.webhooks import deliver_profile_update
from sqlalchemy import and_
from srht.config import cfg
from srht.config import cfg, get_origin
from srht.crypto import encrypt_request_authorization
from srht.database import db
from srht.flask import session
from srht.oauth import current_user, loginrequired, freshen_user
@ -213,38 +215,13 @@ def invoice_GET(invoice_id):
@billing.route("/billing/invoice/<int:invoice_id>", methods=["POST"])
@loginrequired
def invoice_POST(invoice_id):
invoice = Invoice.query.filter(Invoice.id == invoice_id).one_or_none()
if not invoice:
abort(404)
if (invoice.user_id != current_user.id
and current_user.user_type != UserType.admin):
abort(401)
valid = Validation(request)
bill_to = valid.optional("address-to")
if not bill_to:
bill_to = "~" + invoice.user.username
bill_from = [l for l in [
cfg("meta.sr.ht::billing", "address-line1", default=None),
cfg("meta.sr.ht::billing", "address-line2", default=None),
cfg("meta.sr.ht::billing", "address-line3", default=None),
cfg("meta.sr.ht::billing", "address-line4", default=None)
] if l]
# Split bill_to to first row (rendered as heading) and others
[bill_from_head, *bill_from_tail] = bill_from or [None]
html = render_template("billing-invoice-pdf.html",
invoice=invoice,
amount=f"${invoice.cents / 100:.2f}",
source=invoice.source,
created=invoice.created.strftime("%Y-%m-%d"),
valid_thru=invoice.valid_thru.strftime("%Y-%m-%d"),
bill_to=bill_to,
bill_from_head=bill_from_head,
bill_from_tail=bill_from_tail)
pdf = HTML(string=html).write_pdf()
filename = f"invoice_{invoice.id}.pdf"
origin = cfg("meta.sr.ht", "api-origin", default=get_origin("meta.sr.ht"))
headers = {
"X-Forwarded-For": ", ".join(request.access_route),
**encrypt_request_authorization(user=current_user),
}
r = requests.post(f"{origin}/query/invoice/{invoice_id}",
headers=headers, data=request.get_data())
filename = f"invoice_{invoice_id}.pdf"
headers = [('Content-Disposition', f'attachment; filename="{filename}"')]
return Response(pdf, mimetype="application/pdf", headers=headers)
return Response(r.content, mimetype="application/pdf", headers=headers)

View File

@ -1,55 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>sr.ht subscription invoice</title>
<style type="text/css">
* {
font-family: "Courier New", Courier, monospace;
font-size: 14px;
}
h1 {
font-size: 1.6rem;
margin-bottom: .5rem;
}
</style>
</head>
<body>
{% if bill_from_head %}
<h1>{{ bill_from_head }}</h1>
{% endif %}
{% for line in bill_from_tail %}
{{ line }}
{% if not loop.last %}<br />{% endif %}
{% endfor %}
<div style="float: right">
<strong>
Invoice #{{ invoice.id }}
</strong><br />
Issued {{ created }}
</div>
<div style="clear: both"></div>
<hr />
<dl>
<dt>Service</dt>
<dd>sr.ht subscription fee</dd>
<dt>Amount</dt>
<dd>{{ amount }}</dd>
<dt>Paid with</dt>
<dd>{{ source }}</dd>
<dt>Paid on</dt>
<dd>{{ created }}</dd>
<dt>Valid for service thru</dt>
<dd>{{ valid_thru }}</dd>
</dl>
<hr />
<p><strong>Invoice to</strong>:</p>
<pre>{{ bill_to }}</pre>
</body>
</html>

View File

@ -42,7 +42,6 @@ setup(
'srht',
'stripe',
'prometheus_client',
'weasyprint',
'zxcvbn'
],
extras_require = {