feat: product search

This commit is contained in:
2024-08-24 05:20:49 +03:00
parent bfc4b4f25d
commit 2b79e0deba
3 changed files with 35 additions and 34 deletions

View File

@@ -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,

View File

@@ -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
View File

@@ -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()