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

Add printing functionality

parent 5143b1e1
Branches
Tags
No related merge requests found
...@@ -6,3 +6,8 @@ TEMPLATES_AUTO_RELOAD = True ...@@ -6,3 +6,8 @@ TEMPLATES_AUTO_RELOAD = True
SCHILD_FOOTER = "Organization Without a Cool Acronym – O.W.C.A." SCHILD_FOOTER = "Organization Without a Cool Acronym – O.W.C.A."
SCHILD_LOGO = "img/owca.png" 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"} ...@@ -12,13 +12,14 @@ license = {text = "EUPL-1.2"}
dependencies = [ dependencies = [
"weasyprint", "weasyprint",
"jinja2", "jinja2",
"flask", "flask[async]>=3.0.3",
"flask-sqlalchemy", "flask-sqlalchemy",
"flask-wtf", "flask-wtf",
"uuid7", "uuid7",
"psycopg", "psycopg",
"flask-weasyprint", "flask-weasyprint",
"python-webpack-boilerplate", "python-webpack-boilerplate",
"pyipp @ git+https://github.com/ctalkington/python-ipp",
] ]
[tool.pdm.dev-dependencies] [tool.pdm.dev-dependencies]
......
...@@ -40,3 +40,12 @@ class SchildForm(FlaskForm): ...@@ -40,3 +40,12 @@ class SchildForm(FlaskForm):
"Vorlage", "Vorlage",
validators=[validators.DataRequired()], 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 @@ ...@@ -114,6 +114,16 @@
Als PDF anzeigen Als PDF anzeigen
</a> </a>
</div> </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> <div>
<h2>Vorschau</h2> <h2>Vorschau</h2>
<div class="preview-container" id="preview-container"> <div class="preview-container" id="preview-container">
......
from . import db from . import db
from .instance import list_templates, list_images 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__) bp = Blueprint("views", __name__)
...@@ -29,11 +42,43 @@ def _do_schild_form(schild): ...@@ -29,11 +42,43 @@ def _do_schild_form(schild):
def schild(ident): def schild(ident):
schild = db.get_or_404(Schild, ident) schild = db.get_or_404(Schild, ident)
form = _do_schild_form(schild) form = _do_schild_form(schild)
printform = PrintForm()
printform.printer.choices = list(app.config["PRINTERS"])
return render_template( return render_template(
"schild.html.j2", "schild.html.j2",
schild=schild, schild=schild,
form=form, 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"]) @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