feat: printing uploaded product barcode images

This commit is contained in:
2025-10-30 15:41:32 +04:00
parent 82fcd6e8cb
commit 307e6573e3
2 changed files with 32 additions and 15 deletions

View File

@ -1,6 +1,7 @@
from io import BytesIO from io import BytesIO
from typing import Any, Optional from typing import Any, Optional
import aiohttp
from reportlab.graphics.barcode import code128 from reportlab.graphics.barcode import code128
from reportlab.lib.units import mm from reportlab.lib.units import mm
from reportlab.platypus import Spacer, PageBreak, Paragraph from reportlab.platypus import Spacer, PageBreak, Paragraph
@ -24,7 +25,7 @@ class BarcodePdfGenerator(PDFGenerator):
return None return None
return value return value
def generate( async def generate(
self, barcodes_data: list[BarcodeData | PdfBarcodeImageGenData] self, barcodes_data: list[BarcodeData | PdfBarcodeImageGenData]
) -> BytesIO: ) -> BytesIO:
pdf_barcodes_gen_data: list[PdfBarcodeGenData | PdfBarcodeImageGenData] = [] pdf_barcodes_gen_data: list[PdfBarcodeGenData | PdfBarcodeImageGenData] = []
@ -52,9 +53,9 @@ class BarcodePdfGenerator(PDFGenerator):
} }
) )
return self._generate(pdf_barcodes_gen_data) return await self._generate(pdf_barcodes_gen_data)
def _generate( async def _generate(
self, barcodes_data: list[PdfBarcodeGenData | PdfBarcodeImageGenData] self, barcodes_data: list[PdfBarcodeGenData | PdfBarcodeImageGenData]
) -> BytesIO: ) -> BytesIO:
pdf_maker = PdfMaker((self.page_width, self.page_height)) pdf_maker = PdfMaker((self.page_width, self.page_height))
@ -63,9 +64,10 @@ class BarcodePdfGenerator(PDFGenerator):
for barcode_data in barcodes_data: for barcode_data in barcodes_data:
if "barcode_value" in barcode_data: if "barcode_value" in barcode_data:
pdf_files.append(self._generate_for_one_product(barcode_data)) result = self._generate_for_one_product(barcode_data)
else: else:
pdf_files.append(self._generate_for_one_product_using_img(barcode_data)) result = await self._generate_for_one_product_using_img(barcode_data)
pdf_files.append(result)
pdf_files.append(self._generate_spacers()) pdf_files.append(self._generate_spacers())
for file in pdf_files[:-1]: for file in pdf_files[:-1]:
@ -138,11 +140,18 @@ class BarcodePdfGenerator(PDFGenerator):
buffer.seek(0) buffer.seek(0)
return buffer return buffer
def _generate_for_one_product_using_img( async def _generate_for_one_product_using_img(
self, barcode_data: PdfBarcodeImageGenData self, barcode_data: PdfBarcodeImageGenData
) -> BytesIO: ) -> BytesIO:
with open(barcode_data["barcode_image_url"], "rb") as pdf_file: pdf_url = barcode_data["barcode_image_url"]
pdf_bytes = pdf_file.read()
async with aiohttp.ClientSession() as session:
async with session.get(pdf_url) as response:
if response.status != 200:
raise ValueError(
f"Failed to download PDF from {pdf_url} (status {response.status})"
)
pdf_bytes = await response.read()
pdf_maker = PdfMaker((self.page_width, self.page_height)) pdf_maker = PdfMaker((self.page_width, self.page_height))
for _ in range(barcode_data["num_duplicates"]): for _ in range(barcode_data["num_duplicates"]):

View File

@ -4,6 +4,7 @@ from io import BytesIO
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from modules.fulfillment_base.barcodes_pdf_gen import BarcodePdfGenerator, BarcodeData from modules.fulfillment_base.barcodes_pdf_gen import BarcodePdfGenerator, BarcodeData
from modules.fulfillment_base.barcodes_pdf_gen.types import PdfBarcodeImageGenData
from modules.fulfillment_base.models import Product from modules.fulfillment_base.models import Product
from modules.fulfillment_base.repositories import ProductRepository from modules.fulfillment_base.repositories import ProductRepository
from modules.fulfillment_base.schemas.product import GetProductBarcodePdfRequest from modules.fulfillment_base.schemas.product import GetProductBarcodePdfRequest
@ -21,17 +22,24 @@ class BarcodePrinterService:
product: Product = await ProductRepository(self.session).get_by_id( product: Product = await ProductRepository(self.session).get_by_id(
request.product_id request.product_id
) )
barcode_data: BarcodeData = { if product.barcode_image:
"barcode": request.barcode, barcode_data: PdfBarcodeImageGenData = {
"template": product.barcode_template, "barcode_image_url": product.barcode_image.image_url,
"product": product, "num_duplicates": request.quantity,
"num_duplicates": request.quantity, }
} else:
barcode_data: BarcodeData = {
"barcode": request.barcode,
"template": product.barcode_template,
"product": product,
"num_duplicates": request.quantity,
}
filename = f"{product.id}_barcode.pdf" filename = f"{product.id}_barcode.pdf"
size = product.barcode_template.size size = product.barcode_template.size
generator = BarcodePdfGenerator(size.width, size.height) generator = BarcodePdfGenerator(size.width, size.height)
return filename, generator.generate([barcode_data]) return filename, await generator.generate([barcode_data])
async def generate_base64( async def generate_base64(
self, request: GetProductBarcodePdfRequest self, request: GetProductBarcodePdfRequest