GeneralManager 0.80.8__tar.gz → 0.81.0__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 (338) hide show
  1. {generalmanager-0.80.8/src/GeneralManager.egg-info → generalmanager-0.81.0}/PKG-INFO +1 -1
  2. {generalmanager-0.80.8 → generalmanager-0.81.0}/pyproject.toml +1 -1
  3. {generalmanager-0.80.8 → generalmanager-0.81.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/SOURCES.txt +4 -0
  5. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/cache.py +4 -0
  6. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/general_manager.py +18 -0
  7. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/manager.py +10 -0
  8. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql.py +13 -3
  9. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_invalidation.py +13 -3
  10. generalmanager-0.81.0/src/general_manager/cache/batch_refresh.py +139 -0
  11. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_index.py +5 -0
  12. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/signals.py +46 -8
  13. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/base_interface.py +52 -3
  14. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/database.py +4 -0
  15. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/base.py +35 -0
  16. generalmanager-0.81.0/src/general_manager/interface/capabilities/orm/bulk.py +846 -0
  17. generalmanager-0.81.0/src/general_manager/interface/capabilities/orm/create_many.py +460 -0
  18. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/mutations.py +76 -4
  19. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_manifest.py +3 -1
  20. generalmanager-0.81.0/src/general_manager/manager/bulk_create.py +374 -0
  21. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/general_manager.py +29 -4
  22. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/public_api_registry.py +58 -0
  23. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/invalidation.py +130 -12
  24. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/signal_bridge.py +29 -2
  25. {generalmanager-0.80.8 → generalmanager-0.81.0}/LICENSE +0 -0
  26. {generalmanager-0.80.8 → generalmanager-0.81.0}/README.md +0 -0
  27. {generalmanager-0.80.8 → generalmanager-0.81.0}/setup.cfg +0 -0
  28. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  29. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/requires.txt +0 -0
  30. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  31. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/__init__.py +0 -0
  32. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/__init__.py +0 -0
  33. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/api.py +0 -0
  34. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/bucket.py +0 -0
  35. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/dataframes.py +0 -0
  36. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/factory.py +0 -0
  37. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/interface.py +0 -0
  38. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/measurement.py +0 -0
  39. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/permission.py +0 -0
  40. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/rule.py +0 -0
  41. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/search.py +0 -0
  42. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/utils.py +0 -0
  43. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/__init__.py +0 -0
  44. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_as_of.py +0 -0
  45. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_errors.py +0 -0
  46. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_groups.py +0 -0
  47. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_mutations.py +0 -0
  48. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_ordering.py +0 -0
  49. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_output.py +0 -0
  50. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  51. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_relations.py +0 -0
  52. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  53. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_search.py +0 -0
  54. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  55. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  56. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_type.py +0 -0
  57. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_view.py +0 -0
  58. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup.py +0 -0
  59. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  60. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  61. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/mutation.py +0 -0
  62. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/notification_batching.py +0 -0
  63. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/property.py +0 -0
  64. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/registry.py +0 -0
  65. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_api.py +0 -0
  66. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  67. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/apps.py +0 -0
  68. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/as_of.py +0 -0
  69. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bootstrap.py +0 -0
  70. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/__init__.py +0 -0
  71. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  72. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/_ordering.py +0 -0
  73. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/base_bucket.py +0 -0
  74. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  75. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/database_bucket.py +0 -0
  76. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/excel_bucket.py +0 -0
  77. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/group_bucket.py +0 -0
  78. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/indexing.py +0 -0
  79. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/projection.py +0 -0
  80. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/request_bucket.py +0 -0
  81. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/__init__.py +0 -0
  82. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/_dependency_graph.py +0 -0
  83. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/cache_decorator.py +0 -0
  84. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/cache_tracker.py +0 -0
  85. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/data_change_context.py +0 -0
  86. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_cache.py +0 -0
  87. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_matching.py +0 -0
  88. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_publish.py +0 -0
  89. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_shards.py +0 -0
  90. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  91. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/run_context.py +0 -0
  92. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/run_context_lru.py +0 -0
  93. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/__init__.py +0 -0
  94. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/audit.py +0 -0
  95. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/bootstrap.py +0 -0
  96. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/checks.py +0 -0
  97. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/consumer.py +0 -0
  98. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/context.py +0 -0
  99. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/errors.py +0 -0
  100. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/__init__.py +0 -0
  101. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/__main__.py +0 -0
  102. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/baseline.py +0 -0
  103. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  104. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  105. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  106. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  107. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  108. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  109. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  110. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  111. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  112. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  113. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  114. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  115. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  116. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  117. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  118. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/readiness.py +0 -0
  119. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/runner.py +0 -0
  120. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/traces.py +0 -0
  121. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/grounding.py +0 -0
  122. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/models.py +0 -0
  123. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/__init__.py +0 -0
  124. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/budget.py +0 -0
  125. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/calculations.py +0 -0
  126. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/catalog.py +0 -0
  127. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/config.py +0 -0
  128. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/events.py +0 -0
  129. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/evidence.py +0 -0
  130. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/models.py +0 -0
  131. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/planner.py +0 -0
  132. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
  133. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/resolver.py +0 -0
  134. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/routing.py +0 -0
  135. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/scheduler.py +0 -0
  136. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/synthesis.py +0 -0
  137. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/validation.py +0 -0
  138. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/__init__.py +0 -0
  139. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/_shared.py +0 -0
  140. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  141. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/base.py +0 -0
  142. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/google.py +0 -0
  143. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/ollama.py +0 -0
  144. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/openai.py +0 -0
  145. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/rate_limits.py +0 -0
  146. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/routing.py +0 -0
  147. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/schema_index.py +0 -0
  148. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/settings.py +0 -0
  149. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/signals.py +0 -0
  150. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/system_prompt.py +0 -0
  151. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/tool_metadata.py +0 -0
  152. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/tools.py +0 -0
  153. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/turns.py +0 -0
  154. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/views.py +0 -0
  155. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/conf.py +0 -0
  156. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/dataframes/__init__.py +0 -0
  157. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/dataframes/measurements.py +0 -0
  158. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/__init__.py +0 -0
  159. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/auto_factory.py +0 -0
  160. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/factories.py +0 -0
  161. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/factory_methods.py +0 -0
  162. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/__init__.py +0 -0
  163. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  164. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  165. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/excel.py +0 -0
  166. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  167. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/request.py +0 -0
  168. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  169. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  170. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  171. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  172. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  173. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  174. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  175. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  176. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  177. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  178. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  179. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  180. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  181. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  182. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  183. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  184. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  185. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  186. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  187. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  188. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  189. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  190. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  191. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  192. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  193. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  194. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  195. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  196. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  197. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  198. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  199. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  200. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  201. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel.py +0 -0
  202. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel_store.py +0 -0
  203. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel_workbook.py +0 -0
  204. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  205. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  206. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  207. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
  208. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  209. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/database.py +0 -0
  210. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/excel.py +0 -0
  211. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  212. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  213. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  214. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/request.py +0 -0
  215. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  216. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  217. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  218. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/orm_interface.py +0 -0
  219. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/requests.py +0 -0
  220. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/__init__.py +0 -0
  221. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  222. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/errors.py +0 -0
  223. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/history.py +0 -0
  224. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/models.py +0 -0
  225. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/logging.py +0 -0
  226. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  227. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  228. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  229. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  230. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/search_index.py +0 -0
  231. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
  232. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  233. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/shell.py +0 -0
  234. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  235. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  236. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/__init__.py +0 -0
  237. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/group_manager.py +0 -0
  238. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/input.py +0 -0
  239. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/meta.py +0 -0
  240. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/__init__.py +0 -0
  241. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/measurement.py +0 -0
  242. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/measurement_field.py +0 -0
  243. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/metrics/__init__.py +0 -0
  244. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/metrics/graphql.py +0 -0
  245. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0001_initial.py +0 -0
  246. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  247. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  248. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  249. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  250. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  251. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  252. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  253. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  254. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  255. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  256. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  257. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  258. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/__init__.py +0 -0
  259. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/models.py +0 -0
  260. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/__init__.py +0 -0
  261. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/audit.py +0 -0
  262. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/base_permission.py +0 -0
  263. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  264. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  265. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/mutation_permission.py +0 -0
  266. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/permission_checks.py +0 -0
  267. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  268. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/utils.py +0 -0
  269. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/py.typed +0 -0
  270. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/__init__.py +0 -0
  271. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/handler.py +0 -0
  272. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/rule.py +0 -0
  273. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/__init__.py +0 -0
  274. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/async_tasks.py +0 -0
  275. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backend.py +0 -0
  276. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backend_registry.py +0 -0
  277. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/__init__.py +0 -0
  278. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/dev.py +0 -0
  279. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/meilisearch.py +0 -0
  280. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/opensearch.py +0 -0
  281. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/typesense.py +0 -0
  282. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/checks.py +0 -0
  283. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/config.py +0 -0
  284. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/indexer.py +0 -0
  285. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  286. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/models.py +0 -0
  287. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/reconciliation.py +0 -0
  288. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/registry.py +0 -0
  289. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/tasks.py +0 -0
  290. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/utils.py +0 -0
  291. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/seeding/__init__.py +0 -0
  292. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  293. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/__init__.py +0 -0
  294. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/adapters.py +0 -0
  295. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/checks.py +0 -0
  296. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/config.py +0 -0
  297. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/errors.py +0 -0
  298. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/finalization.py +0 -0
  299. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/graphql.py +0 -0
  300. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/graphql_types.py +0 -0
  301. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/metrics.py +0 -0
  302. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/models.py +0 -0
  303. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/public.py +0 -0
  304. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/s3.py +0 -0
  305. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/services.py +0 -0
  306. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/tokens.py +0 -0
  307. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/types.py +0 -0
  308. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/urls.py +0 -0
  309. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/views.py +0 -0
  310. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/__init__.py +0 -0
  311. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  312. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  313. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_make_cache_key.py +0 -0
  314. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_none_to_zero.py +0 -0
  315. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/filter_parser.py +0 -0
  316. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/format_string.py +0 -0
  317. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/json_encoder.py +0 -0
  318. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/path_mapping.py +0 -0
  319. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/public_api.py +0 -0
  320. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/testing.py +0 -0
  321. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/type_checks.py +0 -0
  322. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/__init__.py +0 -0
  323. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/actions.py +0 -0
  324. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backend_registry.py +0 -0
  325. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  326. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/celery.py +0 -0
  327. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/local.py +0 -0
  328. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  329. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/config.py +0 -0
  330. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/engine.py +0 -0
  331. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/event_registry.py +0 -0
  332. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/events.py +0 -0
  333. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/models.py +0 -0
  334. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/tasks.py +0 -0
  335. {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/telemetry.py +0 -0
  336. {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/test_settings.py +0 -0
  337. {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/test_urls.py +0 -0
  338. {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.80.8
3
+ Version: 0.81.0
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.80.8"
7
+ version = "0.81.0"
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.80.8
3
+ Version: 0.81.0
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
@@ -68,6 +68,7 @@ src/general_manager/bucket/projection.py
68
68
  src/general_manager/bucket/request_bucket.py
69
69
  src/general_manager/cache/__init__.py
70
70
  src/general_manager/cache/_dependency_graph.py
71
+ src/general_manager/cache/batch_refresh.py
71
72
  src/general_manager/cache/cache_decorator.py
72
73
  src/general_manager/cache/cache_tracker.py
73
74
  src/general_manager/cache/data_change_context.py
@@ -181,6 +182,8 @@ src/general_manager/interface/capabilities/existing_model/_compat.py
181
182
  src/general_manager/interface/capabilities/existing_model/resolution.py
182
183
  src/general_manager/interface/capabilities/orm/__init__.py
183
184
  src/general_manager/interface/capabilities/orm/_compat.py
185
+ src/general_manager/interface/capabilities/orm/bulk.py
186
+ src/general_manager/interface/capabilities/orm/create_many.py
184
187
  src/general_manager/interface/capabilities/orm/history.py
185
188
  src/general_manager/interface/capabilities/orm/lifecycle.py
186
189
  src/general_manager/interface/capabilities/orm/mutations.py
@@ -227,6 +230,7 @@ src/general_manager/management/commands/shell.py
227
230
  src/general_manager/management/commands/workflow_drain_outbox.py
228
231
  src/general_manager/management/commands/workflow_replay_dead_letters.py
229
232
  src/general_manager/manager/__init__.py
233
+ src/general_manager/manager/bulk_create.py
230
234
  src/general_manager/manager/general_manager.py
231
235
  src/general_manager/manager/group_manager.py
232
236
  src/general_manager/manager/input.py
@@ -3,11 +3,13 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  __all__ = [
6
+ "BatchRefreshDisconnect",
6
7
  "CacheBackend",
7
8
  "CalculationRunContext",
8
9
  "Dependency",
9
10
  "DependencyTracker",
10
11
  "cached",
12
+ "connect_batch_refresh_receiver",
11
13
  "current_calculation_run_context",
12
14
  "ensure_calculation_run_context",
13
15
  "invalidate_cache_key",
@@ -17,11 +19,13 @@ __all__ = [
17
19
  "serialize_dependency_identifier",
18
20
  ]
19
21
 
22
+ from general_manager.cache.batch_refresh import BatchRefreshDisconnect
20
23
  from general_manager.cache.cache_decorator import CacheBackend
21
24
  from general_manager.cache.run_context import CalculationRunContext
22
25
  from general_manager.cache.dependency_index import Dependency
23
26
  from general_manager.cache.cache_tracker import DependencyTracker
24
27
  from general_manager.cache.cache_decorator import cached
28
+ from general_manager.cache.batch_refresh import connect_batch_refresh_receiver
25
29
  from general_manager.cache.run_context import current_calculation_run_context
26
30
  from general_manager.cache.run_context import ensure_calculation_run_context
27
31
  from general_manager.cache.dependency_index import invalidate_cache_key
@@ -4,7 +4,14 @@ from __future__ import annotations
4
4
 
5
5
  __all__ = [
6
6
  "AdditiveManagerPermission",
7
+ "BatchRefreshDisconnect",
8
+ "BulkCreateEligibility",
7
9
  "CalculationInterface",
10
+ "CreateManyBatchResult",
11
+ "CreateManyError",
12
+ "CreateManyInvalidBatchSizeError",
13
+ "CreateManyPostCommitError",
14
+ "CreateManyUnsupportedError",
8
15
  "DatabaseInterface",
9
16
  "ExcelCharField",
10
17
  "ExcelDecimalField",
@@ -30,8 +37,10 @@ __all__ = [
30
37
  "SearchConfigSpec",
31
38
  "SearchIndexer",
32
39
  "SearchInvalidationRule",
40
+ "bulk_create_eligibility",
33
41
  "configure_search_backend",
34
42
  "configure_search_backend_from_settings",
43
+ "connect_batch_refresh_receiver",
35
44
  "get_logger",
36
45
  "get_search_backend",
37
46
  "graph_ql_mutation",
@@ -45,7 +54,14 @@ __all__ = [
45
54
  from general_manager.permission.manager_based_permission import (
46
55
  AdditiveManagerPermission,
47
56
  )
57
+ from general_manager.cache.batch_refresh import BatchRefreshDisconnect
58
+ from general_manager.interface.capabilities.orm.bulk import BulkCreateEligibility
48
59
  from general_manager.interface.interfaces.calculation import CalculationInterface
60
+ from general_manager.manager.bulk_create import CreateManyBatchResult
61
+ from general_manager.manager.bulk_create import CreateManyError
62
+ from general_manager.manager.bulk_create import CreateManyInvalidBatchSizeError
63
+ from general_manager.manager.bulk_create import CreateManyPostCommitError
64
+ from general_manager.manager.bulk_create import CreateManyUnsupportedError
49
65
  from general_manager.interface.interfaces.database import DatabaseInterface
50
66
  from general_manager.interface.excel import ExcelCharField
51
67
  from general_manager.interface.excel import ExcelDecimalField
@@ -73,10 +89,12 @@ from general_manager.search.config import SearchConfigProtocol
73
89
  from general_manager.search.config import SearchConfigSpec
74
90
  from general_manager.search.indexer import SearchIndexer
75
91
  from general_manager.search.config import SearchInvalidationRule
92
+ from general_manager.interface.capabilities.orm.bulk import bulk_create_eligibility
76
93
  from general_manager.search.backend_registry import configure_search_backend
77
94
  from general_manager.search.backend_registry import (
78
95
  configure_search_backend_from_settings,
79
96
  )
97
+ from general_manager.cache.batch_refresh import connect_batch_refresh_receiver
80
98
  from general_manager.logging import get_logger
81
99
  from general_manager.search.backend_registry import get_search_backend
82
100
  from general_manager.api.mutation import graph_ql_mutation
@@ -3,6 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  __all__ = [
6
+ "CreateManyBatchResult",
7
+ "CreateManyError",
8
+ "CreateManyInvalidBatchSizeError",
9
+ "CreateManyPostCommitError",
10
+ "CreateManyUnsupportedError",
6
11
  "DateRangeDomain",
7
12
  "GeneralManager",
8
13
  "GeneralManagerMeta",
@@ -15,6 +20,11 @@ __all__ = [
15
20
  "graph_ql_property",
16
21
  ]
17
22
 
23
+ from general_manager.manager.bulk_create import CreateManyBatchResult
24
+ from general_manager.manager.bulk_create import CreateManyError
25
+ from general_manager.manager.bulk_create import CreateManyInvalidBatchSizeError
26
+ from general_manager.manager.bulk_create import CreateManyPostCommitError
27
+ from general_manager.manager.bulk_create import CreateManyUnsupportedError
18
28
  from general_manager.manager.input import DateRangeDomain
19
29
  from general_manager.manager.general_manager import GeneralManager
20
30
  from general_manager.manager.meta import GeneralManagerMeta
@@ -2271,12 +2271,22 @@ class GraphQL:
2271
2271
  if identification is not None
2272
2272
  else event_instance.identification
2273
2273
  )
2274
- transaction.on_commit(
2275
- lambda: cls._publish_data_change(
2274
+ from general_manager.manager.bulk_create import current_create_many_batch
2275
+
2276
+ batch = current_create_many_batch(database_alias)
2277
+
2278
+ def callback() -> None:
2279
+ cls._publish_data_change(
2276
2280
  manager_class,
2277
2281
  action,
2278
2282
  event_identification,
2279
- ),
2283
+ )
2284
+
2285
+ if batch is not None and batch.manager_class is manager_class:
2286
+ batch.notification_callbacks.append(callback)
2287
+ return
2288
+ transaction.on_commit(
2289
+ callback,
2280
2290
  using=database_alias,
2281
2291
  )
2282
2292
  finally:
@@ -214,12 +214,22 @@ def emit_remote_invalidation(
214
214
  captured_identification = (
215
215
  deepcopy(event_identification) if event_identification is not None else None
216
216
  )
217
- transaction.on_commit(
218
- lambda: _publish_remote_invalidation(
217
+ from general_manager.manager.bulk_create import current_create_many_batch
218
+
219
+ batch = current_create_many_batch(database_alias)
220
+
221
+ def callback() -> None:
222
+ _publish_remote_invalidation(
219
223
  config,
220
224
  action,
221
225
  captured_identification,
222
- ),
226
+ )
227
+
228
+ if batch is not None and batch.manager_class is sender:
229
+ batch.notification_callbacks.append(callback)
230
+ return
231
+ transaction.on_commit(
232
+ callback,
223
233
  using=database_alias,
224
234
  )
225
235
  finally:
@@ -0,0 +1,139 @@
1
+ """Opt-in refresh callbacks that understand ``GeneralManager.create_many``.
2
+
3
+ The registration point is intentionally separate from the private data-change
4
+ signals. Applications may register a cache or projection refresh without
5
+ having to disconnect framework receivers in order to make an import efficient.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Callable, Mapping
11
+ from copy import deepcopy
12
+ from dataclasses import dataclass
13
+ from types import MappingProxyType
14
+ from typing import TYPE_CHECKING, cast
15
+ from weakref import WeakSet
16
+
17
+ from django.db import transaction
18
+
19
+ from general_manager.cache.signals import post_data_change
20
+
21
+ if TYPE_CHECKING: # pragma: no cover
22
+ from general_manager.manager.bulk_create import CreateManyBatchContext
23
+ from general_manager.manager.general_manager import GeneralManager
24
+
25
+
26
+ BatchRefreshCallback = Callable[
27
+ [type["GeneralManager"], tuple[Mapping[str, object], ...], str, str], None
28
+ ]
29
+ _registered_receivers: WeakSet[Callable[..., None]] = WeakSet()
30
+
31
+
32
+ @dataclass(frozen=True)
33
+ class BatchRefreshDisconnect:
34
+ """A small, idempotent handle returned by batch-refresh registration."""
35
+
36
+ receiver: Callable[..., None]
37
+
38
+ def disconnect(self) -> None:
39
+ """Remove this callback without affecting unrelated signal receivers."""
40
+ post_data_change.disconnect(self.receiver)
41
+
42
+ def __call__(self) -> None:
43
+ self.disconnect()
44
+
45
+
46
+ def connect_batch_refresh_receiver(
47
+ callback: BatchRefreshCallback,
48
+ *,
49
+ on_commit: bool = False,
50
+ ) -> BatchRefreshDisconnect:
51
+ """Register a cache refresh callback for ordinary and batched mutations.
52
+
53
+ Callbacks run inside the mutation transaction by default. Passing
54
+ ``on_commit=True`` defers ordinary changes and a successfully committed
55
+ ``create_many`` batch until its transaction is durable. A bulk SQL batch
56
+ records all identifiers and invokes a registered callback once; canonical
57
+ row-by-row batches deliberately retain their ordinary per-row timing.
58
+ Identifications are full, read-only mapping snapshots, including composite
59
+ keys. Missing identification mappings are rejected instead of losing keys.
60
+ """
61
+
62
+ def receiver(
63
+ sender: type["GeneralManager"],
64
+ *,
65
+ identification: Mapping[str, object] | None = None,
66
+ instance: object | None = None,
67
+ action: str | None = None,
68
+ database_alias: str = "default",
69
+ **_: object,
70
+ ) -> None:
71
+ if action not in {"create", "update", "delete"}:
72
+ return
73
+ from general_manager.manager.bulk_create import current_create_many_batch
74
+
75
+ batch = current_create_many_batch(database_alias)
76
+ identification_value = identification
77
+ if identification_value is None and instance is not None:
78
+ identification_value = getattr(instance, "identification", None)
79
+ if not isinstance(identification_value, Mapping):
80
+ message = "Batch refresh requires an identification mapping."
81
+ raise TypeError(message)
82
+ identification_snapshot = MappingProxyType(deepcopy(dict(identification_value)))
83
+
84
+ def invoke() -> None:
85
+ callback(sender, (identification_snapshot,), action, database_alias)
86
+
87
+ # The SQL path has already performed the publication barrier and asks
88
+ # us to aggregate. Canonical batches keep their legacy receiver timing.
89
+ if (
90
+ batch is not None
91
+ and batch.manager_class is sender
92
+ and getattr(batch, "bulk_sql_active", False)
93
+ ):
94
+ registration = batch.batch_refresh_callbacks.setdefault(
95
+ id(receiver), (callback, on_commit, action, [])
96
+ )
97
+ registration[3].append(identification_snapshot)
98
+ return
99
+
100
+ if on_commit:
101
+ transaction.on_commit(invoke, using=database_alias)
102
+ else:
103
+ invoke()
104
+
105
+ post_data_change.connect(receiver, weak=False)
106
+ _registered_receivers.add(receiver)
107
+ return BatchRefreshDisconnect(receiver)
108
+
109
+
110
+ def flush_batch_refresh_callbacks(context: "CreateManyBatchContext") -> None:
111
+ """Run registered callbacks once after an eligible SQL create batch."""
112
+ callbacks = context.batch_refresh_callbacks
113
+ database_alias = context.database_alias
114
+ sender = cast(type["GeneralManager"], context.manager_class)
115
+ for raw_callback, on_commit, action, identifiers in tuple(callbacks.values()):
116
+ callback = cast(BatchRefreshCallback, raw_callback)
117
+ frozen_ids = tuple(identifiers)
118
+
119
+ def invoke(
120
+ callback: BatchRefreshCallback = callback,
121
+ frozen_ids: tuple[Mapping[str, object], ...] = frozen_ids,
122
+ action: str = action,
123
+ ) -> None:
124
+ callback(sender, frozen_ids, action, database_alias)
125
+
126
+ if on_commit:
127
+ transaction.on_commit(invoke, using=database_alias)
128
+ else:
129
+ invoke()
130
+ callbacks.clear()
131
+
132
+
133
+ def is_batch_refresh_receiver(receiver: object) -> bool:
134
+ """Return whether ``receiver`` is one created by this public helper."""
135
+ try:
136
+ return receiver in _registered_receivers
137
+ except TypeError:
138
+ # Application signal receivers may be callable, unhashable objects.
139
+ return False
@@ -1689,6 +1689,11 @@ def generic_cache_invalidation(
1689
1689
  old_relevant_values (dict[str, object]): Mapping of lookup paths (joined by "__") to their values as captured before the change; used to compare old vs. new values for invalidation decisions.
1690
1690
  database_alias (str): Database alias used to attribute invalidation timing.
1691
1691
  """
1692
+ from general_manager.manager.bulk_create import current_create_many_batch
1693
+
1694
+ batch = current_create_many_batch(database_alias)
1695
+ if batch is not None and batch.manager_class is sender and batch.bulk_sql_active:
1696
+ return
1692
1697
  started = perf_counter()
1693
1698
  try:
1694
1699
  invalidated_cache_keys = _invalidate_manager_cache_for_instance_change(
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from contextlib import nullcontext
5
+ from contextlib import AbstractContextManager, nullcontext
6
6
  from copy import deepcopy
7
7
  from functools import wraps
8
8
  from time import perf_counter
@@ -101,7 +101,7 @@ def data_change(
101
101
  )
102
102
 
103
103
  @wraps(decorator_source)
104
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
104
+ def perform_change(*args: P.args, **kwargs: P.kwargs) -> R:
105
105
  """
106
106
  Emit pre_data_change and post_data_change signals around the wrapped function call.
107
107
 
@@ -124,6 +124,12 @@ def data_change(
124
124
  )
125
125
  from general_manager.cache.run_context import current_calculation_run_context
126
126
  from general_manager.interface.orm_interface import OrmInterfaceBase
127
+ from general_manager.manager.bulk_create import (
128
+ CreateManyUnsupportedError,
129
+ current_create_many_batch,
130
+ enclosing_create_many_batch,
131
+ validate_create_many_history,
132
+ )
127
133
 
128
134
  action = decorator_source.__name__
129
135
  if action == "create":
@@ -140,9 +146,29 @@ def data_change(
140
146
  database_alias = DEFAULT_DB_ALIAS
141
147
  if is_orm_backed:
142
148
  database_alias = getattr(interface, "database", None) or DEFAULT_DB_ALIAS
149
+ batch_envelope = enclosing_create_many_batch()
150
+ if batch_envelope is not None and (
151
+ not is_orm_backed or database_alias != batch_envelope.database_alias
152
+ ):
153
+ raise CreateManyUnsupportedError.routing()
154
+ if batch_envelope is not None:
155
+ validate_create_many_history(getattr(interface, "_model", None))
143
156
  change_context: dict[str, object] = {}
144
157
  signal_kwargs = {
145
- **kwargs,
158
+ **{
159
+ key: value
160
+ for key, value in kwargs.items()
161
+ if key
162
+ not in {
163
+ "sender",
164
+ "signal",
165
+ "instance",
166
+ "action",
167
+ "previous_instance",
168
+ "identification",
169
+ "old_relevant_values",
170
+ }
171
+ },
146
172
  "change_context": change_context,
147
173
  "database_alias": database_alias,
148
174
  }
@@ -159,11 +185,16 @@ def data_change(
159
185
  context.clear_bucket_projections()
160
186
  context.clear_trusted_orm_managers()
161
187
  try:
162
- transaction_context = (
163
- transaction.atomic(using=database_alias)
164
- if is_orm_backed
165
- else nullcontext()
166
- )
188
+ transaction_context: AbstractContextManager[None]
189
+ if not is_orm_backed:
190
+ transaction_context = nullcontext()
191
+ elif current_create_many_batch(database_alias) is None:
192
+ transaction_context = transaction.atomic(using=database_alias)
193
+ else:
194
+ transaction_context = transaction.atomic(
195
+ using=database_alias,
196
+ savepoint=False,
197
+ )
167
198
  caller_in_atomic_block = (
168
199
  _caller_in_atomic_block(database_alias) if is_orm_backed else False
169
200
  )
@@ -322,4 +353,11 @@ def data_change(
322
353
  except Exception:
323
354
  logger.exception("GraphQL warm-up requeue failed.")
324
355
 
356
+ @wraps(decorator_source)
357
+ def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
358
+ from general_manager.manager.bulk_create import create_many_signal_scope
359
+
360
+ with create_many_signal_scope():
361
+ return perform_change(*args, **kwargs)
362
+
325
363
  return wrapper
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
  from abc import ABC
5
- from collections.abc import Awaitable, Mapping
5
+ from collections.abc import Awaitable, Iterator, Mapping
6
6
  from dataclasses import dataclass
7
7
  from functools import wraps
8
8
  import inspect
@@ -31,7 +31,11 @@ from general_manager.as_of import (
31
31
  )
32
32
  from general_manager.utils._args_to_kwargs import args_to_kwargs
33
33
  from general_manager.api.property import GraphQLProperty
34
- from general_manager.interface.capabilities.base import Capability, CapabilityName
34
+ from general_manager.interface.capabilities.base import (
35
+ Capability,
36
+ CapabilityName,
37
+ CreateManyCapability,
38
+ )
35
39
  from general_manager.interface.capabilities.configuration import (
36
40
  CapabilityConfigEntry,
37
41
  InterfaceCapabilityConfig,
@@ -42,6 +46,7 @@ from general_manager.interface.infrastructure.startup_hooks import register_star
42
46
  from general_manager.interface.infrastructure.system_checks import register_system_check
43
47
 
44
48
  if TYPE_CHECKING:
49
+ from general_manager.manager.bulk_create import CreateManyBatchResult
45
50
  from general_manager.manager.input import Input
46
51
  from general_manager.manager.general_manager import GeneralManager
47
52
  from general_manager.bucket.base_bucket import Bucket
@@ -333,7 +338,7 @@ class InterfaceBase(ABC):
333
338
  This method resets per-subclass capability registries and configuration to a clean default, merges configured capability overrides into the class's capability_overrides mapping, and clears the flag that marks configured capabilities as applied. Keyword arguments are forwarded to the superclass implementation.
334
339
  """
335
340
  super().__init_subclass__(**kwargs)
336
- for mutation_name in ("create", "update", "delete"):
341
+ for mutation_name in ("create", "create_many", "update", "delete"):
337
342
  _guard_declared_mutation(cls, mutation_name)
338
343
  cls._input_parsing_plan = None
339
344
  cls._input_dependency_order = None
@@ -1163,6 +1168,50 @@ class InterfaceBase(ABC):
1163
1168
  observer=observer,
1164
1169
  )
1165
1170
 
1171
+ @classmethod
1172
+ def create_many(
1173
+ cls,
1174
+ records: Iterable[Mapping[str, object]],
1175
+ *,
1176
+ manager_class: type[GeneralManager] | None = None,
1177
+ creator_id: int | None = None,
1178
+ history_comment: str | None = None,
1179
+ ignore_permission: bool = False,
1180
+ batch_size: int = 1000,
1181
+ ) -> Iterator[CreateManyBatchResult]:
1182
+ """Dispatch to an optional backend-owned batch capability.
1183
+
1184
+ Without a callable handler this raises CreateManyUnsupportedError before
1185
+ touching records. The handler owns lazy iteration, atomicity, permission,
1186
+ identity, lifecycle and observability guarantees; see CreateManyCapability.
1187
+ A direct interface call uses its owning manager unless explicitly supplied.
1188
+ """
1189
+ from general_manager.manager.bulk_create import (
1190
+ CreateManyInvalidBatchSizeError,
1191
+ CreateManyUnsupportedError,
1192
+ )
1193
+
1194
+ reject_historical_mutation()
1195
+ if (
1196
+ isinstance(batch_size, bool)
1197
+ or not isinstance(batch_size, int)
1198
+ or batch_size <= 0
1199
+ ):
1200
+ raise CreateManyInvalidBatchSizeError
1201
+ handler = cls.get_capability_handler("create_many")
1202
+ if not callable(getattr(handler, "create_many", None)):
1203
+ raise CreateManyUnsupportedError.missing_capability(cls.__name__)
1204
+ owner = manager_class if manager_class is not None else cls._parent_class
1205
+ return cast(CreateManyCapability, handler).create_many(
1206
+ cls,
1207
+ records,
1208
+ manager_class=owner,
1209
+ creator_id=creator_id,
1210
+ history_comment=history_comment,
1211
+ ignore_permission=ignore_permission,
1212
+ batch_size=batch_size,
1213
+ )
1214
+
1166
1215
  def update(self, *args: object, **kwargs: object) -> object:
1167
1216
  """
1168
1217
  Update the underlying managed record.
@@ -2,6 +2,9 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from general_manager.interface.capabilities.orm.create_many import (
6
+ OrmCreateManyCapability,
7
+ )
5
8
  from general_manager.interface.capabilities.configuration import (
6
9
  CapabilitySet,
7
10
  InterfaceCapabilityConfig,
@@ -51,6 +54,7 @@ ORM_WRITABLE_CAPABILITIES: CapabilitySet = CapabilitySet(
51
54
  *ORM_PERSISTENCE_CAPABILITIES.entries,
52
55
  InterfaceCapabilityConfig(OrmMutationCapability),
53
56
  InterfaceCapabilityConfig(OrmCreateCapability),
57
+ InterfaceCapabilityConfig(OrmCreateManyCapability),
54
58
  InterfaceCapabilityConfig(OrmUpdateCapability),
55
59
  InterfaceCapabilityConfig(OrmDeleteCapability),
56
60
  ),
@@ -2,11 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from collections.abc import Iterable, Iterator, Mapping
6
+
5
7
  from typing import ClassVar, Literal, Protocol, TYPE_CHECKING, runtime_checkable
6
8
 
7
9
  CapabilityName = Literal[
8
10
  "read",
9
11
  "create",
12
+ "create_many",
10
13
  "update",
11
14
  "delete",
12
15
  "history",
@@ -37,6 +40,8 @@ Capability names are stable string keys. Interfaces store active names in
37
40
  """
38
41
 
39
42
  if TYPE_CHECKING: # pragma: no cover
43
+ from general_manager.manager.general_manager import GeneralManager
44
+ from general_manager.manager.bulk_create import CreateManyBatchResult
40
45
  from general_manager.interface.base_interface import InterfaceBase
41
46
 
42
47
 
@@ -86,3 +91,33 @@ class Capability(Protocol):
86
91
  Exception: Concrete capability implementations define their own
87
92
  teardown errors, which propagate unchanged.
88
93
  """
94
+
95
+
96
+ class CreateManyCapability(Capability, Protocol):
97
+ """Optional backend batch contract used by InterfaceBase.create_many.
98
+
99
+ A handler validates support before consuming input and returns a lazy,
100
+ bounded iterator. Each batch is atomic, including required history/outbox
101
+ writes; permissions and canonical lifecycle/observability must be preserved
102
+ or an explicitly safe fallback selected. It must recheck historical mutation
103
+ restrictions when the iterator advances. Failed writes and post-commit
104
+ effects remain distinct using CreateManyError/CreateManyPostCommitError.
105
+ Results carry backend-defined opaque ids (including complete mappings),
106
+ accurate provisional/durable counts and an optional Django database alias.
107
+ A backend unable to provide this contract must reject before consumption;
108
+ there is deliberately no row-by-row non-atomic fallback in the dispatcher.
109
+ """
110
+
111
+ def create_many(
112
+ self,
113
+ interface_cls: type[InterfaceBase],
114
+ records: Iterable[Mapping[str, object]],
115
+ *,
116
+ manager_class: type[GeneralManager],
117
+ creator_id: int | None = None,
118
+ history_comment: str | None = None,
119
+ ignore_permission: bool = False,
120
+ batch_size: int = 1000,
121
+ ) -> Iterator[CreateManyBatchResult]:
122
+ """Return progress only after a whole batch has successfully persisted."""
123
+ ...