rb-commons 0.4.0__py3-none-any.whl → 0.4.2__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 +16 -17
- rb_commons/permissions/role_permissions.py +1 -1
- {rb_commons-0.4.0.dist-info → rb_commons-0.4.2.dist-info}/METADATA +1 -1
- {rb_commons-0.4.0.dist-info → rb_commons-0.4.2.dist-info}/RECORD +6 -6
- {rb_commons-0.4.0.dist-info → rb_commons-0.4.2.dist-info}/WHEEL +0 -0
- {rb_commons-0.4.0.dist-info → rb_commons-0.4.2.dist-info}/top_level.txt +0 -0
rb_commons/orm/managers.py
CHANGED
@@ -3,7 +3,7 @@ from typing import TypeVar, Type, Generic, Optional, List, Dict, Literal, Union,
|
|
3
3
|
from sqlalchemy import select, delete, update, and_, func, desc, inspect
|
4
4
|
from sqlalchemy.exc import IntegrityError, SQLAlchemyError, NoResultFound
|
5
5
|
from sqlalchemy.ext.asyncio import AsyncSession
|
6
|
-
from sqlalchemy.orm import declarative_base, InstrumentedAttribute, selectinload
|
6
|
+
from sqlalchemy.orm import declarative_base, InstrumentedAttribute, selectinload, RelationshipProperty
|
7
7
|
|
8
8
|
from rb_commons.http.exceptions import NotFoundException
|
9
9
|
from rb_commons.orm.exceptions import DatabaseException, InternalException
|
@@ -74,7 +74,7 @@ class BaseManager(Generic[ModelType]):
|
|
74
74
|
"""
|
75
75
|
if load_all_relations:
|
76
76
|
mapper = inspect(self.model)
|
77
|
-
load_relations = [rel.key for rel in mapper.relationships
|
77
|
+
load_relations = [rel.key for rel in mapper.relationships]
|
78
78
|
|
79
79
|
if load_relations:
|
80
80
|
for rel in load_relations:
|
@@ -103,26 +103,25 @@ class BaseManager(Generic[ModelType]):
|
|
103
103
|
self._filtered = True
|
104
104
|
self.filters = []
|
105
105
|
|
106
|
-
allowed_operators = {"eq", "ne", "gt", "lt", "gte", "lte", "in", "contains"}
|
107
|
-
|
108
106
|
for key, value in kwargs.items():
|
109
107
|
parts = key.split("__")
|
110
108
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
operator = "eq"
|
116
|
-
field_path = parts
|
109
|
+
operator = "eq"
|
110
|
+
|
111
|
+
if parts[-1] in {"eq", "ne", "gt", "lt", "gte", "lte", "in", "contains"}:
|
112
|
+
operator = parts.pop()
|
117
113
|
|
118
114
|
current_attr = self.model
|
119
|
-
for idx, field_name in enumerate(field_path):
|
120
|
-
current_attr = getattr(current_attr, field_name, None)
|
121
|
-
if current_attr is None:
|
122
|
-
raise ValueError(f"Invalid filter field: {'.'.join(field_path)}")
|
123
115
|
|
124
|
-
|
125
|
-
|
116
|
+
for field_name in parts:
|
117
|
+
attr_candidate = getattr(current_attr, field_name, None)
|
118
|
+
if attr_candidate is None:
|
119
|
+
raise ValueError(f"Invalid filter field: {'.'.join(parts)}")
|
120
|
+
|
121
|
+
if hasattr(attr_candidate, "property") and isinstance(attr_candidate.property, RelationshipProperty):
|
122
|
+
current_attr = attr_candidate.property.mapper.class_
|
123
|
+
else:
|
124
|
+
current_attr = attr_candidate
|
126
125
|
|
127
126
|
if operator == "eq":
|
128
127
|
# e.g., column == value
|
@@ -146,7 +145,7 @@ class BaseManager(Generic[ModelType]):
|
|
146
145
|
|
147
146
|
elif operator == "in":
|
148
147
|
if not isinstance(value, list):
|
149
|
-
raise ValueError(f"{'.'.join(
|
148
|
+
raise ValueError(f"{'.'.join(parts)}__in requires a list, got {type(value)}")
|
150
149
|
self.filters.append(current_attr.in_(value))
|
151
150
|
|
152
151
|
elif operator == "contains":
|
@@ -18,7 +18,7 @@ class BasePermission:
|
|
18
18
|
|
19
19
|
class IsAdmin(BasePermission):
|
20
20
|
def has_permission(self, claims: Claims) -> bool:
|
21
|
-
return claims.user_role == UserRole.ADMIN
|
21
|
+
return claims.user_role == UserRole.ADMIN and claims.shop_id is not None
|
22
22
|
|
23
23
|
|
24
24
|
class IsCustomer(BasePermission):
|
@@ -11,15 +11,15 @@ 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=PedAa8zEIrbeW0d9V0_2rrPvbYsJuB05_aVNnLewsI8,13893
|
15
15
|
rb_commons/orm/services.py,sha256=71eRcJ4TxZvzNz-hLXo12X4U7PGK54ZfbLAb27AjZi8,1589
|
16
16
|
rb_commons/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
-
rb_commons/permissions/role_permissions.py,sha256=
|
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
20
|
rb_commons/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
21
21
|
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.
|
22
|
+
rb_commons-0.4.2.dist-info/METADATA,sha256=VMbwhfKeMWhIbyVJ1NFfCRvtwG26z1MhOvPf_OAAz1g,6570
|
23
|
+
rb_commons-0.4.2.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
24
|
+
rb_commons-0.4.2.dist-info/top_level.txt,sha256=HPx_WAYo3_fbg1WCeGHsz3wPGio1ucbnrlm2lmqlJog,11
|
25
|
+
rb_commons-0.4.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|