Add label rendering
parent
4b07ba0a35
commit
e2ae029a09
|
@ -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 && \
|
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
|
apk del --no-cache .build-deps
|
||||||
|
|
||||||
|
RUN apk add --no-cache py3-pillow cairo pango glib font-noto
|
||||||
|
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
RUN pip3 install --no-cache-dir -r requirements.txt
|
RUN pip3 install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from flask import redirect, flash, request
|
from flask import redirect, flash, request, url_for
|
||||||
import flask_admin
|
import flask_admin
|
||||||
from formity.extensions import admin, db, ModelView, ModelViewHighSecurity, AdminSecurityMixin
|
from formity.extensions import admin, db, ModelView, ModelViewHighSecurity, AdminSecurityMixin
|
||||||
from wtforms import TextAreaField
|
from wtforms import TextAreaField
|
||||||
|
@ -6,6 +6,7 @@ from formity.models import FaceshieldRequest, RequestChange, Status, PostalCode,
|
||||||
from spaceauth import current_user
|
from spaceauth import current_user
|
||||||
import enum
|
import enum
|
||||||
import decimal
|
import decimal
|
||||||
|
from flask_weasyprint import HTML, render_pdf
|
||||||
from sqlalchemy import inspect, func
|
from sqlalchemy import inspect, func
|
||||||
from sqlalchemy.orm import class_mapper
|
from sqlalchemy.orm import class_mapper
|
||||||
from sqlalchemy.orm.attributes import get_history
|
from sqlalchemy.orm.attributes import get_history
|
||||||
|
@ -151,6 +152,14 @@ class FaceshieldRequestAdmin(ModelView):
|
||||||
state_after=after,
|
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):
|
class FilteredFaceshieldRequestAdmin(FaceshieldRequestAdmin):
|
||||||
def get_query(self):
|
def get_query(self):
|
||||||
return super(FilteredFaceshieldRequestAdmin, self).get_query().filter(FaceshieldRequest.status != Status.rejected, FaceshieldRequest.status != Status.spam)
|
return super(FilteredFaceshieldRequestAdmin, self).get_query().filter(FaceshieldRequest.status != Status.rejected, FaceshieldRequest.status != Status.spam)
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
alembic==1.4.2
|
alembic==1.4.2
|
||||||
Babel==2.8.0
|
Babel==2.8.0
|
||||||
blinker==1.4
|
blinker==1.4
|
||||||
|
cairocffi==1.1.0
|
||||||
|
CairoSVG==2.4.2
|
||||||
certifi==2019.11.28
|
certifi==2019.11.28
|
||||||
|
cffi==1.14.0
|
||||||
chardet==3.0.4
|
chardet==3.0.4
|
||||||
click==7.1.1
|
click==7.1.1
|
||||||
|
cssselect2==0.3.0
|
||||||
|
defusedxml==0.6.0
|
||||||
environs==7.3.1
|
environs==7.3.1
|
||||||
Flask==1.1.1
|
Flask==1.1.1
|
||||||
Flask-Admin==1.5.5
|
Flask-Admin==1.5.5
|
||||||
|
@ -13,7 +18,9 @@ Flask-Migrate==2.5.3
|
||||||
Flask-OAuthlib==0.9.5
|
Flask-OAuthlib==0.9.5
|
||||||
git+https://code.hackerspace.pl/informatic/flask-spaceauth#egg=Flask-SpaceAuth
|
git+https://code.hackerspace.pl/informatic/flask-spaceauth#egg=Flask-SpaceAuth
|
||||||
Flask-SQLAlchemy==2.4.1
|
Flask-SQLAlchemy==2.4.1
|
||||||
|
Flask-WeasyPrint==0.6
|
||||||
Flask-WTF==0.14.3
|
Flask-WTF==0.14.3
|
||||||
|
html5lib==1.0.1
|
||||||
idna==2.9
|
idna==2.9
|
||||||
itsdangerous==1.1.0
|
itsdangerous==1.1.0
|
||||||
Jinja2==2.11.1
|
Jinja2==2.11.1
|
||||||
|
@ -21,8 +28,11 @@ Mako==1.1.2
|
||||||
MarkupSafe==1.1.1
|
MarkupSafe==1.1.1
|
||||||
marshmallow==3.5.1
|
marshmallow==3.5.1
|
||||||
oauthlib==2.1.0
|
oauthlib==2.1.0
|
||||||
|
Pillow==6.2.1
|
||||||
prometheus-client==0.7.1
|
prometheus-client==0.7.1
|
||||||
prometheus-flask-exporter==0.13.0
|
prometheus-flask-exporter==0.13.0
|
||||||
|
pycparser==2.20
|
||||||
|
Pyphen==0.9.5
|
||||||
python-dateutil==2.8.1
|
python-dateutil==2.8.1
|
||||||
python-dotenv==0.12.0
|
python-dotenv==0.12.0
|
||||||
python-editor==1.0.4
|
python-editor==1.0.4
|
||||||
|
@ -31,6 +41,9 @@ requests==2.23.0
|
||||||
requests-oauthlib==1.3.0
|
requests-oauthlib==1.3.0
|
||||||
six==1.14.0
|
six==1.14.0
|
||||||
SQLAlchemy==1.3.15
|
SQLAlchemy==1.3.15
|
||||||
|
tinycss2==1.0.2
|
||||||
urllib3==1.25.8
|
urllib3==1.25.8
|
||||||
|
WeasyPrint==51
|
||||||
|
webencodings==0.5.1
|
||||||
Werkzeug==0.16.1
|
Werkzeug==0.16.1
|
||||||
WTForms==2.2.1
|
WTForms==2.2.1
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
{% extends 'admin/model/list.html' %}
|
||||||
|
{% block list_row_actions %}
|
||||||
|
{{ super() }}
|
||||||
|
<a href="{{ url_for('map.index', id=row.id) }}" class="icon" title="Show on map"><span class="glyphicon glyphicon-map-marker"></span></a>
|
||||||
|
<a href="{{ url_for('faceshieldrequest.label', id=row.id) }}" class="icon" title="Render package label"><span class="glyphicon glyphicon-print"></span></a>
|
||||||
|
{% endblock %}
|
|
@ -0,0 +1,56 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@page {
|
||||||
|
margin: 0cm;
|
||||||
|
size: 15cm 10cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
width: 15cm;
|
||||||
|
height: 10cm;
|
||||||
|
font-family: "Lato";
|
||||||
|
font-size: 16pt
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
height: 10cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line {
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 15cm;
|
||||||
|
padding: 0.5cm;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mark {
|
||||||
|
background: #eee;
|
||||||
|
}
|
||||||
|
|
||||||
|
.idline {
|
||||||
|
font-size: 35pt;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div class="line idline">
|
||||||
|
{{ model.faceshield_full_delivered }} <b>#{{ model.id }}</b>
|
||||||
|
</div>
|
||||||
|
<div class="line mark">
|
||||||
|
{{ model.entity_info }}
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
{{ model.full_name }} {{ model.phone_number }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in New Issue