feat: printing uploaded product barcode images
This commit is contained in:
@ -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"]):
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user