rb-commons 0.4.10__tar.gz → 0.4.12__tar.gz
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-0.4.10 → rb_commons-0.4.12}/PKG-INFO +1 -1
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/orm/managers.py +8 -1
- rb_commons-0.4.12/rb_commons/schemes/pagination.py +47 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons.egg-info/PKG-INFO +1 -1
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons.egg-info/SOURCES.txt +1 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/setup.py +1 -1
- {rb_commons-0.4.10 → rb_commons-0.4.12}/README.md +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/broker/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/broker/consumer.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/configs/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/configs/config.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/configs/injections.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/configs/rabbitmq.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/http/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/http/base_api.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/http/consul.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/http/exceptions.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/orm/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/orm/exceptions.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/orm/services.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/permissions/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/permissions/role_permissions.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/schemes/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/schemes/jwt.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/utils/__init__.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons/utils/media.py +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons.egg-info/dependency_links.txt +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons.egg-info/requires.txt +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/rb_commons.egg-info/top_level.txt +0 -0
- {rb_commons-0.4.10 → rb_commons-0.4.12}/setup.cfg +0 -0
@@ -103,6 +103,7 @@ class BaseManager(Generic[ModelType]):
|
|
103
103
|
- __lte (field__lte=value)
|
104
104
|
- __in (field__in=[val1, val2, ...])
|
105
105
|
- __contains (field__contains='text')
|
106
|
+
- __null (field__null=True/False) - True for IS NULL, False for IS NOT NULL
|
106
107
|
|
107
108
|
Additionally supports nested paths, e.g.,
|
108
109
|
product__shop_id=None
|
@@ -116,7 +117,7 @@ class BaseManager(Generic[ModelType]):
|
|
116
117
|
|
117
118
|
operator = "eq"
|
118
119
|
|
119
|
-
if parts[-1] in {"eq", "ne", "gt", "lt", "gte", "lte", "in", "contains"}:
|
120
|
+
if parts[-1] in {"eq", "ne", "gt", "lt", "gte", "lte", "in", "contains", "null"}:
|
120
121
|
operator = parts.pop()
|
121
122
|
|
122
123
|
current_attr = self.model
|
@@ -159,6 +160,12 @@ class BaseManager(Generic[ModelType]):
|
|
159
160
|
elif operator == "contains":
|
160
161
|
# e.g., column ILIKE %value%
|
161
162
|
self.filters.append(current_attr.ilike(f"%{value}%"))
|
163
|
+
|
164
|
+
elif operator == "null":
|
165
|
+
if value is True:
|
166
|
+
self.filters.append(current_attr.is_(None))
|
167
|
+
else:
|
168
|
+
self.filters.append(current_attr.isnot(None))
|
162
169
|
|
163
170
|
return self
|
164
171
|
|
@@ -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
|
+
)
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
5
5
|
|
6
6
|
setup(
|
7
7
|
name="rb-commons",
|
8
|
-
version="0.4.
|
8
|
+
version="0.4.12",
|
9
9
|
author="Abdulvoris",
|
10
10
|
author_email="erkinovabdulvoris101@gmail.com",
|
11
11
|
description="Commons of project and simplified orm based on sqlalchemy.",
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|