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.
@@ -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
- if parts[-1] in allowed_operators:
112
- operator = parts[-1]
113
- field_path = parts[:-1]
114
- else:
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
- if not isinstance(current_attr, InstrumentedAttribute):
125
- raise ValueError(f"Invalid filter field: {'.'.join(field_path)}")
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(field_path)}__in requires a list, got {type(value)}")
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):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rb-commons
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Commons of project and simplified orm based on sqlalchemy.
5
5
  Home-page: https://github.com/RoboSell-organization/rb-commons
6
6
  Author: Abdulvoris
@@ -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=IktMS_oq0drkt_MwBZTYPE179YgjkQB1HfaDcvnr5Zw,13928
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=3ZTwKclavAKSheO58fybo2uLDeTkd-iluTY7hUEjRPk,957
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.0.dist-info/METADATA,sha256=MrBcay1HyOdGBeKwC8yohoDXLFi0tsjsMdk_S39Lcag,6570
23
- rb_commons-0.4.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
24
- rb_commons-0.4.0.dist-info/top_level.txt,sha256=HPx_WAYo3_fbg1WCeGHsz3wPGio1ucbnrlm2lmqlJog,11
25
- rb_commons-0.4.0.dist-info/RECORD,,
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,,