rb-commons 0.5.2__py3-none-any.whl → 0.5.4__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 +27 -3
- {rb_commons-0.5.2.dist-info → rb_commons-0.5.4.dist-info}/METADATA +1 -1
- {rb_commons-0.5.2.dist-info → rb_commons-0.5.4.dist-info}/RECORD +5 -5
- {rb_commons-0.5.2.dist-info → rb_commons-0.5.4.dist-info}/WHEEL +0 -0
- {rb_commons-0.5.2.dist-info → rb_commons-0.5.4.dist-info}/top_level.txt +0 -0
rb_commons/orm/managers.py
CHANGED
@@ -5,7 +5,7 @@ from typing import TypeVar, Type, Generic, Optional, List, Dict, Literal, Union,
|
|
5
5
|
from sqlalchemy import select, delete, update, and_, func, desc, inspect, or_
|
6
6
|
from sqlalchemy.exc import IntegrityError, SQLAlchemyError, NoResultFound
|
7
7
|
from sqlalchemy.ext.asyncio import AsyncSession
|
8
|
-
from sqlalchemy.orm import declarative_base, InstrumentedAttribute, selectinload, RelationshipProperty
|
8
|
+
from sqlalchemy.orm import declarative_base, InstrumentedAttribute, selectinload, RelationshipProperty, Load
|
9
9
|
|
10
10
|
from rb_commons.http.exceptions import NotFoundException
|
11
11
|
from rb_commons.orm.exceptions import DatabaseException, InternalException
|
@@ -135,6 +135,27 @@ class BaseManager(Generic[ModelType]):
|
|
135
135
|
)
|
136
136
|
return ~combined if q.negated else combined
|
137
137
|
|
138
|
+
def _loader_from_path(self, path: str) -> Load:
|
139
|
+
"""
|
140
|
+
Turn 'attributes.attribute.attribute_group' into
|
141
|
+
selectinload(Product.attributes)
|
142
|
+
.selectinload(Attribute.attribute)
|
143
|
+
.selectinload(ProductAttributeGroup.attribute_group)
|
144
|
+
"""
|
145
|
+
parts = path.split(".")
|
146
|
+
current_model = self.model
|
147
|
+
loader = None
|
148
|
+
|
149
|
+
for segment in parts:
|
150
|
+
attr = getattr(current_model, segment, None)
|
151
|
+
if attr is None or not hasattr(attr, "property"):
|
152
|
+
raise ValueError(f"Invalid relationship path: {path!r}")
|
153
|
+
|
154
|
+
loader = selectinload(attr) if loader is None else loader.selectinload(attr)
|
155
|
+
current_model = attr.property.mapper.class_ # step down the graph
|
156
|
+
|
157
|
+
return loader
|
158
|
+
|
138
159
|
def order_by(self, *columns: Any):
|
139
160
|
"""Collect ORDER BY clauses.
|
140
161
|
"""
|
@@ -254,7 +275,6 @@ class BaseManager(Generic[ModelType]):
|
|
254
275
|
self._ensure_filtered()
|
255
276
|
query = select(func.count()).select_from(self.model).filter(and_(*self.filters))
|
256
277
|
result = await self.session.execute(query)
|
257
|
-
self._reset_state()
|
258
278
|
return result.scalar_one()
|
259
279
|
|
260
280
|
async def paginate(self, limit=10, offset=0, load_all_relations=False):
|
@@ -369,7 +389,11 @@ class BaseManager(Generic[ModelType]):
|
|
369
389
|
stmt = select(self.model).filter_by(id=pk)
|
370
390
|
if load_relations:
|
371
391
|
for rel in load_relations:
|
372
|
-
|
392
|
+
loader = (
|
393
|
+
self._loader_from_path(rel) if "." in rel
|
394
|
+
else selectinload(getattr(self.model, rel))
|
395
|
+
)
|
396
|
+
stmt = stmt.options(loader)
|
373
397
|
result = await self.session.execute(stmt)
|
374
398
|
instance = result.scalar_one_or_none()
|
375
399
|
if instance is None:
|
@@ -11,7 +11,7 @@ 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=1ZyBgSEo_MUkMW38r66hwJpDA0T2EEHeHMpsGhA_iD0,16417
|
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
|
@@ -20,7 +20,7 @@ rb_commons/schemes/jwt.py,sha256=F66JJDhholuOPPzlKeoC6f1TL4gXg4oRUrV5yheNpyo,167
|
|
20
20
|
rb_commons/schemes/pagination.py,sha256=8VZW1wZGJIPR9jEBUgppZUoB4uqP8ORudHkMwvEJSxg,1866
|
21
21
|
rb_commons/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
22
22
|
rb_commons/utils/media.py,sha256=KNY_9SdRa3Rp7d3B1tZaXkhmzVa65RcS62BYwZP1bVM,332
|
23
|
-
rb_commons-0.5.
|
24
|
-
rb_commons-0.5.
|
25
|
-
rb_commons-0.5.
|
26
|
-
rb_commons-0.5.
|
23
|
+
rb_commons-0.5.4.dist-info/METADATA,sha256=lW5cFKjDBNf83aZuUvjhX2Kf70VIgNCFo3m2SZcIXbA,6570
|
24
|
+
rb_commons-0.5.4.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
25
|
+
rb_commons-0.5.4.dist-info/top_level.txt,sha256=HPx_WAYo3_fbg1WCeGHsz3wPGio1ucbnrlm2lmqlJog,11
|
26
|
+
rb_commons-0.5.4.dist-info/RECORD,,
|
File without changes
|
File without changes
|