feat: product search
This commit is contained in:
		@@ -32,6 +32,7 @@ class DealSummary(BaseSchema):
 | 
				
			|||||||
    total_price: int
 | 
					    total_price: int
 | 
				
			||||||
    rank: int
 | 
					    rank: int
 | 
				
			||||||
    base_marketplace: Optional[BaseMarketplaceSchema] = None
 | 
					    base_marketplace: Optional[BaseMarketplaceSchema] = None
 | 
				
			||||||
 | 
					    total_products: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    shipment_warehouse_id: Optional[int]
 | 
					    shipment_warehouse_id: Optional[int]
 | 
				
			||||||
    shipment_warehouse_name: Optional[str]
 | 
					    shipment_warehouse_name: Optional[str]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ from starlette import status
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import models.deal
 | 
					import models.deal
 | 
				
			||||||
import models.secondary
 | 
					import models.secondary
 | 
				
			||||||
from models import User, Service, Client
 | 
					from models import User, Service, Client, DealProduct
 | 
				
			||||||
from models.deal import *
 | 
					from models.deal import *
 | 
				
			||||||
from schemas.client import ClientDetailsSchema
 | 
					from schemas.client import ClientDetailsSchema
 | 
				
			||||||
from schemas.deal import *
 | 
					from schemas.deal import *
 | 
				
			||||||
@@ -15,6 +15,7 @@ from services.base import BaseService
 | 
				
			|||||||
from services.client import ClientService
 | 
					from services.client import ClientService
 | 
				
			||||||
from services.service import ServiceService
 | 
					from services.service import ServiceService
 | 
				
			||||||
from services.shipping_warehouse import ShippingWarehouseService
 | 
					from services.shipping_warehouse import ShippingWarehouseService
 | 
				
			||||||
 | 
					from utils.list_utils import compile_query_to_plain_sql
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class DealService(BaseService):
 | 
					class DealService(BaseService):
 | 
				
			||||||
@@ -165,8 +166,20 @@ class DealService(BaseService):
 | 
				
			|||||||
        )
 | 
					        )
 | 
				
			||||||
        return final_subquery
 | 
					        return final_subquery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _get_products_quantity_subquery(self):
 | 
				
			||||||
 | 
					        deal_products_subquery = (
 | 
				
			||||||
 | 
					            select(
 | 
				
			||||||
 | 
					                models.secondary.DealProduct.deal_id,
 | 
				
			||||||
 | 
					                func.sum(models.secondary.DealProduct.quantity).label('total_quantity')
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .group_by(models.secondary.DealProduct.deal_id)
 | 
				
			||||||
 | 
					            .subquery()
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        return deal_products_subquery
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def get_summary(self, full: bool = False) -> DealSummaryResponse:
 | 
					    async def get_summary(self, full: bool = False) -> DealSummaryResponse:
 | 
				
			||||||
        price_subquery = self._get_price_subquery()
 | 
					        price_subquery = self._get_price_subquery()
 | 
				
			||||||
 | 
					        products_quantity_subquery = self._get_products_quantity_subquery()
 | 
				
			||||||
        q = (
 | 
					        q = (
 | 
				
			||||||
            select(
 | 
					            select(
 | 
				
			||||||
                Deal,
 | 
					                Deal,
 | 
				
			||||||
@@ -174,7 +187,8 @@ class DealService(BaseService):
 | 
				
			|||||||
                func.row_number().over(
 | 
					                func.row_number().over(
 | 
				
			||||||
                    partition_by=Deal.current_status,
 | 
					                    partition_by=Deal.current_status,
 | 
				
			||||||
                    order_by=Deal.lexorank
 | 
					                    order_by=Deal.lexorank
 | 
				
			||||||
                ).label('rank')
 | 
					                ).label('rank'),
 | 
				
			||||||
 | 
					                func.coalesce(products_quantity_subquery.c.total_quantity, 0)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .options(
 | 
					            .options(
 | 
				
			||||||
                selectinload(Deal.status_history),
 | 
					                selectinload(Deal.status_history),
 | 
				
			||||||
@@ -182,7 +196,11 @@ class DealService(BaseService):
 | 
				
			|||||||
                joinedload(Deal.shipping_warehouse),
 | 
					                joinedload(Deal.shipping_warehouse),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            .outerjoin(
 | 
					            .outerjoin(
 | 
				
			||||||
                price_subquery, Deal.id == price_subquery.c.deal_id)
 | 
					                price_subquery, Deal.id == price_subquery.c.deal_id,
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            .outerjoin(
 | 
				
			||||||
 | 
					                products_quantity_subquery, Deal.id == products_quantity_subquery.c.deal_id
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
            .where(
 | 
					            .where(
 | 
				
			||||||
                Deal.is_deleted == False,
 | 
					                Deal.is_deleted == False,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
@@ -194,9 +212,10 @@ class DealService(BaseService):
 | 
				
			|||||||
            )
 | 
					            )
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            q = q.order_by(Deal.created_at.desc())
 | 
					            q = q.order_by(Deal.created_at.desc())
 | 
				
			||||||
 | 
					        print(compile_query_to_plain_sql(q))
 | 
				
			||||||
        deals_query = await self.session.execute(q)
 | 
					        deals_query = await self.session.execute(q)
 | 
				
			||||||
        summaries = []
 | 
					        summaries = []
 | 
				
			||||||
        for deal, total_price, rank in deals_query.all():
 | 
					        for deal, total_price, rank, products_count in deals_query.all():
 | 
				
			||||||
            deal: Deal
 | 
					            deal: Deal
 | 
				
			||||||
            last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
 | 
					            last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at)
 | 
				
			||||||
            deadline = last_status.next_status_deadline
 | 
					            deadline = last_status.next_status_deadline
 | 
				
			||||||
@@ -217,7 +236,8 @@ class DealService(BaseService):
 | 
				
			|||||||
                    base_marketplace=base_marketplace,
 | 
					                    base_marketplace=base_marketplace,
 | 
				
			||||||
                    created_at=deal.created_at,
 | 
					                    created_at=deal.created_at,
 | 
				
			||||||
                    shipment_warehouse_id=deal.shipping_warehouse_id,
 | 
					                    shipment_warehouse_id=deal.shipping_warehouse_id,
 | 
				
			||||||
                    shipment_warehouse_name=shipment_warehouse_name
 | 
					                    shipment_warehouse_name=shipment_warehouse_name,
 | 
				
			||||||
 | 
					                    total_products=products_count
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        return DealSummaryResponse(summaries=summaries)
 | 
					        return DealSummaryResponse(summaries=summaries)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user