From b2b9aef59b0591d85fc0f151ebc6557b8e6fced0 Mon Sep 17 00:00:00 2001 From: businkv Date: Tue, 28 Apr 2026 23:49:21 +0300 Subject: [PATCH 1/7] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20?= =?UTF-8?q?is=5Favailable=20=D0=B4=D0=BB=D1=8F=20GET=20/item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rental_backend/routes/item.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index f486142..d30d84f 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -16,17 +16,30 @@ @item.get("", response_model=list[ItemGet]) -async def get_items(type_id: int = Query(None), user=Depends(UnionAuth())) -> list[ItemGet]: +async def get_items(type_id: int = Query(None), order_by: str = Query("id"), order: str = Query("asc"), is_available: bool = Query(None), user=Depends(UnionAuth())) -> list[ItemGet]: """ Retrieves a list of items. If `type_id` is specified, only items of that type are returned. - **type_id**: The ID of the item type (optional). - + - **order_by**: Sort field (default: id). + - **order**: Sort direction: asc/desc. + Returns a list of items. """ query = Item.query(session=db.session) + if type_id is not None: query = query.filter(Item.type_id == type_id) + + if is_available is not None: + query = query.filter(Item.is_available == is_available) + + column = getattr(Item, order_by, Item.id) + if order == "desc": + query = query.order_by(column.desc()) + else: + query = query.order_by(column.asc()) + items = query.all() return [ItemGet.model_validate(item) for item in items] From 445f3fc43bf68a31254c074980c42d81db43fc76 Mon Sep 17 00:00:00 2001 From: businkv Date: Wed, 29 Apr 2026 00:25:41 +0300 Subject: [PATCH 2/7] =?UTF-8?q?=D0=BE=D1=82=D1=84=D0=BE=D1=80=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rental_backend/routes/item.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index d30d84f..3e97d01 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -16,14 +16,20 @@ @item.get("", response_model=list[ItemGet]) -async def get_items(type_id: int = Query(None), order_by: str = Query("id"), order: str = Query("asc"), is_available: bool = Query(None), user=Depends(UnionAuth())) -> list[ItemGet]: +async def get_items( + type_id: int = Query(None), + order_by: str = Query("id"), + order: str = Query("asc"), + is_available: bool = Query(None), + user=Depends(UnionAuth()), +) -> list[ItemGet]: """ Retrieves a list of items. If `type_id` is specified, only items of that type are returned. - **type_id**: The ID of the item type (optional). - **order_by**: Sort field (default: id). - **order**: Sort direction: asc/desc. - + Returns a list of items. """ query = Item.query(session=db.session) @@ -33,13 +39,13 @@ async def get_items(type_id: int = Query(None), order_by: str = Query("id"), ord if is_available is not None: query = query.filter(Item.is_available == is_available) - + column = getattr(Item, order_by, Item.id) if order == "desc": query = query.order_by(column.desc()) else: query = query.order_by(column.asc()) - + items = query.all() return [ItemGet.model_validate(item) for item in items] From 34fda33d3d057c9567655c56371929307298a9db Mon Sep 17 00:00:00 2001 From: businkv Date: Wed, 29 Apr 2026 22:35:22 +0300 Subject: [PATCH 3/7] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B2=D1=8B=D0=BF=D0=B0=D0=B4=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD=D1=8B=D1=85=20=D0=BF=D0=B0?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=B2=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D1=81=D0=BE=D1=80=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rental_backend/routes/item.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index 3e97d01..edfce44 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -1,3 +1,5 @@ +from typing import Literal + from auth_lib.fastapi import UnionAuth from fastapi import APIRouter, Depends, Query from fastapi_sqlalchemy import db @@ -18,8 +20,8 @@ @item.get("", response_model=list[ItemGet]) async def get_items( type_id: int = Query(None), - order_by: str = Query("id"), - order: str = Query("asc"), + order_by: Literal["id", "type_id", "is_available"] | None = Query(None), + order: Literal["asc", "desc"] | None = Query(None), is_available: bool = Query(None), user=Depends(UnionAuth()), ) -> list[ItemGet]: @@ -40,11 +42,12 @@ async def get_items( if is_available is not None: query = query.filter(Item.is_available == is_available) - column = getattr(Item, order_by, Item.id) - if order == "desc": - query = query.order_by(column.desc()) - else: - query = query.order_by(column.asc()) + if order_by is not None and order is not None: + column = getattr(Item, order_by, Item.id) + if order == "desc": + query = query.order_by(column.desc()) + else: + query = query.order_by(column.asc()) items = query.all() return [ItemGet.model_validate(item) for item in items] From b3078dd9cc9df3bdecc3ed1acffc970de64a2306 Mon Sep 17 00:00:00 2001 From: businkv Date: Thu, 30 Apr 2026 16:15:04 +0300 Subject: [PATCH 4/7] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=20=D1=80=D1=83=D1=87=D0=BA?= =?UTF-8?q?=D0=B5,=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8,=20if=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BD=D0=B0=20elif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rental_backend/routes/item.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index edfce44..3f3aa17 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -23,15 +23,15 @@ async def get_items( order_by: Literal["id", "type_id", "is_available"] | None = Query(None), order: Literal["asc", "desc"] | None = Query(None), is_available: bool = Query(None), - user=Depends(UnionAuth()), + user = Depends(UnionAuth()), ) -> list[ItemGet]: """ Retrieves a list of items. If `type_id` is specified, only items of that type are returned. - **type_id**: The ID of the item type (optional). - - **order_by**: Sort field (default: id). - - **order**: Sort direction: asc/desc. - + - **order_by**: Sort field. Available values: id, type_id, is_available. + - **order**: Sort direction: asc (ascending), desc (descending). Works only if order_by is specified. + - **is_available**: true - available, false - unavailable. If not set - all items. Returns a list of items. """ query = Item.query(session=db.session) @@ -42,12 +42,11 @@ async def get_items( if is_available is not None: query = query.filter(Item.is_available == is_available) - if order_by is not None and order is not None: - column = getattr(Item, order_by, Item.id) - if order == "desc": - query = query.order_by(column.desc()) - else: - query = query.order_by(column.asc()) + column = getattr(Item, order_by, Item.id) + if order == "desc": + query = query.order_by(column.desc()) + elif order == "asc": + query = query.order_by(column.asc()) items = query.all() return [ItemGet.model_validate(item) for item in items] From 8b36f1a4e2a8b444006bc454a2507fea214f00ce Mon Sep 17 00:00:00 2001 From: businkv Date: Thu, 30 Apr 2026 16:16:36 +0300 Subject: [PATCH 5/7] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BA=20=D1=80=D1=83=D1=87=D0=BA?= =?UTF-8?q?=D0=B5,=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BB=D0=B8?= =?UTF-8?q?=D1=88=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8,=20if=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=20=D0=BD=D0=B0=20elif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rental_backend/routes/item.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index 3f3aa17..e83b999 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -23,7 +23,7 @@ async def get_items( order_by: Literal["id", "type_id", "is_available"] | None = Query(None), order: Literal["asc", "desc"] | None = Query(None), is_available: bool = Query(None), - user = Depends(UnionAuth()), + user=Depends(UnionAuth()), ) -> list[ItemGet]: """ Retrieves a list of items. If `type_id` is specified, only items of that type are returned. From 1c36230ea50dec849b7040c69f1880cbe47cadc8 Mon Sep 17 00:00:00 2001 From: businkv Date: Thu, 30 Apr 2026 16:29:29 +0300 Subject: [PATCH 6/7] _ From d2f904d145cc8e659f56fe56977a2b638e57d59b Mon Sep 17 00:00:00 2001 From: petrCher <88943157+petrCher@users.noreply.github.com> Date: Thu, 30 Apr 2026 17:43:27 +0300 Subject: [PATCH 7/7] fix none getattr --- rental_backend/routes/item.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rental_backend/routes/item.py b/rental_backend/routes/item.py index e83b999..1647177 100644 --- a/rental_backend/routes/item.py +++ b/rental_backend/routes/item.py @@ -42,10 +42,11 @@ async def get_items( if is_available is not None: query = query.filter(Item.is_available == is_available) - column = getattr(Item, order_by, Item.id) + new_order = order_by if order_by is not None else "id" + column = getattr(Item, new_order) if order == "desc": query = query.order_by(column.desc()) - elif order == "asc": + else: query = query.order_by(column.asc()) items = query.all()