refactoring of deal documents
This commit is contained in:
		@@ -3,17 +3,16 @@ from typing import TypedDict, List, Dict, Tuple, Optional
 | 
			
		||||
from models import DealProduct, Deal, DealStatusHistory
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DocumentDealProductData(TypedDict):
 | 
			
		||||
class DealTechSpecProductData(TypedDict):
 | 
			
		||||
    deal_products: List[DealProduct]
 | 
			
		||||
    total_one_product: int
 | 
			
		||||
    quantity: int
 | 
			
		||||
    additional_info: Optional[str]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DocumentDealData(TypedDict):
 | 
			
		||||
class DealTechSpecData(TypedDict):
 | 
			
		||||
    deal: Deal
 | 
			
		||||
    general_services_total: int
 | 
			
		||||
    products: Dict[str, DocumentDealProductData]
 | 
			
		||||
    products: Dict[str, DealTechSpecProductData]
 | 
			
		||||
    current_status_str: str
 | 
			
		||||
    last_status: DealStatusHistory
 | 
			
		||||
    product_images: Tuple[str]
 | 
			
		||||
 
 | 
			
		||||
@@ -7,18 +7,18 @@ from sqlalchemy.orm import selectinload, joinedload
 | 
			
		||||
from weasyprint import HTML, CSS
 | 
			
		||||
 | 
			
		||||
from constants import DEAL_STATUS_STR, ENV, APP_PATH
 | 
			
		||||
from generators.deal_pdf_generator.deal_data import DocumentDealProductData
 | 
			
		||||
from generators.deal_pdf_generator.deal_data import DealTechSpecProductData, DealTechSpecData
 | 
			
		||||
from models import Deal, DealProduct, DealService as DealServiceModel, Product
 | 
			
		||||
from utils.images_fetcher import fetch_images
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DealPdfGenerator:
 | 
			
		||||
class DealTechSpecPdfGenerator:
 | 
			
		||||
    def __init__(self, session: AsyncSession):
 | 
			
		||||
        self._session = session
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    async def _group_deal_products_by_products(deal_products: List[DealProduct]) -> Dict[str, DocumentDealProductData]:
 | 
			
		||||
        products: Dict[str, DocumentDealProductData] = {}
 | 
			
		||||
    async def _group_deal_products_by_products(deal_products: List[DealProduct]) -> Dict[str, DealTechSpecProductData]:
 | 
			
		||||
        products: Dict[str, DealTechSpecProductData] = {}
 | 
			
		||||
        additional_info: Optional[str]
 | 
			
		||||
 | 
			
		||||
        for deal_product in deal_products:
 | 
			
		||||
