feat: pdf generation using product barcode images

This commit is contained in:
2024-11-02 00:53:45 +04:00
parent 5ed42d99dc
commit 25060322a1
9 changed files with 212 additions and 125 deletions

View File

@@ -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)