from io import BytesIO from typing import List, Dict from barcodes.attributes import AttributeWriterFactory from barcodes.generator.base import BaseBarcodeGenerator from barcodes.pdf import PDFGenerator from models import Product, BarcodeTemplate from schemas.barcode import PdfBarcodeGenData class DefaultBarcodeGenerator(BaseBarcodeGenerator): def generate(self, barcodes_data: List[Dict[str, str | Product | BarcodeTemplate | int]]) -> BytesIO: pdf_generator = PDFGenerator() pdf_barcodes_gen_data: List[PdfBarcodeGenData] = [] for barcode_data in barcodes_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: attributes[additional_attribute.name] = additional_attribute.value barcode_text = '
'.join([f'{key}: {value}' for key, value in attributes.items()]) pdf_barcodes_gen_data.append( PdfBarcodeGenData( barcode_value=barcode_data["barcode"], text=barcode_text, num_duplicates=barcode_data["quantity"] ) ) return pdf_generator.generate(pdf_barcodes_gen_data)