diff --git a/schemas/deal.py b/schemas/deal.py index 4eb1e02..2d7eabd 100644 --- a/schemas/deal.py +++ b/schemas/deal.py @@ -32,6 +32,7 @@ class DealSummary(BaseSchema): total_price: int rank: int base_marketplace: Optional[BaseMarketplaceSchema] = None + total_products: int shipment_warehouse_id: Optional[int] shipment_warehouse_name: Optional[str] diff --git a/services/deal.py b/services/deal.py index beb0d4c..dcc122f 100644 --- a/services/deal.py +++ b/services/deal.py @@ -6,7 +6,7 @@ from starlette import status import models.deal import models.secondary -from models import User, Service, Client +from models import User, Service, Client, DealProduct from models.deal import * from schemas.client import ClientDetailsSchema from schemas.deal import * @@ -15,6 +15,7 @@ from services.base import BaseService from services.client import ClientService from services.service import ServiceService from services.shipping_warehouse import ShippingWarehouseService +from utils.list_utils import compile_query_to_plain_sql class DealService(BaseService): @@ -165,8 +166,20 @@ class DealService(BaseService): ) 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: price_subquery = self._get_price_subquery() + products_quantity_subquery = self._get_products_quantity_subquery() q = ( select( Deal, @@ -174,7 +187,8 @@ class DealService(BaseService): func.row_number().over( partition_by=Deal.current_status, order_by=Deal.lexorank - ).label('rank') + ).label('rank'), + func.coalesce(products_quantity_subquery.c.total_quantity, 0) ) .options( selectinload(Deal.status_history), @@ -182,7 +196,11 @@ class DealService(BaseService): joinedload(Deal.shipping_warehouse), ) .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( Deal.is_deleted == False, ) @@ -194,9 +212,10 @@ class DealService(BaseService): ) else: q = q.order_by(Deal.created_at.desc()) + print(compile_query_to_plain_sql(q)) deals_query = await self.session.execute(q) summaries = [] - for deal, total_price, rank in deals_query.all(): + for deal, total_price, rank, products_count in deals_query.all(): deal: Deal last_status: DealStatusHistory = max(deal.status_history, key=lambda status: status.changed_at) deadline = last_status.next_status_deadline @@ -217,7 +236,8 @@ class DealService(BaseService): base_marketplace=base_marketplace, created_at=deal.created_at, 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)