Keep the BOM requirement on parent rows. In allocation subtables, use
the shared part renderer with full_name when the allocated part differs
from the requirement, respecting PART_NAME_FORMAT. Exact matches keep
the compact name; shared copy, thumbnail and status behavior is retained.
Mark differing parts with a neutral information icon and scope output
allocation tables to the selected output. Cover revision differences,
family descendants, empty fields, custom formats, copying and refresh.
* Preserve label rendering validation errors
* Preserve label validation diagnostics before output deletion
Keep logging validation errors in both rendering wrappers before re-raising the original exception. LabelTemplate.print deletes failed DataOutput records, so the error log preserves the diagnostic after the result is removed.
Update the mocked tests to require logging while retaining the original validation details.
* Apply Ruff preview formatting to label rendering tests
Retain DataOutput records with the original printing error and mark jobs
failed when their plugin is unavailable. Keep exception propagation and
skip failed outputs on redelivery to avoid printing partial batches again.
Cover direct and worker exceptions, unavailable plugins, failed-job
redelivery, and missing or completed outputs.
* Extract Data Matrix rendering helpers
* Add SVG Data Matrix output
* Verify vector Data Matrix output in PDFs
---------
Co-authored-by: Oliver <oliver.henry.walters@gmail.com>