diff --git a/app/services/label_render.py b/app/services/label_render.py index 22d2f31..20fd7a2 100644 --- a/app/services/label_render.py +++ b/app/services/label_render.py @@ -101,6 +101,11 @@ FIELD_OPTIONS = [ DEFAULT_FIELDS = ['image', 'name', 'dimensions', 'part_number', 'accent'] +# Hidden marker the options form always submits, so an unticked checkbox +# (which the browser omits entirely) can be told apart from a fresh arrival +# with no options at all. See tape_printer.FORM_MARKER. +FORM_MARKER = '_opts' + @dataclass class LabelOptions: @@ -126,7 +131,14 @@ def get_preset(key: Optional[str]) -> SheetPreset: def options_from_form(form) -> LabelOptions: - """Build LabelOptions from request.form or request.args.""" + """ + Build LabelOptions from request.form or request.args. + + FORM_MARKER tells a real submission from a fresh arrival, so unticking + every field is honoured instead of silently snapping back to the + defaults. Same reasoning as tape_printer.options_from_form. + """ + submitted = FORM_MARKER in form def number(key, default, cast=float): try: @@ -134,10 +146,13 @@ def options_from_form(form) -> LabelOptions: except (TypeError, ValueError): return default - fields = form.getlist('fields') if hasattr(form, 'getlist') else None + fields = list(form.getlist('fields')) if hasattr(form, 'getlist') else [] + if not fields and not submitted: + fields = list(DEFAULT_FIELDS) + return LabelOptions( preset=form.get('preset') or DEFAULT_PRESET, - fields=fields if fields else list(DEFAULT_FIELDS), + fields=fields, offset_x=number('offset_x', 0.0), offset_y=number('offset_y', 0.0), skip=max(0, number('skip', 0, int)), @@ -325,7 +340,7 @@ def render_pdf(layout, upload_folder): if 'location' in fields and label.location: meta.append(label.location) if meta: - write(' \u00b7 '.join(m for m in meta if m), type_sizes['meta']) + write(' ยท '.join(m for m in meta if m), type_sizes['meta']) pdf.save() buffer.seek(0)