GeneralManager 0.41.0__tar.gz → 0.41.2__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.0/src/GeneralManager.egg-info → generalmanager-0.41.2}/PKG-INFO +1 -1
  2. {generalmanager-0.41.0 → generalmanager-0.41.2}/pyproject.toml +1 -1
  3. {generalmanager-0.41.0 → generalmanager-0.41.2/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +61 -2
  5. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/measurement/measurement.py +46 -1
  6. {generalmanager-0.41.0 → generalmanager-0.41.2}/LICENSE +0 -0
  7. {generalmanager-0.41.0 → generalmanager-0.41.2}/README.md +0 -0
  8. {generalmanager-0.41.0 → generalmanager-0.41.2}/setup.cfg +0 -0
  9. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  10. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  11. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/GeneralManager.egg-info/requires.txt +0 -0
  12. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/GeneralManager.egg-info/top_level.txt +0 -0
  13. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/__init__.py +0 -0
  14. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/__init__.py +0 -0
  15. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/api.py +0 -0
  16. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/bucket.py +0 -0
  17. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/cache.py +0 -0
  18. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/factory.py +0 -0
  19. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/general_manager.py +0 -0
  20. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/interface.py +0 -0
  21. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/manager.py +0 -0
  22. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/measurement.py +0 -0
  23. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/permission.py +0 -0
  24. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/rule.py +0 -0
  25. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/search.py +0 -0
  26. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/_types/utils.py +0 -0
  27. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/__init__.py +0 -0
  28. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql.py +0 -0
  29. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_errors.py +0 -0
  30. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_mutations.py +0 -0
  31. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_resolvers.py +0 -0
  32. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_search.py +0 -0
  33. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  34. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_subscriptions.py +0 -0
  35. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/graphql_view.py +0 -0
  36. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/mutation.py +0 -0
  37. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/property.py +0 -0
  38. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/registry.py +0 -0
  39. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/remote_api.py +0 -0
  40. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/remote_invalidation.py +0 -0
  41. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/api/remote_invalidation_client.py +0 -0
  42. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/apps.py +0 -0
  43. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bootstrap.py +0 -0
  44. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/__init__.py +0 -0
  45. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/base_bucket.py +0 -0
  46. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/calculation_bucket.py +0 -0
  47. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/database_bucket.py +0 -0
  48. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/group_bucket.py +0 -0
  49. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/bucket/request_bucket.py +0 -0
  50. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/__init__.py +0 -0
  51. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/cache_decorator.py +0 -0
  52. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/cache_tracker.py +0 -0
  53. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/dependency_index.py +0 -0
  54. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/model_dependency_collector.py +0 -0
  55. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/cache/signals.py +0 -0
  56. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/conf.py +0 -0
  57. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/factory/__init__.py +0 -0
  58. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/factory/auto_factory.py +0 -0
  59. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/factory/factories.py +0 -0
  60. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/factory/factory_methods.py +0 -0
  61. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/__init__.py +0 -0
  62. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/base_interface.py +0 -0
  63. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/bundles/__init__.py +0 -0
  64. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/bundles/calculation.py +0 -0
  65. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/bundles/database.py +0 -0
  66. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  67. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/bundles/request.py +0 -0
  68. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/__init__.py +0 -0
  69. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/base.py +0 -0
  70. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/builtin.py +0 -0
  71. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  72. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  73. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  74. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/configuration.py +0 -0
  75. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  76. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  77. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  78. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  79. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  80. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  81. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/factory.py +0 -0
  82. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  83. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  84. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  85. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  86. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  87. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  88. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  89. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  90. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  91. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  92. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  93. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  94. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  95. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/registry.py +0 -0
  96. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  97. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  98. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  99. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  100. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/__init__.py +0 -0
  101. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/calculation.py +0 -0
  102. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/database.py +0 -0
  103. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  104. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/read_only.py +0 -0
  105. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  106. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/interfaces/request.py +0 -0
  107. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/manifests/__init__.py +0 -0
  108. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  109. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  110. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/manifests/capability_models.py +0 -0
  111. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/orm_interface.py +0 -0
  112. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/requests.py +0 -0
  113. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/utils/__init__.py +0 -0
  114. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  115. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/utils/errors.py +0 -0
  116. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/interface/utils/models.py +0 -0
  117. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/logging.py +0 -0
  118. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/management/commands/search_index.py +0 -0
  119. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  120. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/management/commands/shell.py +0 -0
  121. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  122. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  123. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/manager/__init__.py +0 -0
  124. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/manager/general_manager.py +0 -0
  125. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/manager/group_manager.py +0 -0
  126. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/manager/input.py +0 -0
  127. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/manager/meta.py +0 -0
  128. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/measurement/__init__.py +0 -0
  129. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/measurement/measurement_field.py +0 -0
  130. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/metrics/__init__.py +0 -0
  131. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/metrics/graphql.py +0 -0
  132. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/migrations/0001_initial.py +0 -0
  133. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  134. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  135. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/migrations/__init__.py +0 -0
  136. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/models.py +0 -0
  137. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/__init__.py +0 -0
  138. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/audit.py +0 -0
  139. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/base_permission.py +0 -0
  140. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/graphql_capabilities.py +0 -0
  141. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/manager_based_permission.py +0 -0
  142. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/mutation_permission.py +0 -0
  143. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/permission_checks.py +0 -0
  144. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/permission_data_manager.py +0 -0
  145. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/permission/utils.py +0 -0
  146. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/public_api_registry.py +0 -0
  147. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/py.typed +0 -0
  148. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/rule/__init__.py +0 -0
  149. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/rule/handler.py +0 -0
  150. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/rule/rule.py +0 -0
  151. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/__init__.py +0 -0
  152. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/async_tasks.py +0 -0
  153. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backend.py +0 -0
  154. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backend_registry.py +0 -0
  155. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backends/__init__.py +0 -0
  156. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backends/dev.py +0 -0
  157. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backends/meilisearch.py +0 -0
  158. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backends/opensearch.py +0 -0
  159. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/backends/typesense.py +0 -0
  160. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/config.py +0 -0
  161. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/indexer.py +0 -0
  162. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/registry.py +0 -0
  163. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/search/utils.py +0 -0
  164. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/seeding/__init__.py +0 -0
  165. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/seeding/manager_landscape.py +0 -0
  166. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/__init__.py +0 -0
  167. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/args_to_kwargs.py +0 -0
  168. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/filter_parser.py +0 -0
  169. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/format_string.py +0 -0
  170. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/json_encoder.py +0 -0
  171. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/make_cache_key.py +0 -0
  172. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/none_to_zero.py +0 -0
  173. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/path_mapping.py +0 -0
  174. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/public_api.py +0 -0
  175. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/testing.py +0 -0
  176. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/utils/type_checks.py +0 -0
  177. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/__init__.py +0 -0
  178. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/actions.py +0 -0
  179. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/backend_registry.py +0 -0
  180. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/backends/__init__.py +0 -0
  181. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/backends/celery.py +0 -0
  182. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/backends/local.py +0 -0
  183. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/backends/n8n.py +0 -0
  184. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/config.py +0 -0
  185. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/engine.py +0 -0
  186. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/event_registry.py +0 -0
  187. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/events.py +0 -0
  188. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/models.py +0 -0
  189. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/signal_bridge.py +0 -0
  190. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/tasks.py +0 -0
  191. {generalmanager-0.41.0 → generalmanager-0.41.2}/src/general_manager/workflow/telemetry.py +0 -0
  192. {generalmanager-0.41.0 → generalmanager-0.41.2}/tests/test_settings.py +0 -0
  193. {generalmanager-0.41.0 → generalmanager-0.41.2}/tests/test_urls.py +0 -0
  194. {generalmanager-0.41.0 → generalmanager-0.41.2}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.41.0
3
+ Version: 0.41.2
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.0"
7
+ version = "0.41.2"
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.0
3
+ Version: 0.41.2
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
@@ -11,6 +11,7 @@ from uuid import UUID
11
11
 
12
12
  from django.apps import apps
13
13
  from django.contrib.contenttypes.fields import GenericForeignKey
14
+ from django.core.exceptions import ObjectDoesNotExist
14
15
  from django.db import models
15
16
 
16
17
  from general_manager.interface.base_interface import AttributeTypedDict
@@ -135,6 +136,7 @@ class _FieldDescriptorBuilder:
135
136
  self._add_custom_fields()
136
137
  self._add_model_fields()
137
138
  self._add_foreign_key_fields()
139
+ self._add_reverse_one_to_one_relations()
138
140
  self._add_collection_relations()
139
141
  return self._descriptors
140
142
 
@@ -209,6 +211,41 @@ class _FieldDescriptorBuilder:
209
211
  filter_lookup=field.name,
210
212
  )
