from io import BytesIO from typing import List from barcodes.attributes import AttributeWriterFactory from barcodes.generator.base import BaseBarcodeGenerator from barcodes.pdf import PDFGenerator from barcodes.types import BarcodeData, PdfBarcodeGenData, PdfBarcodeImageGenData class DefaultBarcodeGenerator(BaseBarcodeGenerator): def generate(self, barcodes_data: List[BarcodeData | PdfBarcodeImageGenData]) -> BytesIO: pdf_generator = PDFGenerator() pdf_barcodes_gen_data: List[PdfBarcodeGenData | PdfBarcodeImageGenData] = [] for barcode_data in barcodes_data: if "barcode" in barcode_data: attributes = {} for attribute in barcode_data["template"].attributes: attribute_getter = AttributeWriterFactory.get_writer(attribute.key) if not attribute_getter: continue value = attribute_getter.get_value(barcode_data["product"]) if not value or not value.strip(): continue attributes[attribute.name] = value for additional_attribute in barcode_data["template"].additional_attributes: value = additional_attribute.value if not value: continue attributes[additional_attribute.name] = value barcode_text = '
'.join([f'{key}: {value}' for key, value in attributes.items()]) pdf_barcodes_gen_data.append({ "barcode_value": barcode_data["barcode"], "text": barcode_text, "num_duplicates": barcode_data["num_duplicates"] }) else: pdf_barcodes_gen_data.append(barcode_data) return pdf_generator.generate(pdf_barcodes_gen_data)