base-api-utils 1.1.110.dev1__tar.gz → 1.1.111__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 (112) hide show
  1. {base_api_utils-1.1.110.dev1/src/base_api_utils.egg-info → base_api_utils-1.1.111}/PKG-INFO +1 -1
  2. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/pyproject.toml +1 -1
  3. base_api_utils-1.1.111/src/base_api_utils/serializers/v2/__init__.py +7 -0
  4. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/v2/expands.py +5 -19
  5. base_api_utils-1.1.111/src/base_api_utils/serializers/v2/spectacular.py +54 -0
  6. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111/src/base_api_utils.egg-info}/PKG-INFO +1 -1
  7. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils.egg-info/SOURCES.txt +1 -0
  8. base_api_utils-1.1.110.dev1/src/base_api_utils/serializers/v2/__init__.py +0 -2
  9. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/LICENSE +0 -0
  10. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/README.md +0 -0
  11. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/setup.cfg +0 -0
  12. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/__init__.py +0 -0
  13. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/commands/__init__.py +0 -0
  14. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/commands/failed_task_management_mixin.py +0 -0
  15. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/domain/__init__.py +0 -0
  16. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/domain/event_message.py +0 -0
  17. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/domain/event_message_factory.py +0 -0
  18. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/domain/events.py +0 -0
  19. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/dtos/__init__.py +0 -0
  20. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/dtos/authz_user.py +0 -0
  21. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/fields/__init__.py +0 -0
  22. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/fields/email_list_field.py +0 -0
  23. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/filters/__init__.py +0 -0
  24. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/filters/base_filter.py +0 -0
  25. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/filters/custom_ordering_filter.py +0 -0
  26. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/filters/filter_utils_mixin.py +0 -0
  27. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/__init__.py +0 -0
  28. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/base_event_handler.py +0 -0
  29. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/sponsor_event_handler.py +0 -0
  30. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/sponsorship_addon_event_handler.py +0 -0
  31. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/sponsorship_event_handler.py +0 -0
  32. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/handlers/summit_event_handler.py +0 -0
  33. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/ioc/__init__.py +0 -0
  34. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/ioc/container.py +0 -0
  35. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/models/__init__.py +0 -0
  36. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/models/item_image.py +0 -0
  37. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/__init__.py +0 -0
  38. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/abstract_access_token_service.py +0 -0
  39. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/abstract_oauth2_api_client.py +0 -0
  40. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/access_token_service.py +0 -0
  41. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/check_sponsor_user_permissions.py +0 -0
  42. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/group_required.py +0 -0
  43. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/oauth2_authentication.py +0 -0
  44. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/oauth2_client_factory.py +0 -0
  45. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/oauth2_scope_required.py +0 -0
  46. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/permission_event_handler.py +0 -0
  47. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/shared.py +0 -0
  48. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/security/user_permissions_service.py +0 -0
  49. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/__init__.py +0 -0
  50. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/base_model_serializer.py +0 -0
  51. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/email_list_char_field.py +0 -0
  52. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/nullable_slug_related_field.py +0 -0
  53. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/serializers_registry.py +0 -0
  54. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/task_result_serializer.py +0 -0
  55. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/timestamp_field.py +0 -0
  56. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/v2/abstract_serializer.py +0 -0
  57. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/v2/base_model_serializer.py +0 -0
  58. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/serializers/v2/query_params.py +0 -0
  59. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/__init__.py +0 -0
  60. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_domain_events_service.py +0 -0
  61. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_event_dispatcher.py +0 -0
  62. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_images_service.py +0 -0
  63. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_sponsor_metadata_service.py +0 -0
  64. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_storage_service.py +0 -0
  65. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/abstract_summit_metadata_service.py +0 -0
  66. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/amqp_service.py +0 -0
  67. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/celery_failed.py +0 -0
  68. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/event_dispatcher.py +0 -0
  69. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/images_service.py +0 -0
  70. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/s3_service.py +0 -0
  71. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/strategies/__init__.py +0 -0
  72. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/strategies/abstract_task_runner_strategy.py +0 -0
  73. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/services/strategies/publish_domain_event_strategy.py +0 -0
  74. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/tests/__init__.py +0 -0
  75. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/tests/test_failed_celery_task_management.py +0 -0
  76. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/urls.py +0 -0
  77. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/__init__.py +0 -0
  78. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/async_helpers.py +0 -0
  79. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/circuit_breaker.py +0 -0
  80. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/config.py +0 -0
  81. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/custom_auto_schema.py +0 -0
  82. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/db_connection_helpers.py +0 -0
  83. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/debounce_helpers.py +0 -0
  84. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/enums.py +0 -0
  85. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/env_var_eval.py +0 -0
  86. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/exceptions.py +0 -0
  87. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/expand_queryset_optimization_mixin.py +0 -0
  88. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/external_errors.py +0 -0
  89. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/file_lock.py +0 -0
  90. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/fingerprint_helpers.py +0 -0
  91. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/http_helpers.py +0 -0
  92. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/inject_job.py +0 -0
  93. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/look_up_value_mixin.py +0 -0
  94. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/model_helpers.py +0 -0
  95. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/oauth2_custom_schema_base.py +0 -0
  96. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/pagination.py +0 -0
  97. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/rate_utils.py +0 -0
  98. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/read_write_serializer_mixin.py +0 -0
  99. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/serializers.py +0 -0
  100. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/service_utils.py +0 -0
  101. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/string.py +0 -0
  102. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/utils/tests.py +0 -0
  103. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/views/__init__.py +0 -0
  104. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/views/base_view.py +0 -0
  105. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/views/parent_children_crud.py +0 -0
  106. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/views/root_entity_crud.py +0 -0
  107. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils/views/tasks_result_view.py +0 -0
  108. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils.egg-info/dependency_links.txt +0 -0
  109. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils.egg-info/requires.txt +0 -0
  110. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/src/base_api_utils.egg-info/top_level.txt +0 -0
  111. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/tests/test_circuit_breaker.py +0 -0
  112. {base_api_utils-1.1.110.dev1 → base_api_utils-1.1.111}/tests/test_lazy_imports.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: base-api-utils