@@ -41,7 +41,7 @@ class DealPdfGenerator:
 | 
			
		||||
 | 
			
		||||
        return products
 | 
			
		||||
 | 
			
		||||
    async def _create_detailed_deal_document_html(self, deal_id: int):
 | 
			
		||||
    async def _get_deal_by_id(self, deal_id: int) -> Optional[Deal]:
 | 
			
		||||
        deal: Deal | None = await self._session.scalar(
 | 
			
		||||
            select(Deal)
 | 
			
		||||
            .where(Deal.id == deal_id)
 | 
			
		||||
@@ -54,6 +54,10 @@ class DealPdfGenerator:
 | 
			
		||||
                joinedload(Deal.shipping_warehouse),
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        return deal
 | 
			
		||||
 | 
			
		||||
    async def _create_deal_tech_spec_document_html(self, deal_id: int):
 | 
			
		||||
        deal = await self._get_deal_by_id(deal_id)
 | 
			
		||||
 | 
			
		||||
        if not deal:
 | 
			
		||||
            return ""
 | 
			
		||||
@@ -68,7 +72,7 @@ class DealPdfGenerator:
 | 
			
		||||
                product_urls.append(None)
 | 
			
		||||
        product_images = await fetch_images(product_urls)
 | 
			
		||||
 | 
			
		||||
        document_deal_data = {
 | 
			
		||||
        document_deal_data: DealTechSpecData = {
 | 
			
		||||
            "deal": deal,
 | 
			
		||||
            "products": products,
 | 
			
		||||
            "current_status_str": DEAL_STATUS_STR[deal.current_status],
 | 
			
		||||
@@ -76,13 +80,13 @@ class DealPdfGenerator:
 | 
			
		||||
            "product_images": product_images,
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        template = ENV.get_template("deal/deal.html")
 | 
			
		||||
        template = ENV.get_template("deal/deal-tech-spec.html")
 | 
			
		||||
 | 
			
		||||
        result = template.render({"data": document_deal_data, "sign_place_text": "_" * 22})
 | 
			
		||||
        return result
 | 
			
		||||
 | 
			
		||||
    async def create_detailed_deal_document_pdf(self, deal_id) -> BytesIO:
 | 
			
		||||
        doc = await self._create_detailed_deal_document_html(deal_id)
 | 
			
		||||
    async def create_deal_tech_spec_pdf(self, deal_id) -> BytesIO:
 | 
			
		||||
        doc = await self._create_deal_tech_spec_document_html(deal_id)
 | 
			
		||||
        pdf_file = BytesIO()
 | 
			
		||||
        HTML(string=doc).write_pdf(pdf_file, stylesheets=[CSS(APP_PATH + '/static/css/deal.css')])
 | 
			
		||||
        HTML(string=doc).write_pdf(pdf_file, stylesheets=[CSS(APP_PATH + '/static/css/deal-tech-spec.css')])
 | 
			
		||||
        return pdf_file
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
 | 
			
		||||
 | 
			
		||||
from backend.dependecies import SessionDependency, CurrentUserDependency
 | 
			
		||||
from backend.session import get_session
 | 
			
		||||
from generators.deal_pdf_generator.generator import DealPdfGenerator
 | 
			
		||||
from generators.deal_pdf_generator.generator import DealTechSpecPdfGenerator
 | 
			
		||||
from models import User
 | 
			
		||||
from schemas.barcode import GetDealProductsBarcodesPdfRequest, GetDealProductsBarcodesPdfResponse
 | 
			
		||||
from schemas.deal import *
 | 
			
		||||
@@ -183,11 +183,11 @@ async def create_guest_url(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@deal_router.get(
 | 
			
		||||
    '/document/{deal_id}',
 | 
			
		||||
    operation_id='get_deal_document',
 | 
			
		||||
    '/billing-document/{deal_id}',
 | 
			
		||||
    operation_id='get_billing_document',
 | 
			
		||||
    # dependencies=[Depends(authorized_user)],
 | 
			
		||||
)
 | 
			
		||||
async def get_deal_document(
 | 
			
		||||
async def get_billing_document(
 | 
			
		||||
        deal_id: int,
 | 
			
		||||
        session: Annotated[AsyncSession, Depends(get_session)],
 | 
			
		||||
):
 | 
			
		||||
@@ -196,15 +196,15 @@ async def get_deal_document(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@deal_router.get(
 | 
			
		||||
    '/detailedDocument/{deal_id}',
 | 
			
		||||
    operation_id='get_deal_document_detailed',
 | 
			
		||||
    '/tech-spec/{deal_id}',
 | 
			
		||||
    operation_id='get_deal_tech_spec',
 | 
			
		||||
    # dependencies=[Depends(authorized_user)],
 | 
			
		||||
)
 | 
			
		||||
async def get_detailed_deal_document(
 | 
			
		||||
async def get_deal_tech_spec(
 | 
			
		||||
        deal_id: int,
 | 
			
		||||
        session: Annotated[AsyncSession, Depends(get_session)],
 | 
			
		||||
):
 | 
			
		||||
    pdf_file: BytesIO = await DealPdfGenerator(session).create_detailed_deal_document_pdf(deal_id)
 | 
			
		||||
    pdf_file: BytesIO = await DealTechSpecPdfGenerator(session).create_deal_tech_spec_pdf(deal_id)
 | 
			
		||||
    return Response(pdf_file.getvalue(), media_type='application/pdf')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user