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