rb-commons 0.4.5__tar.gz → 0.4.7__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.
Files changed (30) hide show
  1. {rb_commons-0.4.5 → rb_commons-0.4.7}/PKG-INFO +1 -1
  2. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/orm/managers.py +45 -6
  3. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons.egg-info/PKG-INFO +1 -1
  4. {rb_commons-0.4.5 → rb_commons-0.4.7}/setup.py +1 -1
  5. {rb_commons-0.4.5 → rb_commons-0.4.7}/README.md +0 -0
  6. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/__init__.py +0 -0
  7. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/broker/__init__.py +0 -0
  8. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/broker/consumer.py +0 -0
  9. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/configs/__init__.py +0 -0
  10. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/configs/config.py +0 -0
  11. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/configs/injections.py +0 -0
  12. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/configs/rabbitmq.py +0 -0
  13. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/http/__init__.py +0 -0
  14. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/http/base_api.py +0 -0
  15. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/http/consul.py +0 -0
  16. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/http/exceptions.py +0 -0
  17. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/orm/__init__.py +0 -0
  18. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/orm/exceptions.py +0 -0
  19. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/orm/services.py +0 -0
  20. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/permissions/__init__.py +0 -0
  21. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/permissions/role_permissions.py +0 -0
  22. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/schemes/__init__.py +0 -0
  23. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/schemes/jwt.py +0 -0
  24. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/utils/__init__.py +0 -0
  25. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons/utils/media.py +0 -0
  26. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons.egg-info/SOURCES.txt +0 -0
  27. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons.egg-info/dependency_links.txt +0 -0
  28. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons.egg-info/requires.txt +0 -0
  29. {rb_commons-0.4.5 → rb_commons-0.4.7}/rb_commons.egg-info/top_level.txt +0 -0
  30. {rb_commons-0.4.5 → rb_commons-0.4.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rb-commons
3
- Version: 0.4.5
3
+ Version: 0.4.7
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
@@ -166,18 +166,23 @@ class BaseManager(Generic[ModelType]):
166
166
  if not self._filtered:
167
167
  raise RuntimeError("You must call `filter()` before using this method.")
168
168
 
169
- async def all(self, load_all_relations: bool = False) -> List[ModelType]:
170
- self._ensure_filtered()
171
-
172
- stmt = select(self.model).filter(and_(*self.filters))
169
+ async def _execute_query_and_unique_data(self, stmt, load_all_relations: bool) -> List[ModelType]:
173
170
  stmt = self._apply_eager_loading(stmt, load_all_relations)
174
-
175
171
  result = await self.session.execute(stmt)
176
172
  rows = result.scalars().all()
177
-
178
173
  unique_by_pk = {obj.id: obj for obj in rows}
179
174
  return list(unique_by_pk.values())
180
175
 
176
+ async def all(self, load_all_relations: bool = False) -> List[ModelType]:
177
+ self._ensure_filtered()
178
+ stmt = select(self.model).filter(and_(*self.filters))
179
+ return await self._execute_query_and_unique_data(stmt, load_all_relations)
180
+
181
+ async def paginate(self, limit: int = 10, offset: int = 0, load_all_relations: bool = False) -> List[ModelType]:
182
+ self._ensure_filtered()
183
+ stmt = select(self.model).filter(and_(*self.filters)).limit(limit).offset(offset)
184
+ return await self._execute_query_and_unique_data(stmt, load_all_relations)
185
+
181
186
  async def first(self, load_relations: Sequence[str] = None) -> Optional[ModelType]:
182
187
  """Return the first matching object, or None."""
183
188
  self._ensure_filtered()
@@ -382,6 +387,40 @@ class BaseManager(Generic[ModelType]):
382
387
  if not self.session.in_transaction():
383
388
  await self.session.commit()
384
389
 
390
+ @with_transaction_error_handling
391
+ def has_relation(self, relation_name: str) -> 'BaseManager[ModelType]':
392
+ """
393
+ Check if a relationship exists between models using an EXISTS subquery.
394
+
395
+ :param relation_name Name of the relationship to check. Must be a valid relationship
396
+ defined in the model.
397
+
398
+ :return BaseManager[ModelType]: Self instance for method chaining.
399
+
400
+ :raise DatabaseException: If there's an error constructing the subquery.
401
+ :raise InternalException: If there's an unexpected error in relationship handling.
402
+
403
+ Notes:
404
+ - The relationship must be properly defined in the SQLAlchemy model
405
+ - Uses a non-correlated EXISTS subquery for better performance
406
+ - Silently continues if the relationship doesn't exist
407
+ """
408
+ # Get the relationship property
409
+ relationship = getattr(self.model, relation_name)
410
+
411
+ # Create subquery using select
412
+ subquery = (
413
+ select(1)
414
+ .select_from(relationship.property.mapper.class_)
415
+ .where(relationship.property.primaryjoin)
416
+ .exists()
417
+ )
418
+
419
+ # Add the exists condition to filters
420
+ self.filters.append(subquery)
421
+
422
+ return self
423
+
385
424
  def model_to_dict(self, instance: ModelType, exclude: set = None):
386
425
  exclude = exclude or set()
387
426
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rb-commons
3
- Version: 0.4.5
3
+ Version: 0.4.7
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
@@ -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.5",
8
+ version="0.4.7",
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