211
213
 
214
+ def _add_reverse_one_to_one_relations(self) -> None:
215
+ """Register snake_case aliases for reverse one-to-one relation accessors."""
216
+ for relation in _iter_reverse_one_to_one_relations(self.model):
217
+ related_model = self._resolve_related_model(
218
+ getattr(relation, "related_model", None)
219
+ )
220
+ if related_model is None:
221
+ continue
222
+ accessor_name = relation.get_accessor_name() or relation.name
223
+ attribute_name = _to_snake_case(related_model.__name__)
224
+ if attribute_name in self._descriptors:
225
+ continue
226
+ general_manager_class = getattr(
227
+ related_model, "_general_manager_class", None
228
+ )
229
+ if general_manager_class:
230
+ accessor = _general_manager_accessor(
231
+ accessor_name, general_manager_class
232
+ )
233
+ relation_type = cast(type, general_manager_class)
234
+ else:
235
+ accessor = _instance_attribute_accessor(accessor_name)
236
+ relation_type = cast(type, related_model)
237
+ self._register(
238
+ attribute_name=attribute_name,
239
+ raw_type=relation_type,
240
+ is_required=False,
241
+ is_editable=False,
242
+ default=None,
243
+ is_derived=True,
244
+ accessor=accessor,
245
+ relation_kind="direct",
246
+ filter_lookup=relation.name,
247
+ )
248
+
212
249
  def _add_collection_relations(self) -> None:
