GeneralManager 0.82.5__tar.gz → 0.83.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 (342) hide show
  1. {generalmanager-0.82.5/src/GeneralManager.egg-info → generalmanager-0.83.0}/PKG-INFO +1 -1
  2. {generalmanager-0.82.5 → generalmanager-0.83.0}/pyproject.toml +1 -1
  3. {generalmanager-0.82.5 → generalmanager-0.83.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/GeneralManager.egg-info/SOURCES.txt +1 -0
  5. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bootstrap.py +1 -1
  6. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/management.py +23 -6
  7. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/search_reconcile.py +11 -6
  8. generalmanager-0.83.0/src/general_manager/management/commands/sync_read_only.py +169 -0
  9. {generalmanager-0.82.5 → generalmanager-0.83.0}/LICENSE +0 -0
  10. {generalmanager-0.82.5 → generalmanager-0.83.0}/README.md +0 -0
  11. {generalmanager-0.82.5 → generalmanager-0.83.0}/setup.cfg +0 -0
  12. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  13. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/GeneralManager.egg-info/requires.txt +0 -0
  14. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  15. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/__init__.py +0 -0
  16. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/__init__.py +0 -0
  17. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/api.py +0 -0
  18. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/bucket.py +0 -0
  19. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/cache.py +0 -0
  20. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/dataframes.py +0 -0
  21. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/factory.py +0 -0
  22. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/general_manager.py +0 -0
  23. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/interface.py +0 -0
  24. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/manager.py +0 -0
  25. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/measurement.py +0 -0
  26. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/permission.py +0 -0
  27. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/rule.py +0 -0
  28. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/search.py +0 -0
  29. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/_types/utils.py +0 -0
  30. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/__init__.py +0 -0
  31. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql.py +0 -0
  32. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_as_of.py +0 -0
  33. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_errors.py +0 -0
  34. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_groups.py +0 -0
  35. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_identifiers.py +0 -0
  36. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_mutations.py +0 -0
  37. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_ordering.py +0 -0
  38. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_output.py +0 -0
  39. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  40. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_relations.py +0 -0
  41. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  42. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_search.py +0 -0
  43. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  44. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  45. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_type.py +0 -0
  46. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_view.py +0 -0
  47. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup.py +0 -0
  48. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  49. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  50. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/mutation.py +0 -0
  51. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/notification_batching.py +0 -0
  52. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/property.py +0 -0
  53. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/registry.py +0 -0
  54. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/remote_api.py +0 -0
  55. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation.py +0 -0
  56. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  57. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/apps.py +0 -0
  58. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/as_of.py +0 -0
  59. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/__init__.py +0 -0
  60. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  61. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/_ordering.py +0 -0
  62. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/base_bucket.py +0 -0
  63. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  64. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/database_bucket.py +0 -0
  65. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/excel_bucket.py +0 -0
  66. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/group_bucket.py +0 -0
  67. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/indexing.py +0 -0
  68. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/projection.py +0 -0
  69. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/bucket/request_bucket.py +0 -0
  70. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/__init__.py +0 -0
  71. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/_dependency_graph.py +0 -0
  72. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/batch_refresh.py +0 -0
  73. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/cache_decorator.py +0 -0
  74. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/cache_tracker.py +0 -0
  75. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/data_change_context.py +0 -0
  76. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/dependency_cache.py +0 -0
  77. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/dependency_index.py +0 -0
  78. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/dependency_matching.py +0 -0
  79. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/dependency_publish.py +0 -0
  80. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/dependency_shards.py +0 -0
  81. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  82. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/run_context.py +0 -0
  83. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/run_context_lru.py +0 -0
  84. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/signals.py +0 -0
  85. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/cache/transaction_barrier.py +0 -0
  86. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/__init__.py +0 -0
  87. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/audit.py +0 -0
  88. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/bootstrap.py +0 -0
  89. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/checks.py +0 -0
  90. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/consumer.py +0 -0
  91. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/context.py +0 -0
  92. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/errors.py +0 -0
  93. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/__init__.py +0 -0
  94. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/__main__.py +0 -0
  95. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/baseline.py +0 -0
  96. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  97. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  98. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  99. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  100. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  101. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  102. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  103. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  104. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  105. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  106. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  107. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  108. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  109. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  110. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  111. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/readiness.py +0 -0
  112. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/runner.py +0 -0
  113. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/evals/traces.py +0 -0
  114. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/grounding.py +0 -0
  115. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/models.py +0 -0
  116. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/__init__.py +0 -0
  117. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/budget.py +0 -0
  118. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/calculations.py +0 -0
  119. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/catalog.py +0 -0
  120. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/config.py +0 -0
  121. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/events.py +0 -0
  122. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/evidence.py +0 -0
  123. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/models.py +0 -0
  124. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/planner.py +0 -0
  125. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
  126. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/resolver.py +0 -0
  127. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/routing.py +0 -0
  128. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/scheduler.py +0 -0
  129. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/synthesis.py +0 -0
  130. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/planned/validation.py +0 -0
  131. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/__init__.py +0 -0
  132. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/_shared.py +0 -0
  133. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  134. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/base.py +0 -0
  135. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/google.py +0 -0
  136. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/ollama.py +0 -0
  137. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/providers/openai.py +0 -0
  138. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/rate_limits.py +0 -0
  139. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/routing.py +0 -0
  140. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/schema_index.py +0 -0
  141. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/settings.py +0 -0
  142. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/signals.py +0 -0
  143. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/system_prompt.py +0 -0
  144. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/tool_metadata.py +0 -0
  145. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/tools.py +0 -0
  146. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/turns.py +0 -0
  147. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/chat/views.py +0 -0
  148. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/conf.py +0 -0
  149. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/dataframes/__init__.py +0 -0
  150. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/dataframes/measurements.py +0 -0
  151. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/factory/__init__.py +0 -0
  152. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/factory/auto_factory.py +0 -0
  153. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/factory/factories.py +0 -0
  154. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/factory/factory_methods.py +0 -0
  155. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/__init__.py +0 -0
  156. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/base_interface.py +0 -0
  157. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  158. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  159. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/database.py +0 -0
  160. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/excel.py +0 -0
  161. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  162. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/bundles/request.py +0 -0
  163. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  164. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/base.py +0 -0
  165. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  166. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  167. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  168. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  169. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  170. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  171. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  172. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  173. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  174. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  175. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  176. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  177. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  178. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  179. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  180. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  181. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  182. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  183. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  184. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  185. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  186. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  187. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  188. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  189. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  190. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  191. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  192. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  193. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  194. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  195. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  196. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  197. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  198. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  199. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/excel.py +0 -0
  200. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/excel_store.py +0 -0
  201. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/excel_workbook.py +0 -0
  202. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  203. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  204. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  205. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
  206. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  207. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/database.py +0 -0
  208. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/excel.py +0 -0
  209. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  210. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  211. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  212. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/request.py +0 -0
  213. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  214. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  215. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  216. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  217. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/orm_interface.py +0 -0
  218. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/requests.py +0 -0
  219. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/utils/__init__.py +0 -0
  220. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  221. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/utils/errors.py +0 -0
  222. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/utils/history.py +0 -0
  223. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/interface/utils/models.py +0 -0
  224. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/logging.py +0 -0
  225. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  226. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  227. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  228. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  229. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/search_index.py +0 -0
  230. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  231. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/shell.py +0 -0
  232. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  233. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  234. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/__init__.py +0 -0
  235. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/bulk_create.py +0 -0
  236. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/general_manager.py +0 -0
  237. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/group_manager.py +0 -0
  238. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/input.py +0 -0
  239. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/manager/meta.py +0 -0
  240. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/measurement/__init__.py +0 -0
  241. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/measurement/measurement.py +0 -0
  242. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/measurement/measurement_field.py +0 -0
  243. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/metrics/__init__.py +0 -0
  244. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/metrics/graphql.py +0 -0
  245. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0001_initial.py +0 -0
  246. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  247. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  248. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  249. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  250. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  251. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  252. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  253. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  254. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  255. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  256. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  257. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  258. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/migrations/__init__.py +0 -0
  259. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/models.py +0 -0
  260. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/__init__.py +0 -0
  261. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/audit.py +0 -0
  262. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/base_permission.py +0 -0
  263. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  264. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  265. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/mutation_permission.py +0 -0
  266. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/permission_checks.py +0 -0
  267. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  268. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/permission/utils.py +0 -0
  269. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/public_api_registry.py +0 -0
  270. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/py.typed +0 -0
  271. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/rule/__init__.py +0 -0
  272. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/rule/handler.py +0 -0
  273. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/rule/rule.py +0 -0
  274. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/__init__.py +0 -0
  275. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/async_tasks.py +0 -0
  276. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backend.py +0 -0
  277. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backend_registry.py +0 -0
  278. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backends/__init__.py +0 -0
  279. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backends/dev.py +0 -0
  280. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backends/meilisearch.py +0 -0
  281. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backends/opensearch.py +0 -0
  282. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/backends/typesense.py +0 -0
  283. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/checks.py +0 -0
  284. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/config.py +0 -0
  285. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/identity.py +0 -0
  286. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/indexer.py +0 -0
  287. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/invalidation.py +0 -0
  288. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  289. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/models.py +0 -0
  290. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/reconciliation.py +0 -0
  291. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/registry.py +0 -0
  292. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/tasks.py +0 -0
  293. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/search/utils.py +0 -0
  294. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/seeding/__init__.py +0 -0
  295. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  296. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/__init__.py +0 -0
  297. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/adapters.py +0 -0
  298. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/checks.py +0 -0
  299. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/config.py +0 -0
  300. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/errors.py +0 -0
  301. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/finalization.py +0 -0
  302. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/graphql.py +0 -0
  303. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/graphql_types.py +0 -0
  304. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/metrics.py +0 -0
  305. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/models.py +0 -0
  306. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/public.py +0 -0
  307. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/s3.py +0 -0
  308. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/services.py +0 -0
  309. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/tokens.py +0 -0
  310. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/types.py +0 -0
  311. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/urls.py +0 -0
  312. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/uploads/views.py +0 -0
  313. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/__init__.py +0 -0
  314. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  315. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  316. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/_make_cache_key.py +0 -0
  317. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/_none_to_zero.py +0 -0
  318. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/filter_parser.py +0 -0
  319. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/format_string.py +0 -0
  320. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/json_encoder.py +0 -0
  321. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/path_mapping.py +0 -0
  322. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/public_api.py +0 -0
  323. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/testing.py +0 -0
  324. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/utils/type_checks.py +0 -0
  325. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/__init__.py +0 -0
  326. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/actions.py +0 -0
  327. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/backend_registry.py +0 -0
  328. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  329. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/backends/celery.py +0 -0
  330. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/backends/local.py +0 -0
  331. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  332. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/config.py +0 -0
  333. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/engine.py +0 -0
  334. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/event_registry.py +0 -0
  335. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/events.py +0 -0
  336. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/models.py +0 -0
  337. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/signal_bridge.py +0 -0
  338. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/tasks.py +0 -0
  339. {generalmanager-0.82.5 → generalmanager-0.83.0}/src/general_manager/workflow/telemetry.py +0 -0
  340. {generalmanager-0.82.5 → generalmanager-0.83.0}/tests/test_settings.py +0 -0
  341. {generalmanager-0.82.5 → generalmanager-0.83.0}/tests/test_urls.py +0 -0
  342. {generalmanager-0.82.5 → generalmanager-0.83.0}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.82.5
3
+ Version: 0.83.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.82.5"
7
+ version = "0.83.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.82.5
3
+ Version: 0.83.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
@@ -229,6 +229,7 @@ src/general_manager/management/commands/search_index.py
229
229
  src/general_manager/management/commands/search_reconcile.py
230
230
  src/general_manager/management/commands/seed_manager_landscape.py
231
231
  src/general_manager/management/commands/shell.py
232
+ src/general_manager/management/commands/sync_read_only.py
232
233
  src/general_manager/management/commands/workflow_drain_outbox.py
233
234
  src/general_manager/management/commands/workflow_replay_dead_letters.py
234
235
  src/general_manager/manager/__init__.py
@@ -191,7 +191,7 @@ def install_startup_hook_runner() -> None:
191
191
  ) -> None:
