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