213
250
  """
214
251
  Register collection relation field descriptors for the builder's model.
@@ -521,6 +558,22 @@ def _iter_many_to_many_fields(
521
558
  yield cast(models.Field, field)
522
559
 
523
560
 
561
+ def _iter_reverse_one_to_one_relations(
562
+ model: type[models.Model],
563
+ ) -> Iterable[models.OneToOneRel]:
564
+ """Yield reverse one-to-one relations declared on a Django model."""
565
+ meta = getattr(model, "_meta", None)
566
+ get_fields = getattr(meta, "get_fields", None)
567
+ if not callable(get_fields):
568
+ return
569
+ for field in get_fields():
570
+ if getattr(field, "is_relation", False) and getattr(field, "one_to_one", False):
571
+ if getattr(field, "auto_created", False) and not getattr(
572
+ field, "concrete", False
573
+ ):
574
+ yield cast(models.OneToOneRel, field)
575
+
576
+
524
577
  def _iter_reverse_relations(
525
578
  model: type[models.Model],
526
579
  ) -> Iterable[models.ManyToOneRel]:
@@ -558,7 +611,10 @@ def _instance_attribute_accessor(field_name: str) -> DescriptorAccessor:
558
611
  Returns:
559
612
  The attribute value retrieved from the underlying model instance.
560
613
  """
561
- return getattr(self._instance, field_name)
614
+ try:
615
+ return getattr(self._instance, field_name)
616
+ except ObjectDoesNotExist:
617
+ return None
562
618
 
563
619
  return getter
564
620
 
@@ -584,7 +640,10 @@ def _general_manager_accessor(
584
640
  Returns:
585
641
  The value produced by calling `manager_class` with the related object's primary key, or `None` if the related object is `None`.
586
642
  """
587
- related = getattr(self._instance, field_name)
643
+ try:
644
+ related = getattr(self._instance, field_name)
645
+ except ObjectDoesNotExist:
646
+ return None
588
647
  if related is None:
589
648
  return None
590
649
  return manager_class(related.pk)
@@ -2,7 +2,7 @@
2
2
 
3
3
  # units.py
4
4
  from __future__ import annotations
5
- from typing import Any, Callable
5
+ from typing import Any, Callable, cast
6
6
  import math
7
7
  import pint
8
8
  from decimal import Decimal, getcontext, InvalidOperation
@@ -104,6 +104,27 @@ def _convert_quantity(quantity: PlainQuantity, target_unit: str) -> PlainQuantit
104
104
  return source_quantity.to(target_unit)
105
105
 
106
106
 
107
+ def _currency_component(unit: str) -> tuple[str, int] | None:
108
+ """Return the single configured currency component in a unit expression."""
109
+
110
+ parsed_unit = ureg.parse_units(str(unit))
111
+ currency_components = [
112
+ (unit_name, int(cast(Any, power)))
113
+ for unit_name, power in parsed_unit._units.items()
114
+ if unit_name in currency_units
115
+ ]
116
+ if len(currency_components) != 1:
117
+ return None
118
+ return currency_components[0]
119
+
120
+
121
+ def _unit_without_currency(unit: str, currency: str, power: int) -> str:
122
+ """Return a unit expression with one currency component removed."""
123
+
124
+ stripped_unit = ureg.parse_units(str(unit)) / (ureg.parse_units(currency) ** power)
125
+ return str(stripped_unit)
126
+
127
+
107
128
  def convert_magnitude(value: Decimal, source_unit: str, target_unit: str) -> Decimal:
108
129
  """
109
130
  Convert a magnitude between units while keeping offset-unit math away from Decimal.
@@ -457,6 +478,30 @@ class Measurement:
457
478
  Raises:
458
479
  MissingExchangeRateError: If converting between two different currencies without providing an exchange rate.
459
480
  """
481
+ source_currency = _currency_component(self.unit)
482
+ target_currency = _currency_component(target_unit)
483
+ if (
484
+ source_currency is not None
485
+ and target_currency is not None
486
+ and source_currency[0] != target_currency[0]
487
+ ):
488
+ if exchange_rate is None:
489
+ raise MissingExchangeRateError()
490
+ source_currency_name, source_currency_power = source_currency
491
+ target_currency_name, target_currency_power = target_currency
492
+ if source_currency_power == target_currency_power:
493
+ value = convert_magnitude(
494
+ self.magnitude,
495
+ _unit_without_currency(
496
+ self.unit, source_currency_name, source_currency_power
497
+ ),
498
+ _unit_without_currency(
499
+ target_unit, target_currency_name, target_currency_power
500
+ ),
501
+ )
502
+ value *= Decimal(str(exchange_rate)) ** source_currency_power
503
+ return Measurement(value, target_unit)
504
+
460
505
  if self.is_currency():
461
506
  if str(self.unit) == str(target_unit):
462
507
  return self # Same currency, no conversion needed
File without changes