192
192
  run_main = os.environ.get("RUN_MAIN") == "true"
193
193
  command = argv[1] if len(argv) > 1 else None
194
- should_run_hooks = command != "runserver" or run_main
194
+ should_run_hooks = command != "runserver" or run_main or "--noreload" in argv
195
195
  hooks_registry = registered_startup_hook_entries() if should_run_hooks else {}
196
196
  if hooks_registry:
197
197
  resolver_groups: list[
@@ -3,12 +3,14 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import json
6
- from collections.abc import Callable, Sequence
7
- from contextlib import AbstractContextManager
6
+ from collections.abc import Callable, Iterator, Sequence
7
+ from contextlib import AbstractContextManager, contextmanager
8
+ from contextvars import ContextVar
8
9
  from hashlib import sha256
9
10
  from typing import TYPE_CHECKING, ClassVar, Protocol, TypeVar, cast
10
11
 
11
12
  from django.core.checks import Warning
13
+ from django.conf import settings
12
14
  from django.db import (
13
15
  IntegrityError,
14
16
  connection as django_connection,
@@ -44,6 +46,19 @@ from ._types import (
44
46
  )
45
47
 
46
48
  logger = get_logger("interface.read_only")
49
+ _automatic_sync_suppressed: ContextVar[bool] = ContextVar(
50
+ "read_only_automatic_sync_suppressed", default=False
51
+ )
52
+
53
+
54
+ @contextmanager
55
+ def _suppress_automatic_sync() -> Iterator[None]:
56
+ """Let explicit CLI maintenance own sync while other startup hooks still run."""
57
+ token = _automatic_sync_suppressed.set(True)
58
+ try:
59
+ yield
60
+ finally:
61
+ _automatic_sync_suppressed.reset(token)
47
62
 
48
63
 
49
64
  class _ColumnDescription(Protocol):
@@ -1156,9 +1171,9 @@ class ReadOnlyManagementCapability(BaseCapability):
1156
1171
  returned. The registered hook catches `MissingReadOnlyBindingError`
1157
1172
  only to tolerate binding metadata becoming unavailable between
1158
1173
  registration and startup execution; other sync errors propagate.
1159
- Automatic synchronization is skipped when `READ_ONLY_SYNC_ON_STARTUP`
1160
- is disabled in GeneralManager settings. Explicit `sync_data()` calls
1161
- remain available.
1174
+ Automatic synchronization uses `READ_ONLY_SYNC_ON_STARTUP`, falling
1175
+ back to Django `DEBUG` when unset. Explicit `sync_data()` calls remain
1176
+ available regardless of that setting.
1162
1177
 
1163
1178
  Parameters:
1164
1179
  interface_cls: Interface class used to derive the bound manager and model.
@@ -1192,7 +1207,9 @@ class ReadOnlyManagementCapability(BaseCapability):
1192
1207
  binding is not available (raises MissingReadOnlyBindingError), logs a debug
1193
1208
  message and returns without raising.
1194
1209
  """
1195
- if not get_setting("READ_ONLY_SYNC_ON_STARTUP", True):
1210
+ if _automatic_sync_suppressed.get() or not get_setting(
1211
+ "READ_ONLY_SYNC_ON_STARTUP", settings.DEBUG
1212
+ ):
1196
1213
  return
1197
1214
  try:
1198
1215
  self.sync_data(interface_cls)
@@ -92,13 +92,18 @@ class Command(BaseCommand):
92
92
 
93
93
  while True:
94
94
  result = reconcile_search_indexes(force=force, max_states=max_states)
95
- self.stdout.write(
96
- self.style.SUCCESS(
97
- "Reconciled "
98
- f"{result.reconciled} search index states "
99
- f"({result.documents} documents, {result.failed} failures)."
100
- )
95
+ summary = (
96
+ "Reconciled "
97
+ f"{result.reconciled} search index states "
98
+ f"({result.documents} documents, {result.failed} failures)."
101
99
  )
100
+ if result.failed:
101
+ self.stderr.write(self.style.ERROR(summary))
102
+ if once:
103
+ message = "Search reconciliation failed; inspect logs and SearchIndexState.last_error."
104
+ raise CommandError(message)
105
+ else:
106
+ self.stdout.write(self.style.SUCCESS(summary))
102
107
  if once:
103
108
  return
104
109
  force = False
@@ -0,0 +1,169 @@
1
+ """Explicit deployment maintenance for registered read-only managers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from argparse import ArgumentParser
6
+ from collections.abc import Iterable, Sequence
7
+ from typing import cast
8
+
9
+ from django.core.management.base import BaseCommand, CommandError
10
+ from django.db import connections
11
+
12
+ from general_manager.interface.capabilities.read_only.management import (
13
+ ReadOnlyManagementCapability,
14
+ _ReadOnlyInterface,
15
+ _SchemaConnection,
16
+ _suppress_automatic_sync,
17
+ )
18
+ from general_manager.interface.infrastructure.startup_hooks import (
19
+ order_interfaces_by_dependency,
20
+ )
21
+ from general_manager.manager.meta import GeneralManagerMeta
22
+
23
+
24
+ def _manager_path(interface: _ReadOnlyInterface) -> str:
25
+ """Identify a bound manager without importing arbitrary selector input."""
26
+ manager = interface._parent_class
27
+ return f"{manager.__module__}.{manager.__qualname__}"
28
+
29
+
30
+ def _capability(interface: _ReadOnlyInterface) -> ReadOnlyManagementCapability:
31
+ """Use the manager's configured management capability, including overrides."""
32
+ return cast(
33
+ ReadOnlyManagementCapability,
34
+ interface.require_capability(
35
+ "read_only_management", expected_type=ReadOnlyManagementCapability
36
+ ),
37
+ )
38
+
39
+
40
+ def _select_interfaces(value: object) -> list[_ReadOnlyInterface]:
41
+ """Validate selectors and include transitive read-only relation dependencies."""
42
+ interfaces = list(
43
+ dict.fromkeys(
44
+ cast(_ReadOnlyInterface, manager.Interface)
45
+ for manager in GeneralManagerMeta.all_classes
46
+ if getattr(manager.Interface, "_interface_type", None) == "readonly"
47
+ )
48
+ )
49
+ if value is None:
50
+ selected = interfaces
51
+ else:
52
+ selectors: tuple[object, ...]
53
+ if isinstance(value, str):
54
+ selectors = (value,)
55
+ elif isinstance(value, Iterable):
56
+ selectors = tuple(value)
57
+ else:
58
+ selectors = ()
59
+ if not selectors or any(
60
+ not isinstance(selector, str) or not selector for selector in selectors
61
+ ):
62
+ message = "--manager must contain one or more nonempty manager names."
63
+ raise CommandError(message)
64
+ selected = []
65
+ for selector in selectors:
66
+ matches = [
67
+ interface
68
+ for interface in interfaces
69
+ if selector
70
+ in (interface._parent_class.__name__, _manager_path(interface))
71
+ ]
72
+ if not matches:
73
+ message = f"Unknown read-only manager: {selector}."
74
+ raise CommandError(message)
75
+ if len(matches) > 1:
76
+ paths = ", ".join(sorted(_manager_path(item) for item in matches))
77
+ message = (
78
+ f"Ambiguous read-only manager {selector}; use one of: {paths}."
79
+ )
80
+ raise CommandError(message)
81
+ if matches[0] not in selected:
82
+ selected.append(matches[0])
83
+
84
+ dependencies: dict[_ReadOnlyInterface, set[_ReadOnlyInterface]] = {}
85
+ pending = list(selected)
86
+ while pending:
87
+ interface = pending.pop(0)
88
+ if interface in dependencies:
89
+ continue
90
+ dependencies[interface] = (
91
+ ReadOnlyManagementCapability._related_readonly_interfaces(interface)
92
+ )
93
+ pending.extend(sorted(dependencies[interface], key=_manager_path))
94
+
95
+ interface_list = sorted(dependencies, key=_manager_path)
96
+ ordered = cast(
97
+ list[_ReadOnlyInterface],
98
+ order_interfaces_by_dependency(
99
+ interface_list,
100
+ lambda interface: set(dependencies[cast(_ReadOnlyInterface, interface)]),
101
+ ),
102
+ )
103
+ positions = {interface: index for index, interface in enumerate(ordered)}
104
+ if any(
105
+ positions[dependency] >= positions[interface]
106
+ for interface in ordered
107
+ for dependency in dependencies[interface]
108
+ ):
109
+ message = "Read-only dependency cycle; cannot determine a safe sync order."
110
+ raise CommandError(message)
111
+ return ordered
112
+
113
+
114
+ class Command(BaseCommand):
115
+ help = "Synchronize read-only managers and their dependencies after migrations."
116
+
117
+ def add_arguments(self, parser: ArgumentParser) -> None:
118
+ """Accept repeatable unique class names or module-qualified manager paths."""
119
+ parser.add_argument(
120
+ "--manager",
121
+ action="append",
122
+ dest="managers",
123
+ help="Read-only manager name or module-qualified class path. Repeatable; defaults to all.",
124
+ )
125
+
126
+ def run_from_argv(self, argv: Sequence[str]) -> None:
127
+ """Avoid duplicate automatic read-only sync before this explicit CLI step."""
128
+ with _suppress_automatic_sync():
129
+ super().run_from_argv(argv)
130
+
131
+ def handle(self, *_args: object, **options: object) -> None:
132
+ """Preflight all schemas, then sync in dependency order or fail loudly.
133
+
134
+ No global transaction is added: completed managers may remain synced if
135
+ a later manager fails. Re-running the command converges the payloads.
136
+ """
137
+ interfaces = _select_interfaces(options.get("managers"))
138
+ # The public sync API logs schema warnings and returns without writing.
139
+ # Deployment maintenance must instead fail before claiming success.
140
+ for interface in interfaces:
141
+ try:
142
+ capability = _capability(interface)
143
+ warnings = capability.ensure_schema_is_up_to_date(
144
+ interface,
145
+ interface._parent_class,
146
+ interface._model,
147
+ connection=cast(
148
+ _SchemaConnection,
149
+ connections[capability._database_alias(interface)],
150
+ ),
151
+ )
152
+ except Exception as exc:
153
+ message = f"Read-only schema check failed for {_manager_path(interface)}: {exc}"
154
+ raise CommandError(message) from exc
155
+ if warnings:
156
+ detail = "; ".join(str(warning) for warning in warnings)
157
+ message = f"Read-only schema check failed for {_manager_path(interface)}: {detail}"
158
+ raise CommandError(message)
159
+
160
+ for interface in interfaces:
161
+ try:
162
+ _capability(interface).sync_data(interface, schema_validated=True)
163
+ except Exception as exc:
164
+ message = f"Read-only sync failed for {_manager_path(interface)}: {exc}"
165
+ raise CommandError(message) from exc
166
+ self.stdout.write(f"Synchronized {_manager_path(interface)}.")
167
+ self.stdout.write(
168
+ self.style.SUCCESS(f"Synchronized {len(interfaces)} read-only managers.")
169
+ )
File without changes