feat: product search
This commit is contained in:
		@@ -67,9 +67,10 @@ async def delete_product(
 | 
			
		||||
async def get_product(
 | 
			
		||||
        client_id: int,
 | 
			
		||||
        pagination: Annotated[PaginationSchema, Depends(utils.dependecies.pagination_parameters)],
 | 
			
		||||
        search_input: str,
 | 
			
		||||
        session: Annotated[AsyncSession, Depends(get_session)]
 | 
			
		||||
):
 | 
			
		||||
    return await ProductService(session).get_by_client_id(client_id, pagination)
 | 
			
		||||
    return await ProductService(session).get_by_client_id(client_id, pagination, search_input)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@product_router.get('/get-by-id',
 | 
			
		||||
@@ -150,7 +151,6 @@ async def get_product_barcode_pdf(
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@product_router.post(
 | 
			
		||||
    '/images/upload/{product_id}',
 | 
			
		||||
    response_model=ProductUploadImageResponse,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
from typing import Union
 | 
			
		||||
 | 
			
		||||
from fastapi import HTTPException
 | 
			
		||||
from sqlalchemy import select, func, Integer, update
 | 
			
		||||
from sqlalchemy.orm import selectinload
 | 
			
		||||
from sqlalchemy import select, func, Integer, update, or_
 | 
			
		||||
from sqlalchemy.orm import selectinload, Query
 | 
			
		||||
 | 
			
		||||
import utils.barcodes
 | 
			
		||||
from backend import config
 | 
			
		||||
@@ -94,17 +94,41 @@ class ProductService(BaseService):
 | 
			
		||||
        await self.session.commit()
 | 
			
		||||
        return ProductUpdateResponse(ok=True, message='Товар успешно обновлен')
 | 
			
		||||
 | 
			
		||||
    async def get_by_client_id(self, client_id: int, pagination: PaginationSchema) -> ProductGetResponse:
 | 
			
		||||
    async def get_by_client_id(
 | 
			
		||||
            self,
 | 
			
		||||
            client_id: int,
 | 
			
		||||
            pagination: PaginationSchema,
 | 
			
		||||
            search_input: str
 | 
			
		||||
    ) -> ProductGetResponse:
 | 
			
		||||
 | 
			
		||||
        is_pagination_valid = is_valid_pagination(pagination)
 | 
			
		||||
        total_pages = 0
 | 
			
		||||
        total_items = 0
 | 
			
		||||
        stmt = (
 | 
			
		||||
            select(Product)
 | 
			
		||||
            .options(selectinload(Product.barcodes)
 | 
			
		||||
                     .noload(ProductBarcode.product))
 | 
			
		||||
            .where(Product.client_id == client_id)
 | 
			
		||||
        stmt: Query = (
 | 
			
		||||
            select(
 | 
			
		||||
                Product
 | 
			
		||||
            )
 | 
			
		||||
            .options(
 | 
			
		||||
                selectinload(Product.barcodes)
 | 
			
		||||
                .noload(ProductBarcode.product)
 | 
			
		||||
            )
 | 
			
		||||
            .where(
 | 
			
		||||
                Product.client_id == client_id
 | 
			
		||||
            )
 | 
			
		||||
            .order_by(Product.id)
 | 
			
		||||
        )
 | 
			
		||||
        search_input = search_input.strip()
 | 
			
		||||
        if search_input:
 | 
			
		||||
            stmt = (
 | 
			
		||||
                stmt.where(
 | 
			
		||||
                    or_(
 | 
			
		||||
                        Product.name.ilike(f'%{search_input}%'),
 | 
			
		||||
                        Product.barcodes.any(ProductBarcode.barcode == search_input),
 | 
			
		||||
                        Product.article == search_input
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
        if is_pagination_valid:
 | 
			
		||||
            total_products_query = await self.session.execute(
 | 
			
		||||
                select(
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								test.py
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								test.py
									
									
									
									
									
								
							@@ -11,30 +11,7 @@ from models import User, PaymentRecord
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def main():
 | 
			
		||||
    session: AsyncSession = session_maker()
 | 
			
		||||
    try:
 | 
			
		||||
        deal_id = 133
 | 
			
		||||
        source_product_id = 253
 | 
			
		||||
        source_services_stmt = (
 | 
			
		||||
            select(
 | 
			
		||||
                models.DealProductService
 | 
			
		||||
            )
 | 
			
		||||
            .where(
 | 
			
		||||
                models.DealProductService.product_id == source_product_id,
 | 
			
		||||
                models.DealProductService.deal_id == deal_id,
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
        result = (await session.scalars(source_services_stmt)).all()
 | 
			
		||||
        services = [d.service for d in result]
 | 
			
		||||
        for service in services:
 | 
			
		||||
            print(
 | 
			
		||||
                service.price_ranges
 | 
			
		||||
 | 
			
		||||
            )
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        print(e)
 | 
			
		||||
    await session.close()
 | 
			
		||||
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    loop = asyncio.get_event_loop()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user