3
- Version: 1.1.110.dev1
3
+ Version: 1.1.111
4
4
  Summary: Django Rest Framework micro services common utilities
5
5
  Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
6
6
  Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
@@ -7,7 +7,7 @@ where = ["src"]
7
7
 
8
8
  [project]
9
9
  name = "base-api-utils"
10
- version = "1.1.110.dev1"
10
+ version = "1.1.111"
11
11
  dependencies = [
12
12
  "boto3",
13
13
  "celery",
@@ -0,0 +1,7 @@
1
+ from .abstract_serializer import AbstractSerializer
2
+ from .base_model_serializer import BaseModelSerializer
3
+
4
+ try:
5
+ import base_api_utils.serializers.v2.spectacular # noqa: F401
6
+ except ImportError:
7
+ pass # drf-spectacular not installed
@@ -13,7 +13,6 @@ class ExpandMapping:
13
13
  original_attribute: str | None = None
14
14
  source: str | None = None
15
15
  verify_relation: bool = False
16
- schema_override: type | None = None
17
16
 
18
17
  @property
19
18
  def source_kwargs(self) -> dict:
@@ -87,17 +86,6 @@ class One2ManyExpandSerializer(IExpandSerializer):
87
86
  fields[fk] = serializers.IntegerField(read_only=True)
88
87
 
89
88
 
90
- class _IDListField(serializers.Field):
91
- """Runtime: returns list of PKs. Schema: annotated externally via _spectacular_annotation."""
92
- def to_representation(self, value):
93
- if hasattr(value, 'all'):
94
- return [item.pk for item in value.all()]
95
- return [item.pk for item in value]
96
-
97
- def to_internal_value(self, data):
98
- return data
99
-
100
-
101
89
  class Many2OneExpandSerializer(IExpandSerializer):
102
90
  # to-many: keep same key; not expanded => list[int]; expanded => list[object]
103
91
  def apply(self, *, fields: dict, mapping: ExpandMapping, context: dict) -> None:
@@ -116,9 +104,6 @@ class Many2OneExpandSerializer(IExpandSerializer):
116
104
  mapping.verify_relation,
117
105
  )
