Skip to content
Snippets Groups Projects
Commit 22279880 authored by Thomas Schneider's avatar Thomas Schneider
Browse files

Add printing functionality

parent 5143b1e1
No related branches found
No related tags found
No related merge requests found
......@@ -6,3 +6,8 @@ TEMPLATES_AUTO_RELOAD = True
SCHILD_FOOTER = "Organization Without a Cool Acronym – O.W.C.A."
SCHILD_LOGO = "img/owca.png"
PRINTERS = {
"Office": "ipps://printserver.example.com:443/printers/Office",
"Kitchen": "ipp://kitchenprinter.local:631/ipp/print",
}
This diff is collapsed.
......@@ -12,13 +12,14 @@ license = {text = "EUPL-1.2"}
dependencies = [
"weasyprint",
"jinja2",
"flask",
"flask[async]>=3.0.3",
"flask-sqlalchemy",
"flask-wtf",
"uuid7",
"psycopg",
"flask-weasyprint",
"python-webpack-boilerplate",
"pyipp @ git+https://github.com/ctalkington/python-ipp",
]
[tool.pdm.dev-dependencies]
......
......@@ -40,3 +40,12 @@ class SchildForm(FlaskForm):
"Vorlage",
validators=[validators.DataRequired()],
)
class PrintForm(FlaskForm):
printer = fields.SelectField("Drucker")
copies = fields.IntegerField(
"Kopien",
default=1,
validators=[validators.NumberRange(1, 10), validators.InputRequired()],
)
......@@ -114,6 +114,16 @@
Als PDF anzeigen
</a>
</div>
<section><form method="post" action="{{ url_for('.print', ident=schild.ident) }}">
{%- for field in printform -%}
{{ render_field(field) }}
{%- endfor -%}
<input type="submit" value="Drucken" />
</form></section>
<div>
<h2>Vorschau</h2>
<div class="preview-container" id="preview-container">
......
from . import db
from .instance import list_templates, list_images
from .models import Schild, SchildForm
from .models import Schild, SchildForm, PrintForm
from flask import Blueprint, render_template, request, redirect, url_for
from flask import (
Blueprint,
current_app as app,
flash,
render_template,
request,
redirect,
url_for,
)
import flask_weasyprint
from pyipp import IPP
from pyipp.enums import IppOperation
from pyipp.exceptions import IPPError
bp = Blueprint("views", __name__)
......@@ -29,11 +42,43 @@ def _do_schild_form(schild):
def schild(ident):
schild = db.get_or_404(Schild, ident)
form = _do_schild_form(schild)
printform = PrintForm()
printform.printer.choices = list(app.config["PRINTERS"])
return render_template(
"schild.html.j2",
schild=schild,
form=form,
printform=printform,
)
@bp.route("/schild/<ident>/print", methods=["POST"])
async def print(ident):
form = PrintForm(request.form)
form.printer.choices = list(app.config["PRINTERS"])
if form.validate():
async with IPP(app.config["PRINTERS"][form.printer.data]) as ipp:
try:
response = await ipp.execute(
IppOperation.PRINT_JOB,
{
"operation-attributes-tag": {
"requesting-user-name": "schilder2000",
"job-name": f"schild-{ident}.pdf",
"document-name": f"schild-{ident}.pdf",
"document-format": "application/pdf",
"copies": form.copies.data,
"job-media-sheets": form.copies.data,
},
"data": flask_weasyprint.HTML(url_for("instance.schild_html", ident=ident)).write_pdf(),
},
)
flash("Druckt …")
app.logger.debug("print %s: %r", ident, response)
except IPPError:
flash("Druck fehlgeschlagen!", "error")
pass
return redirect(url_for(".schild", ident=ident))
@bp.route("/create", methods=["GET", "POST"])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment