feat: pdf generation using product barcode images
This commit is contained in:
@@ -1,43 +1,44 @@
|
||||
from io import BytesIO
|
||||
from typing import List, Dict
|
||||
from typing import List
|
||||
|
||||
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
|
||||
from barcodes.types import BarcodeData, PdfBarcodeGenData, PdfBarcodeImageGenData
|
||||
|
||||
|
||||
class DefaultBarcodeGenerator(BaseBarcodeGenerator):
|
||||
def generate(self, barcodes_data: List[Dict[str, str | Product | BarcodeTemplate | int]]) -> BytesIO:
|
||||
def generate(self, barcodes_data: List[BarcodeData | PdfBarcodeImageGenData]) -> BytesIO:
|
||||
pdf_generator = PDFGenerator()
|
||||
|
||||
pdf_barcodes_gen_data: List[PdfBarcodeGenData] = []
|
||||
pdf_barcodes_gen_data: List[PdfBarcodeGenData | PdfBarcodeImageGenData] = []
|
||||
|
||||
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 "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 = '<br/>'.join([f'{key}: {value}' for key, value in attributes.items()])
|
||||
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 = '<br/>'.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"]
|
||||
)
|
||||
)
|
||||
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user