GeneralManager 0.41.7__tar.gz → 0.41.9__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 (194) hide show
  1. {generalmanager-0.41.7/src/GeneralManager.egg-info → generalmanager-0.41.9}/PKG-INFO +1 -1
  2. {generalmanager-0.41.7 → generalmanager-0.41.9}/pyproject.toml +1 -1
  3. {generalmanager-0.41.7 → generalmanager-0.41.9/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bootstrap.py +31 -1
  5. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/group_bucket.py +76 -6
  6. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +4 -0
  7. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/manager/group_manager.py +33 -3
  8. {generalmanager-0.41.7 → generalmanager-0.41.9}/LICENSE +0 -0
  9. {generalmanager-0.41.7 → generalmanager-0.41.9}/README.md +0 -0
  10. {generalmanager-0.41.7 → generalmanager-0.41.9}/setup.cfg +0 -0
  11. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  12. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  13. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/GeneralManager.egg-info/requires.txt +0 -0
  14. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/GeneralManager.egg-info/top_level.txt +0 -0
  15. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/__init__.py +0 -0
  16. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/__init__.py +0 -0
  17. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/api.py +0 -0
  18. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/bucket.py +0 -0
  19. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/cache.py +0 -0
  20. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/factory.py +0 -0
  21. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/general_manager.py +0 -0
  22. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/interface.py +0 -0
  23. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/manager.py +0 -0
  24. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/measurement.py +0 -0
  25. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/permission.py +0 -0
  26. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/rule.py +0 -0
  27. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/search.py +0 -0
  28. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/_types/utils.py +0 -0
  29. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/__init__.py +0 -0
  30. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql.py +0 -0
  31. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_errors.py +0 -0
  32. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_mutations.py +0 -0
  33. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_resolvers.py +0 -0
  34. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_search.py +0 -0
  35. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  36. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_subscriptions.py +0 -0
  37. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/graphql_view.py +0 -0
  38. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/mutation.py +0 -0
  39. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/property.py +0 -0
  40. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/registry.py +0 -0
  41. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/remote_api.py +0 -0
  42. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/remote_invalidation.py +0 -0
  43. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/api/remote_invalidation_client.py +0 -0
  44. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/apps.py +0 -0
  45. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/__init__.py +0 -0
  46. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/base_bucket.py +0 -0
  47. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/calculation_bucket.py +0 -0
  48. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/database_bucket.py +0 -0
  49. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/bucket/request_bucket.py +0 -0
  50. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/__init__.py +0 -0
  51. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/cache_decorator.py +0 -0
  52. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/cache_tracker.py +0 -0
  53. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/dependency_index.py +0 -0
  54. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/model_dependency_collector.py +0 -0
  55. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/cache/signals.py +0 -0
  56. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/conf.py +0 -0
  57. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/factory/__init__.py +0 -0
  58. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/factory/auto_factory.py +0 -0
  59. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/factory/factories.py +0 -0
  60. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/factory/factory_methods.py +0 -0
  61. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/__init__.py +0 -0
  62. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/base_interface.py +0 -0
  63. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/bundles/__init__.py +0 -0
  64. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/bundles/calculation.py +0 -0
  65. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/bundles/database.py +0 -0
  66. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  67. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/bundles/request.py +0 -0
  68. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/__init__.py +0 -0
  69. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/base.py +0 -0
  70. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/builtin.py +0 -0
  71. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  72. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  73. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  74. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/configuration.py +0 -0
  75. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  76. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  77. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  78. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  79. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  80. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  81. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/factory.py +0 -0
  82. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  83. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  84. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  85. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  86. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  87. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  88. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  89. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  90. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  91. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  92. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  93. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  94. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  95. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/registry.py +0 -0
  96. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  97. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  98. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  99. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  100. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/__init__.py +0 -0
  101. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/calculation.py +0 -0
  102. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/database.py +0 -0
  103. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  104. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/read_only.py +0 -0
  105. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  106. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/interfaces/request.py +0 -0
  107. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/manifests/__init__.py +0 -0
  108. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  109. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  110. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/manifests/capability_models.py +0 -0
  111. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/orm_interface.py +0 -0
  112. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/requests.py +0 -0
  113. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/utils/__init__.py +0 -0
  114. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  115. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/utils/errors.py +0 -0
  116. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/interface/utils/models.py +0 -0
  117. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/logging.py +0 -0
  118. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/management/commands/search_index.py +0 -0
  119. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  120. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/management/commands/shell.py +0 -0
  121. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  122. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  123. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/manager/__init__.py +0 -0
  124. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/manager/general_manager.py +0 -0
  125. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/manager/input.py +0 -0
  126. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/manager/meta.py +0 -0
  127. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/measurement/__init__.py +0 -0
  128. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/measurement/measurement.py +0 -0
  129. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/measurement/measurement_field.py +0 -0
  130. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/metrics/__init__.py +0 -0
  131. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/metrics/graphql.py +0 -0
  132. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/migrations/0001_initial.py +0 -0
  133. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  134. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  135. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/migrations/__init__.py +0 -0
  136. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/models.py +0 -0
  137. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/__init__.py +0 -0
  138. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/audit.py +0 -0
  139. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/base_permission.py +0 -0
  140. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/graphql_capabilities.py +0 -0
  141. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/manager_based_permission.py +0 -0
  142. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/mutation_permission.py +0 -0
  143. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/permission_checks.py +0 -0
  144. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/permission_data_manager.py +0 -0
  145. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/permission/utils.py +0 -0
  146. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/public_api_registry.py +0 -0
  147. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/py.typed +0 -0
  148. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/rule/__init__.py +0 -0
  149. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/rule/handler.py +0 -0
  150. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/rule/rule.py +0 -0
  151. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/__init__.py +0 -0
  152. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/async_tasks.py +0 -0
  153. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backend.py +0 -0
  154. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backend_registry.py +0 -0
  155. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backends/__init__.py +0 -0
  156. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backends/dev.py +0 -0
  157. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backends/meilisearch.py +0 -0
  158. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backends/opensearch.py +0 -0
  159. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/backends/typesense.py +0 -0
  160. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/config.py +0 -0
  161. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/indexer.py +0 -0
  162. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/registry.py +0 -0
  163. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/search/utils.py +0 -0
  164. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/seeding/__init__.py +0 -0
  165. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/seeding/manager_landscape.py +0 -0
  166. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/__init__.py +0 -0
  167. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/args_to_kwargs.py +0 -0
  168. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/filter_parser.py +0 -0
  169. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/format_string.py +0 -0
  170. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/json_encoder.py +0 -0
  171. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/make_cache_key.py +0 -0
  172. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/none_to_zero.py +0 -0
  173. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/path_mapping.py +0 -0
  174. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/public_api.py +0 -0
  175. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/testing.py +0 -0
  176. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/utils/type_checks.py +0 -0
  177. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/__init__.py +0 -0
  178. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/actions.py +0 -0
  179. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/backend_registry.py +0 -0
  180. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/backends/__init__.py +0 -0
  181. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/backends/celery.py +0 -0
  182. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/backends/local.py +0 -0
  183. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/backends/n8n.py +0 -0
  184. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/config.py +0 -0
  185. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/engine.py +0 -0
  186. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/event_registry.py +0 -0
  187. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/events.py +0 -0
  188. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/models.py +0 -0
  189. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/signal_bridge.py +0 -0
  190. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/tasks.py +0 -0
  191. {generalmanager-0.41.7 → generalmanager-0.41.9}/src/general_manager/workflow/telemetry.py +0 -0
  192. {generalmanager-0.41.7 → generalmanager-0.41.9}/tests/test_settings.py +0 -0
  193. {generalmanager-0.41.7 → generalmanager-0.41.9}/tests/test_urls.py +0 -0
  194. {generalmanager-0.41.7 → generalmanager-0.41.9}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.41.7
3
+ Version: 0.41.9
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.41.7"
7
+ version = "0.41.9"
8
8
  description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.41.7
3
+ Version: 0.41.9
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -298,6 +298,31 @@ def initialize_general_manager_classes(
298
298
  if isinstance(field_type, type) and issubclass(field_type, _GM):
299
299
  yield attribute_name, field_type
300
300
 
301
+ def _has_reverse_relation_attribute(
302
+ manager_class: Type[_GM],
303
+ related_manager_class: Type[_GM],
304
+ ) -> bool:
305
+ get_attribute_types = getattr(
306
+ manager_class.Interface, "get_attribute_types", None
307
+ )
308
+ if not callable(get_attribute_types):
309
+ return False
310
+ try:
311
+ attribute_types = get_attribute_types()
312
+ except NotImplementedError:
313
+ return False
314
+ return any(
315
+ metadata.get("is_derived", False)
316
+ and metadata.get("relation_kind") in {"collection", "direct"}
317
+ and metadata.get("type") is related_manager_class
318
+ for metadata in attribute_types.values()
319
+ )
320
+
321
+ def _to_snake_case(name: str) -> str:
322
+ snake = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
323
+ snake = re.sub("([a-z0-9])([A-Z])", r"\1_\2", snake)
324
+ return snake.lower()
325
+
301
326
  logger.debug(
302
327
  "creating manager attributes",
303
328
  context={"pending_attributes": len(pending_attribute_initialization)},
@@ -323,13 +348,18 @@ def initialize_general_manager_classes(
323
348
  for attribute_name, connected_manager in _iter_manager_relation_fields(
324
349
  general_manager_class
325
350
  ):
351
+ if _has_reverse_relation_attribute(
352
+ connected_manager,
353
+ general_manager_class,
354
+ ):
355
+ continue
326
356
  resolver = _build_connection_resolver(attribute_name, general_manager_class)
327
357
  relation_property = GraphQLProperty(resolver)
328
358
  marked_relation_property: Any = relation_property
329
359
  marked_relation_property._general_manager_generated_relation = True
330
360
  setattr(
331
361
  connected_manager,
332
- f"{general_manager_class.__name__.lower()}_list",
362
+ f"{_to_snake_case(general_manager_class.__name__)}_list",
333
363
  relation_property,
334
364
  )
335
365
  for general_manager_class in all_classes:
@@ -1,11 +1,71 @@
1
1
  """Grouping bucket implementation for aggregating GeneralManager instances."""
2
2
 
3
3
  from __future__ import annotations
4
- from typing import Any, Generator, Generic, Type
4
+ from typing import Any, Generator, Generic, Type, cast
5
5
  from general_manager.manager.group_manager import GroupManager
6
+ from general_manager.manager.general_manager import GeneralManager
6
7
  from general_manager.bucket.base_bucket import Bucket, GeneralManagerType
7
8
 
8
9
 
10
+ def _freeze_group_value(value: Any) -> Any:
11
+ """Return a hashable identity for values used to distinguish groups."""
12
+ if isinstance(value, GeneralManager):
13
+ return (
14
+ value.__class__,
15
+ tuple(
16
+ sorted(
17
+ (
18
+ key,
19
+ _freeze_group_value(identifier),
20
+ )
21
+ for key, identifier in value.identification.items()
22
+ )
23
+ ),
24
+ )
25
+ if isinstance(value, dict):
26
+ return tuple(
27
+ sorted(
28
+ (
29
+ _freeze_group_value(key),
30
+ _freeze_group_value(item),
31
+ )
32
+ for key, item in value.items()
33
+ )
34
+ )
35
+ if isinstance(value, (list, tuple)):
36
+ return tuple(_freeze_group_value(item) for item in value)
37
+ if isinstance(value, set):
38
+ return frozenset(_freeze_group_value(item) for item in value)
39
+ return value
40
+
41
+
42
+ def _group_filter_kwargs(
43
+ manager_class: Type[GeneralManagerType],
44
+ group_by_value: tuple[tuple[str, Any], ...],
45
+ ) -> dict[str, Any]:
46
+ """Translate grouped manager values into backend-neutral relation lookups."""
47
+ filters: dict[str, Any] = {}
48
+ get_attribute_types = getattr(
49
+ manager_class.Interface,
50
+ "get_attribute_types",
51
+ None,
52
+ )
53
+ attributes = get_attribute_types() if callable(get_attribute_types) else {}
54
+ for key, value in group_by_value:
55
+ attribute_info = cast(dict[str, Any], attributes.get(key, {}))
56
+ filter_key = attribute_info.get("filter_lookup", key)
57
+ if isinstance(value, GeneralManager):
58
+ filters.update(
59
+ {
60
+ f"{filter_key}__{identifier_key}": identifier_value
61
+ for identifier_key, identifier_value in value.identification.items()
62
+ }
63
+ )
64
+ continue
65
+ filters[filter_key] = value
66
+ return filters
67
+
68
+
9
69
  class InvalidGroupByKeyTypeError(TypeError):
10
70
  """Raised when a non-string value is provided as a group-by key."""
11
71
 
@@ -191,15 +251,25 @@ class GroupBucket(Generic[GeneralManagerType]):
191
251
  Returns:
192
252
  list[GroupManager[GeneralManagerType]]: A list of GroupManager objects, one per unique tuple of group-by key values; groups are produced in order sorted by the string representation of their key tuples.
193
253
  """
194
- group_by_values: set[tuple[tuple[str, Any], ...]] = set()
254
+ group_by_values: dict[
255
+ tuple[tuple[str, Any], ...],
256
+ tuple[tuple[str, Any], ...],
257
+ ] = {}
195
258
  for entry in data:
196
- key = tuple((arg, getattr(entry, arg)) for arg in self._group_by_keys)
197
- group_by_values.add(key)
259
+ group_by_value = tuple(
260
+ (arg, getattr(entry, arg)) for arg in self._group_by_keys
261
+ )
262
+ group_identity = tuple(
263
+ (arg, _freeze_group_value(value)) for arg, value in group_by_value
264
+ )
265
+ group_by_values.setdefault(group_identity, group_by_value)
198
266
 
199
267
  groups: list[GroupManager[GeneralManagerType]] = []
200
- for group_by_value in sorted(group_by_values, key=str):
268
+ for group_by_value in sorted(group_by_values.values(), key=str):
201
269
  group_by_dict = {key: value for key, value in group_by_value}
202
- grouped_manager_objects = data.filter(**group_by_dict)
270
+ grouped_manager_objects = data.filter(
271
+ **_group_filter_kwargs(self._manager_class, group_by_value)
272
+ )
203
273
  groups.append(
204
274
  GroupManager(
205
275
  self._manager_class, group_by_dict, grouped_manager_objects
@@ -567,6 +567,10 @@ def _iter_foreign_key_fields(
567
567
  An iterable of Django `Field` objects for each many-to-one or one-to-one relation on the model, excluding `GenericForeignKey` fields.
568
568
  """
569
569
  for field in model._meta.get_fields():
570
+ if getattr(field, "auto_created", False) and not getattr(
571
+ field, "concrete", False
572
+ ):
573
+ continue
570
574
  if not field.is_relation:
571
575
  continue
572
576
  if isinstance(field, GenericForeignKey):
@@ -12,6 +12,35 @@ from general_manager.bucket.base_bucket import (
12
12
  )
13
13
 
14
14
 
15
+ def _freeze_manager_value(value: Any) -> Any:
16
+ """Return a hashable representation for manager-backed group state."""
17
+ if isinstance(value, GeneralManager):
18
+ return tuple(
19
+ sorted(
20
+ (
21
+ key,
22
+ _freeze_manager_value(identifier),
23
+ )
24
+ for key, identifier in value.identification.items()
25
+ )
26
+ )
27
+ if isinstance(value, dict):
28
+ return tuple(
29
+ sorted(
30
+ (
31
+ _freeze_manager_value(key),
32
+ _freeze_manager_value(item),
33
+ )
34
+ for key, item in value.items()
35
+ )
36
+ )
37
+ if isinstance(value, (list, tuple)):
38
+ return tuple(_freeze_manager_value(item) for item in value)
39
+ if isinstance(value, set):
40
+ return frozenset(_freeze_manager_value(item) for item in value)
41
+ return value
42
+
43
+
15
44
  class MissingGroupAttributeError(AttributeError):
16
45
  """Raised when a GroupManager access attempts to use an undefined attribute."""
17
46
 
@@ -61,8 +90,8 @@ class GroupManager(Generic[GeneralManagerType]):
61
90
  return hash(
62
91
  (
63
92
  self._manager_class,
64
- tuple(self._group_by_value.items()),
65
- frozenset(self._data),
93
+ _freeze_manager_value(self._group_by_value),
94
+ frozenset(_freeze_manager_value(entry) for entry in self._data),
66
95
  )
67
96
  )
68
97
 
@@ -80,7 +109,8 @@ class GroupManager(Generic[GeneralManagerType]):
80
109
  isinstance(other, self.__class__)
81
110
  and self._manager_class == other._manager_class
82
111
  and self._group_by_value == other._group_by_value
83
- and frozenset(self._data) == frozenset(other._data)
112
+ and frozenset(_freeze_manager_value(entry) for entry in self._data)
113
+ == frozenset(_freeze_manager_value(entry) for entry in other._data)
84
114
  )
85
115
 
86
116
  def __repr__(self) -> str:
File without changes