From 02f8bcbe23af1202727e4c8f509ef1fd7448ae0c Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Sun, 13 Mar 2022 14:44:35 +0100 Subject: [PATCH] PDF editor: Allow combinations of placeholders --- src/pretix/base/pdf.py | 27 ++++++++++++++++++- .../static/pretixcontrol/js/ui/editor.js | 1 + 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/pdf.py b/src/pretix/base/pdf.py index 48b2b6ddea..ab86b8ea7d 100644 --- a/src/pretix/base/pdf.py +++ b/src/pretix/base/pdf.py @@ -37,6 +37,7 @@ import hashlib import itertools import logging import os +import re import subprocess import tempfile import uuid @@ -624,6 +625,8 @@ class Renderer: def _draw_barcodearea(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict): content = o.get('content', 'secret') if content == 'secret': + # do not use get_text_content because it uses a shortened version of secret + # and does not deal with our default value here properly content = op.secret else: content = self._get_text_content(op, order, o) @@ -653,20 +656,42 @@ class Renderer: return self._get_text_content(op, order, o, True) ev = self._get_ev(op, order) + if not o['content']: return '(error)' + if o['content'] == 'other': - return o['text'] + text = o['text'] + + def replace(x): + if x.group(1) not in self.variables: + return x.group(0) + if x.group(1) == 'secret': + # Do not use shortened version + return op.secret + try: + return self.variables[x.group(1)]['evaluate'](op, order, ev) + except: + logger.exception('Failed to process variable.') + return '(error)' + + # We do not use str.format like in emails so we (a) can evaluate lazily and (b) can re-implement this + # 1:1 on other platforms that render PDFs through our API (libpretixprint) + return re.sub(r'\{([a-zA-Z0-9_]+)\}', replace, text) + elif o['content'].startswith('itemmeta:'): return op.item.meta_data.get(o['content'][9:]) or '' + elif o['content'].startswith('meta:'): return ev.meta_data.get(o['content'][5:]) or '' + elif o['content'] in self.variables: try: return self.variables[o['content']]['evaluate'](op, order, ev) except: logger.exception('Failed to process variable.') return '(error)' + return '' def _draw_imagearea(self, canvas: Canvas, op: OrderPosition, order: Order, o: dict): diff --git a/src/pretix/static/pretixcontrol/js/ui/editor.js b/src/pretix/static/pretixcontrol/js/ui/editor.js index 3dfcf3fc42..fee7cbd44d 100644 --- a/src/pretix/static/pretixcontrol/js/ui/editor.js +++ b/src/pretix/static/pretixcontrol/js/ui/editor.js @@ -190,6 +190,7 @@ var editor = { bottom: editor._px2mm(editor.pdf_viewport.height - o.height * o.scaleY - top).toFixed(2), size: editor._px2mm(o.height * o.scaleY).toFixed(2), content: o.content, + text: o.text, nowhitespace: o.nowhitespace || false, }); } else if (o.type === "poweredby") {