From e2ae029a09d71c7c961d4bc0d8acd793e15cd19d Mon Sep 17 00:00:00 2001 From: Piotr Dobrowolski Date: Wed, 8 Apr 2020 20:09:24 +0200 Subject: [PATCH] Add label rendering --- Dockerfile | 2 + formity/admin.py | 11 +++++- requirements.txt | 13 +++++++ templates/faceshieldrequest_list.html | 6 +++ templates/label.html | 56 +++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 templates/faceshieldrequest_list.html create mode 100644 templates/label.html diff --git a/Dockerfile b/Dockerfile index df92201..d92cabe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,8 @@ RUN apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev postgresql pip3 install --no-cache-dir psycopg2==2.8.4 pycparser==2.20 cffi==1.14.0 bcrypt==3.1.7 && \ apk del --no-cache .build-deps +RUN apk add --no-cache py3-pillow cairo pango glib font-noto + COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt diff --git a/formity/admin.py b/formity/admin.py index c2c9534..2a3ed82 100644 --- a/formity/admin.py +++ b/formity/admin.py @@ -1,4 +1,4 @@ -from flask import redirect, flash, request +from flask import redirect, flash, request, url_for import flask_admin from formity.extensions import admin, db, ModelView, ModelViewHighSecurity, AdminSecurityMixin from wtforms import TextAreaField @@ -6,6 +6,7 @@ from formity.models import FaceshieldRequest, RequestChange, Status, PostalCode, from spaceauth import current_user import enum import decimal +from flask_weasyprint import HTML, render_pdf from sqlalchemy import inspect, func from sqlalchemy.orm import class_mapper from sqlalchemy.orm.attributes import get_history @@ -151,6 +152,14 @@ class FaceshieldRequestAdmin(ModelView): state_after=after, )) + @flask_admin.expose('/label/') + def label(self): + return render_pdf(HTML(string=self.label_html())) + + @flask_admin.expose('/label/html') + def label_html(self): + return self.render('label.html', model=self.get_one(request.args.get('id'))) + class FilteredFaceshieldRequestAdmin(FaceshieldRequestAdmin): def get_query(self): return super(FilteredFaceshieldRequestAdmin, self).get_query().filter(FaceshieldRequest.status != Status.rejected, FaceshieldRequest.status != Status.spam) diff --git a/requirements.txt b/requirements.txt index 7bd6dce..1de827d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,14 @@ alembic==1.4.2 Babel==2.8.0 blinker==1.4 +cairocffi==1.1.0 +CairoSVG==2.4.2 certifi==2019.11.28 +cffi==1.14.0 chardet==3.0.4 click==7.1.1 +cssselect2==0.3.0 +defusedxml==0.6.0 environs==7.3.1 Flask==1.1.1 Flask-Admin==1.5.5 @@ -13,7 +18,9 @@ Flask-Migrate==2.5.3 Flask-OAuthlib==0.9.5 git+https://code.hackerspace.pl/informatic/flask-spaceauth#egg=Flask-SpaceAuth Flask-SQLAlchemy==2.4.1 +Flask-WeasyPrint==0.6 Flask-WTF==0.14.3 +html5lib==1.0.1 idna==2.9 itsdangerous==1.1.0 Jinja2==2.11.1 @@ -21,8 +28,11 @@ Mako==1.1.2 MarkupSafe==1.1.1 marshmallow==3.5.1 oauthlib==2.1.0 +Pillow==6.2.1 prometheus-client==0.7.1 prometheus-flask-exporter==0.13.0 +pycparser==2.20 +Pyphen==0.9.5 python-dateutil==2.8.1 python-dotenv==0.12.0 python-editor==1.0.4 @@ -31,6 +41,9 @@ requests==2.23.0 requests-oauthlib==1.3.0 six==1.14.0 SQLAlchemy==1.3.15 +tinycss2==1.0.2 urllib3==1.25.8 +WeasyPrint==51 +webencodings==0.5.1 Werkzeug==0.16.1 WTForms==2.2.1 diff --git a/templates/faceshieldrequest_list.html b/templates/faceshieldrequest_list.html new file mode 100644 index 0000000..53ff5f4 --- /dev/null +++ b/templates/faceshieldrequest_list.html @@ -0,0 +1,6 @@ +{% extends 'admin/model/list.html' %} +{% block list_row_actions %} + {{ super() }} + + +{% endblock %} diff --git a/templates/label.html b/templates/label.html new file mode 100644 index 0000000..d93c9f0 --- /dev/null +++ b/templates/label.html @@ -0,0 +1,56 @@ + + + + + + +
+
+ {{ model.faceshield_full_delivered }} #{{ model.id }} +
+
+ {{ model.entity_info }} +
+
+ {{ model.full_name }} {{ model.phone_number }} +
+
+ +