rb-commons 0.4.9__py3-none-any.whl → 0.4.11__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rb_commons/orm/managers.py +8 -0
- rb_commons/schemes/pagination.py +47 -0
- {rb_commons-0.4.9.dist-info → rb_commons-0.4.11.dist-info}/METADATA +1 -1
- {rb_commons-0.4.9.dist-info → rb_commons-0.4.11.dist-info}/RECORD +6 -5
- {rb_commons-0.4.9.dist-info → rb_commons-0.4.11.dist-info}/WHEEL +0 -0
- {rb_commons-0.4.9.dist-info → rb_commons-0.4.11.dist-info}/top_level.txt +0 -0
rb_commons/orm/managers.py
CHANGED
@@ -180,6 +180,7 @@ class BaseManager(Generic[ModelType]):
|
|
180
180
|
|
181
181
|
if self._limit:
|
182
182
|
stmt = stmt.limit(self._limit)
|
183
|
+
self._limit = None
|
183
184
|
|
184
185
|
return await self._execute_query_and_unique_data(stmt, load_all_relations)
|
185
186
|
|
@@ -188,6 +189,13 @@ class BaseManager(Generic[ModelType]):
|
|
188
189
|
stmt = select(self.model).filter(and_(*self.filters)).limit(limit).offset(offset)
|
189
190
|
return await self._execute_query_and_unique_data(stmt, load_all_relations)
|
190
191
|
|
192
|
+
def limit(self, value: int) -> 'BaseManager[ModelType]':
|
193
|
+
"""
|
194
|
+
Set a limit on the number of results returned by queries like `all()` or `first()`.
|
195
|
+
"""
|
196
|
+
self._limit = value
|
197
|
+
return self
|
198
|
+
|
191
199
|
async def first(self, load_relations: Sequence[str] = None) -> Optional[ModelType]:
|
192
200
|
"""Return the first matching object, or None."""
|
193
201
|
self._ensure_filtered()
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Generic, TypeVar, Optional
|
2
|
+
from pydantic import BaseModel, Field
|
3
|
+
|
4
|
+
T = TypeVar('T')
|
5
|
+
|
6
|
+
class PaginationParams(BaseModel):
|
7
|
+
"""Pagination parameters for querying."""
|
8
|
+
page: int = Field(default=1, ge=1, description="Page number")
|
9
|
+
per_page: int = Field(default=10, ge=1, le=100, description="Items per page")
|
10
|
+
sort_by: Optional[str] = Field(default=None, description="Field to sort by")
|
11
|
+
sort_order: Optional[str] = Field(default="desc", description="Sort order (asc/desc)")
|
12
|
+
|
13
|
+
class PaginationMeta(BaseModel):
|
14
|
+
"""Metadata for paginated responses."""
|
15
|
+
total: int = Field(..., description="Total number of items")
|
16
|
+
page: int = Field(..., description="Current page number")
|
17
|
+
per_page: int = Field(..., description="Items per page")
|
18
|
+
total_pages: int = Field(..., description="Total number of pages")
|
19
|
+
has_next: bool = Field(..., description="Whether there is a next page")
|
20
|
+
has_prev: bool = Field(..., description="Whether there is a previous page")
|
21
|
+
|
22
|
+
class PaginatedResponse(BaseModel, Generic[T]):
|
23
|
+
"""Generic paginated response."""
|
24
|
+
items: list[T] = Field(..., description="List of items")
|
25
|
+
meta: PaginationMeta = Field(..., description="Pagination metadata")
|
26
|
+
|
27
|
+
@classmethod
|
28
|
+
def create(
|
29
|
+
cls,
|
30
|
+
items: list[T],
|
31
|
+
total: int,
|
32
|
+
page: int,
|
33
|
+
per_page: int
|
34
|
+
) -> "PaginatedResponse[T]":
|
35
|
+
"""Create a paginated response with calculated metadata."""
|
36
|
+
total_pages = (total + per_page - 1) // per_page
|
37
|
+
return cls(
|
38
|
+
items=items,
|
39
|
+
meta=PaginationMeta(
|
40
|
+
total=total,
|
41
|
+
page=page,
|
42
|
+
per_page=per_page,
|
43
|
+
total_pages=total_pages,
|
44
|
+
has_next=page < total_pages,
|
45
|
+
has_prev=page > 1
|
46
|
+
)
|
47
|
+
)
|
@@ -11,15 +11,16 @@ rb_commons/http/consul.py,sha256=Ioq72VD1jGwoC96set7n2SgxN40olzI-myA2lwKkYi4,186
|
|
11
11
|
rb_commons/http/exceptions.py,sha256=EGRMr1cRgiJ9Q2tkfANbf0c6-zzXf1CD6J3cmCaT_FA,1885
|
12
12
|
rb_commons/orm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
13
|
rb_commons/orm/exceptions.py,sha256=1aMctiEwrPjyehoXVX1l6ML5ZOhmDkmBISzlTD5ey1Y,509
|
14
|
-
rb_commons/orm/managers.py,sha256=
|
14
|
+
rb_commons/orm/managers.py,sha256=Q5nNAOPeTJvxlsG_OBrkBXiY2kfOhzrncXNap960Pw4,16286
|
15
15
|
rb_commons/orm/services.py,sha256=71eRcJ4TxZvzNz-hLXo12X4U7PGK54ZfbLAb27AjZi8,1589
|
16
16
|
rb_commons/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
17
|
rb_commons/permissions/role_permissions.py,sha256=HL50s5RHW1nk2U3-YTESg0EDGkJDu1vN4QchcfK-L5g,988
|
18
18
|
rb_commons/schemes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
19
|
rb_commons/schemes/jwt.py,sha256=F66JJDhholuOPPzlKeoC6f1TL4gXg4oRUrV5yheNpyo,1675
|
20
|
+
rb_commons/schemes/pagination.py,sha256=8VZW1wZGJIPR9jEBUgppZUoB4uqP8ORudHkMwvEJSxg,1866
|
20
21
|
rb_commons/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
22
|
rb_commons/utils/media.py,sha256=KNY_9SdRa3Rp7d3B1tZaXkhmzVa65RcS62BYwZP1bVM,332
|
22
|
-
rb_commons-0.4.
|
23
|
-
rb_commons-0.4.
|
24
|
-
rb_commons-0.4.
|
25
|
-
rb_commons-0.4.
|
23
|
+
rb_commons-0.4.11.dist-info/METADATA,sha256=RA17ihwr48Z2P0aXTiVzoeXMRq66-WtT_ViKrRZfU5o,6571
|
24
|
+
rb_commons-0.4.11.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
25
|
+
rb_commons-0.4.11.dist-info/top_level.txt,sha256=HPx_WAYo3_fbg1WCeGHsz3wPGio1ucbnrlm2lmqlJog,11
|
26
|
+
rb_commons-0.4.11.dist-info/RECORD,,
|
File without changes
|
File without changes
|