118
106
 
119
- if attr not in fields:
120
- return
121
-
122
107
  if do_expand:
123
108
  fields[attr] = mapping.serializer(
124
109
  many=True,
@@ -127,7 +112,8 @@ class Many2OneExpandSerializer(IExpandSerializer):
127
112
  **mapping.source_kwargs,
128
113
  )
129
114
  else:
130
- schema_cls = mapping.schema_override or mapping.serializer
131
- id_field = _IDListField(read_only=True, **mapping.source_kwargs)
132
- id_field._spectacular_annotation = {"field": schema_cls(many=True, read_only=True)}
133
- fields[attr] = id_field
115
+ fields[attr] = serializers.PrimaryKeyRelatedField(
116
+ many=True,
117
+ read_only=True,
118
+ **mapping.source_kwargs,
119
+ )
@@ -0,0 +1,54 @@
1
+ from drf_spectacular.extensions import OpenApiSerializerExtension
2
+
3
+ from .abstract_serializer import AbstractSerializer
4
+
5
+
6
+ class ExpandMappingSerializerExtension(OpenApiSerializerExtension):
7
+ """Generate OpenAPI schemas with all expand_mappings expanded.
8
+
9
+ Without this extension, drf-spectacular calls get_fields() on our serializers
10
+ without request context, which collapses all relations to ID fields. This
11
+ extension builds a synthetic "all expanded" context so the schema shows
12
+ nested serializer types ($ref) instead of integer IDs.
13
+ """
14
+
15
+ target_class = AbstractSerializer
16
+ match_subclasses = True
17
+
18
+ def map_serializer(self, auto_schema, direction):
19
+ serializer = self.target
20
+ mappings = serializer._merged_expand_mappings()
21
+
22
+ # Leaf serializers (no expand_mappings) — delegate to default handling
23
+ if not mappings:
24
+ return auto_schema._map_serializer(serializer, direction, bypass_extensions=True)
25
+
26
+ # Build synthetic context with all relations expanded
27
+ expand_tree = {}
28
+ for attr, spec in mappings.items():
29
+ child_serializer_cls = spec["serializer"]
30
+ child_mappings = {}
31
+ # Build child expand tree from the child serializer's own mappings
32
+ if hasattr(child_serializer_cls, "_merged_expand_mappings"):
33
+ try:
34
+ child_instance = child_serializer_cls(context={})
35
+ child_mappings = child_instance._merged_expand_mappings()
36
+ except Exception:
37
+ pass
38
+ expand_tree[attr] = {k: {} for k in child_mappings}
39
+
40
+ relations_tree = {attr: {} for attr in mappings}
41
+ # Also include any allowed_relations not covered by expand_mappings
42
+ for rel in serializer._merged_allowed_relations():
43
+ if rel not in relations_tree:
44
+ relations_tree[rel] = {}
45
+
46
+ context = {
47
+ "expand_tree": expand_tree,
48
+ "fields_tree": None,
49
+ "relations_tree": relations_tree,
50
+ }
51
+
52
+ # Create a new instance with the synthetic context
53
+ expanded = serializer.__class__(context=context)
54
+ return auto_schema._map_serializer(expanded, direction, bypass_extensions=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: base-api-utils
3
- Version: 1.1.110.dev1
3
+ Version: 1.1.111
4
4
  Summary: Django Rest Framework micro services common utilities
5
5
  Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
6
6
  Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
@@ -56,6 +56,7 @@ src/base_api_utils/serializers/v2/abstract_serializer.py
56
56
  src/base_api_utils/serializers/v2/base_model_serializer.py
57
57
  src/base_api_utils/serializers/v2/expands.py
58
58
  src/base_api_utils/serializers/v2/query_params.py
59
+ src/base_api_utils/serializers/v2/spectacular.py
59
60
  src/base_api_utils/services/__init__.py
60
61
  src/base_api_utils/services/abstract_domain_events_service.py
61
62
  src/base_api_utils/services/abstract_event_dispatcher.py
@@ -1,2 +0,0 @@
1
- from .abstract_serializer import AbstractSerializer
2
- from .base_model_serializer import BaseModelSerializer