GeneralManager 0.82.4__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.4/src/GeneralManager.egg-info → generalmanager-0.83.0}/PKG-INFO +1 -1
  2. {generalmanager-0.82.4 → generalmanager-0.83.0}/pyproject.toml +1 -1
  3. {generalmanager-0.82.4 → generalmanager-0.83.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/SOURCES.txt +2 -0
  5. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/search.py +4 -0
  6. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_search.py +5 -1
  7. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bootstrap.py +1 -1
  8. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/management.py +23 -6
  9. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/search_index.py +2 -12
  10. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/search_reconcile.py +11 -6
  11. generalmanager-0.83.0/src/general_manager/management/commands/sync_read_only.py +169 -0
  12. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/public_api_registry.py +5 -0
  13. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backend.py +7 -2
  14. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/dev.py +36 -1
  15. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/meilisearch.py +106 -13
  16. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/config.py +26 -1
  17. generalmanager-0.83.0/src/general_manager/search/identity.py +287 -0
  18. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/indexer.py +16 -0
  19. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/reconciliation.py +14 -1
  20. {generalmanager-0.82.4 → generalmanager-0.83.0}/LICENSE +0 -0
  21. {generalmanager-0.82.4 → generalmanager-0.83.0}/README.md +0 -0
  22. {generalmanager-0.82.4 → generalmanager-0.83.0}/setup.cfg +0 -0
  23. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  24. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/requires.txt +0 -0
  25. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  26. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/__init__.py +0 -0
  27. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/__init__.py +0 -0
  28. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/api.py +0 -0
  29. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/bucket.py +0 -0
  30. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/cache.py +0 -0
  31. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/dataframes.py +0 -0
  32. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/factory.py +0 -0
  33. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/general_manager.py +0 -0
  34. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/interface.py +0 -0
  35. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/manager.py +0 -0
  36. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/measurement.py +0 -0
  37. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/permission.py +0 -0
  38. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/rule.py +0 -0
  39. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/utils.py +0 -0
  40. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/__init__.py +0 -0
  41. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql.py +0 -0
  42. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_as_of.py +0 -0
  43. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_errors.py +0 -0
  44. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_groups.py +0 -0
  45. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_identifiers.py +0 -0
  46. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_mutations.py +0 -0
  47. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_ordering.py +0 -0
  48. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_output.py +0 -0
  49. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  50. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_relations.py +0 -0
  51. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  52. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  53. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  54. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_type.py +0 -0
  55. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_view.py +0 -0
  56. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup.py +0 -0
  57. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  58. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  59. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/mutation.py +0 -0
  60. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/notification_batching.py +0 -0
  61. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/property.py +0 -0
  62. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/registry.py +0 -0
  63. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_api.py +0 -0
  64. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation.py +0 -0
  65. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  66. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/apps.py +0 -0
  67. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/as_of.py +0 -0
  68. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/__init__.py +0 -0
  69. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  70. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/_ordering.py +0 -0
  71. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/base_bucket.py +0 -0
  72. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  73. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/database_bucket.py +0 -0
  74. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/excel_bucket.py +0 -0
  75. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/group_bucket.py +0 -0
  76. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/indexing.py +0 -0
  77. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/projection.py +0 -0
  78. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/request_bucket.py +0 -0
  79. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/__init__.py +0 -0
  80. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/_dependency_graph.py +0 -0
  81. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/batch_refresh.py +0 -0
  82. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/cache_decorator.py +0 -0
  83. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/cache_tracker.py +0 -0
  84. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/data_change_context.py +0 -0
  85. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_cache.py +0 -0
  86. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_index.py +0 -0
  87. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_matching.py +0 -0
  88. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_publish.py +0 -0
  89. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_shards.py +0 -0
  90. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  91. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/run_context.py +0 -0
  92. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/run_context_lru.py +0 -0
  93. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/signals.py +0 -0
  94. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/transaction_barrier.py +0 -0
  95. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/__init__.py +0 -0
  96. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/audit.py +0 -0
  97. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/bootstrap.py +0 -0
  98. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/checks.py +0 -0
  99. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/consumer.py +0 -0
  100. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/context.py +0 -0
  101. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/errors.py +0 -0
  102. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/__init__.py +0 -0
  103. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/__main__.py +0 -0
  104. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/baseline.py +0 -0
  105. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  106. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  107. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  108. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  109. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  110. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  111. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  112. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  113. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  114. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  115. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  116. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  117. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  118. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  119. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  120. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/readiness.py +0 -0
  121. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/runner.py +0 -0
  122. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/traces.py +0 -0
  123. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/grounding.py +0 -0
  124. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/models.py +0 -0
  125. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/__init__.py +0 -0
  126. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/budget.py +0 -0
  127. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/calculations.py +0 -0
  128. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/catalog.py +0 -0
  129. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/config.py +0 -0
  130. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/events.py +0 -0
  131. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/evidence.py +0 -0
  132. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/models.py +0 -0
  133. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/planner.py +0 -0
  134. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
  135. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/resolver.py +0 -0
  136. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/routing.py +0 -0
  137. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/scheduler.py +0 -0
  138. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/synthesis.py +0 -0
  139. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/validation.py +0 -0
  140. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/__init__.py +0 -0
  141. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/_shared.py +0 -0
  142. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  143. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/base.py +0 -0
  144. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/google.py +0 -0
  145. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/ollama.py +0 -0
  146. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/openai.py +0 -0
  147. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/rate_limits.py +0 -0
  148. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/routing.py +0 -0
  149. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/schema_index.py +0 -0
  150. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/settings.py +0 -0
  151. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/signals.py +0 -0
  152. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/system_prompt.py +0 -0
  153. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/tool_metadata.py +0 -0
  154. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/tools.py +0 -0
  155. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/turns.py +0 -0
  156. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/views.py +0 -0
  157. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/conf.py +0 -0
  158. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/dataframes/__init__.py +0 -0
  159. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/dataframes/measurements.py +0 -0
  160. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/__init__.py +0 -0
  161. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/auto_factory.py +0 -0
  162. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/factories.py +0 -0
  163. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/factory_methods.py +0 -0
  164. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/__init__.py +0 -0
  165. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/base_interface.py +0 -0
  166. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  167. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  168. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/database.py +0 -0
  169. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/excel.py +0 -0
  170. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  171. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/request.py +0 -0
  172. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  173. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/base.py +0 -0
  174. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  175. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  176. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  177. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  178. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  179. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  180. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  181. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  182. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  183. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  184. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  185. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  186. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  187. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  188. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  189. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  190. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  191. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  192. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  193. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  194. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  195. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  196. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  197. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  198. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  199. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  200. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  201. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  202. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  203. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  204. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  205. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  206. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  207. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  208. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel.py +0 -0
  209. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel_store.py +0 -0
  210. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel_workbook.py +0 -0
  211. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  212. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  213. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  214. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
  215. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  216. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/database.py +0 -0
  217. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/excel.py +0 -0
  218. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  219. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  220. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  221. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/request.py +0 -0
  222. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  223. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  224. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  225. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  226. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/orm_interface.py +0 -0
  227. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/requests.py +0 -0
  228. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/__init__.py +0 -0
  229. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  230. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/errors.py +0 -0
  231. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/history.py +0 -0
  232. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/models.py +0 -0
  233. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/logging.py +0 -0
  234. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  235. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  236. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  237. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  238. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  239. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/shell.py +0 -0
  240. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  241. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  242. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/__init__.py +0 -0
  243. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/bulk_create.py +0 -0
  244. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/general_manager.py +0 -0
  245. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/group_manager.py +0 -0
  246. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/input.py +0 -0
  247. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/meta.py +0 -0
  248. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/__init__.py +0 -0
  249. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/measurement.py +0 -0
  250. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/measurement_field.py +0 -0
  251. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/metrics/__init__.py +0 -0
  252. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/metrics/graphql.py +0 -0
  253. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0001_initial.py +0 -0
  254. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  255. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  256. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  257. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  258. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  259. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  260. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  261. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  262. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  263. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  264. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  265. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  266. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/__init__.py +0 -0
  267. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/models.py +0 -0
  268. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/__init__.py +0 -0
  269. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/audit.py +0 -0
  270. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/base_permission.py +0 -0
  271. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  272. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  273. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/mutation_permission.py +0 -0
  274. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/permission_checks.py +0 -0
  275. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  276. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/utils.py +0 -0
  277. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/py.typed +0 -0
  278. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/__init__.py +0 -0
  279. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/handler.py +0 -0
  280. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/rule.py +0 -0
  281. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/__init__.py +0 -0
  282. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/async_tasks.py +0 -0
  283. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backend_registry.py +0 -0
  284. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/__init__.py +0 -0
  285. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/opensearch.py +0 -0
  286. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/typesense.py +0 -0
  287. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/checks.py +0 -0
  288. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/invalidation.py +0 -0
  289. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  290. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/models.py +0 -0
  291. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/registry.py +0 -0
  292. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/tasks.py +0 -0
  293. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/utils.py +0 -0
  294. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/seeding/__init__.py +0 -0
  295. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  296. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/__init__.py +0 -0
  297. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/adapters.py +0 -0
  298. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/checks.py +0 -0
  299. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/config.py +0 -0
  300. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/errors.py +0 -0
  301. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/finalization.py +0 -0
  302. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/graphql.py +0 -0
  303. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/graphql_types.py +0 -0
  304. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/metrics.py +0 -0
  305. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/models.py +0 -0
  306. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/public.py +0 -0
  307. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/s3.py +0 -0
  308. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/services.py +0 -0
  309. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/tokens.py +0 -0
  310. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/types.py +0 -0
  311. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/urls.py +0 -0
  312. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/views.py +0 -0
  313. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/__init__.py +0 -0
  314. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  315. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  316. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_make_cache_key.py +0 -0
  317. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_none_to_zero.py +0 -0
  318. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/filter_parser.py +0 -0
  319. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/format_string.py +0 -0
  320. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/json_encoder.py +0 -0
  321. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/path_mapping.py +0 -0
  322. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/public_api.py +0 -0
  323. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/testing.py +0 -0
  324. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/type_checks.py +0 -0
  325. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/__init__.py +0 -0
  326. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/actions.py +0 -0
  327. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backend_registry.py +0 -0
  328. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  329. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/celery.py +0 -0
  330. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/local.py +0 -0
  331. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  332. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/config.py +0 -0
  333. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/engine.py +0 -0
  334. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/event_registry.py +0 -0
  335. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/events.py +0 -0
  336. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/models.py +0 -0
  337. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/signal_bridge.py +0 -0
  338. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/tasks.py +0 -0
  339. {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/telemetry.py +0 -0
  340. {generalmanager-0.82.4 → generalmanager-0.83.0}/tests/test_settings.py +0 -0
  341. {generalmanager-0.82.4 → generalmanager-0.83.0}/tests/test_urls.py +0 -0
  342. {generalmanager-0.82.4 → 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.4
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.4"
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.4
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
@@ -274,6 +275,7 @@ src/general_manager/search/backend.py
274
275
  src/general_manager/search/backend_registry.py
275
276
  src/general_manager/search/checks.py
276
277
  src/general_manager/search/config.py
278
+ src/general_manager/search/identity.py
277
279
  src/general_manager/search/indexer.py
278
280
  src/general_manager/search/invalidation.py
279
281
  src/general_manager/search/m2m_invalidation.py
@@ -18,10 +18,12 @@ __all__ = [
18
18
  "SearchConfigSpec",
19
19
  "SearchDocument",
20
20
  "SearchHit",
21
+ "SearchIdentityFilterGroup",
21
22
  "SearchIndexer",
22
23
  "SearchInvalidationRule",
23
24
  "SearchResult",
24
25
  "TypesenseBackend",
26
+ "build_search_filters",
25
27
  "configure_search_backend",
26
28
  "configure_search_backend_from_settings",
27
29
  "get_search_backend",
@@ -44,10 +46,12 @@ from general_manager.search.config import SearchConfigProtocol
44
46
  from general_manager.search.config import SearchConfigSpec
45
47
  from general_manager.search.backend import SearchDocument
46
48
  from general_manager.search.backend import SearchHit
49
+ from general_manager.search.identity import SearchIdentityFilterGroup
47
50
  from general_manager.search.indexer import SearchIndexer
48
51
  from general_manager.search.config import SearchInvalidationRule
49
52
  from general_manager.search.backend import SearchResult
50
53
  from general_manager.search.backends.typesense import TypesenseBackend
54
+ from general_manager.search.identity import build_search_filters
51
55
  from general_manager.search.backend_registry import configure_search_backend
52
56
  from general_manager.search.backend_registry import (
53
57
  configure_search_backend_from_settings,
@@ -41,6 +41,7 @@ from general_manager.measurement.measurement import Measurement
41
41
  from general_manager.utils.type_checks import safe_issubclass
42
42
  from general_manager.search.backend_registry import get_search_backend
43
43
  from general_manager.search.backend import SearchHit
44
+ from general_manager.search.identity import SearchFilters, build_search_filters
44
45
  from general_manager.search.registry import (
45
46
  get_search_config,
46
47
  get_type_label,
@@ -1257,7 +1258,7 @@ def register_search_query(
1257
1258
  permission_plan,
1258
1259
  backend_shape=backend_shape,
1259
1260
  )
1260
- filter_groups = (
1261
+ filter_groups: SearchFilters = (
1261
1262
  manager_filters or None
1262
1263
  if decision == "allow_all"
1263
1264
  else merge_permission_filters(
@@ -1265,6 +1266,9 @@ def register_search_query(
1265
1266
  permission_plan.filters,
1266
1267
  )
1267
1268
  )
1269
+ filter_groups = build_search_filters(
1270
+ manager_class, index_name, filter_groups
1271
+ )
1268
1272
  total_hits_for_manager = 0
1269
1273
  candidate_hits_for_manager = 0
1270
1274
  offset_cursor = 0
@@ -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)
@@ -9,9 +9,8 @@ from django.core.management.base import BaseCommand
9
9
 
10
10
  from general_manager.logging import get_logger
11
11
  from general_manager.search.backend_registry import get_search_backend
12
- from general_manager.search.indexer import SearchIndexer
12
+ from general_manager.search.indexer import SearchIndexer, _ensure_index
13
13
  from general_manager.search.registry import (
14
- collect_index_settings,
15
14
  get_index_names,
16
15
  iter_searchable_managers,
17
16
  )
@@ -99,16 +98,7 @@ class Command(BaseCommand):
99
98
  target_indexes = get_index_names()
100
99
 
101
100
  for index_name in sorted(target_indexes):
102
- settings_payload = collect_index_settings(index_name)
103
- backend.ensure_index(
104
- index_name,
105
- {
106
- "searchable_fields": settings_payload.searchable_fields,
107
- "filterable_fields": settings_payload.filterable_fields,
108
- "sortable_fields": settings_payload.sortable_fields,
109
- "field_boosts": settings_payload.field_boosts,
110
- },
111
- )
101
+ _ensure_index(backend, index_name)
112
102
  logger.info(
113
103
  "search index ensured",
114
104
  context={"index": index_name},
@@ -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
+ )
@@ -793,6 +793,11 @@ RULE_EXPORTS: LazyExportMap = {
793
793
  }
794
794
 
795
795
  SEARCH_EXPORTS: LazyExportMap = {
796
+ "SearchIdentityFilterGroup": (
797
+ "general_manager.search.identity",
798
+ "SearchIdentityFilterGroup",
799
+ ),
800
+ "build_search_filters": ("general_manager.search.identity", "build_search_filters"),
796
801
  "FieldConfig": ("general_manager.search.config", "FieldConfig"),
797
802
  "IndexConfig": ("general_manager.search.config", "IndexConfig"),
798
803
  "SearchConfigProtocol": ("general_manager.search.config", "SearchConfigProtocol"),
@@ -2,8 +2,9 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import builtins
5
6
  from collections.abc import Mapping, Sequence
6
- from dataclasses import dataclass
7
+ from dataclasses import dataclass, field
7
8
  from typing import Protocol, runtime_checkable
8
9
 
9
10
 
@@ -20,7 +21,10 @@ class SearchDocument:
20
21
  protocol does not require adapters to reject mismatches between
21
22
  `document.index` and an `index_name` argument. `data` contains
22
23
  searchable/stored fields. `field_boosts` and `index_boost` are hints for
23
- adapters that support weighted matching. The payload mappings, including
24
+ adapters that support weighted matching. `identity_fields` maps explicit
25
+ identity names to native scalar types (`int`, `str`, or `UUID`), including
26
+ nullable/collection element types. It never coerces document values.
27
+ The payload mappings, including
24
28
  `identification`, are not copied by the model; callers should treat them as
25
29
  immutable after handing them to a backend. Dataclass field annotations are
26
30
  the validation boundary; this model does not coerce or validate runtime
@@ -36,6 +40,7 @@ class SearchDocument:
36
40
  data: Mapping[str, object]
37
41
  field_boosts: Mapping[str, float]
38
42
  index_boost: float | None = None
43
+ identity_fields: Mapping[str, builtins.type] = field(default_factory=dict)
39
44
 
40
45
 
41
46
  @dataclass(frozen=True)
@@ -10,6 +10,11 @@ from threading import RLock
10
10
  from general_manager.search.backend import SearchDocument, SearchHit, SearchResult
11
11
  from general_manager.bucket._ordering import normalize_ordering, sort_items
12
12
  from general_manager.utils.filter_parser import apply_lookup
13
+ from general_manager.search.identity import (
14
+ SearchIdentityFilterGroup,
15
+ identity_lookup,
16
+ canonical_identity,
17
+ )
13
18
 
14
19
 
15
20
  @dataclass
@@ -176,6 +181,10 @@ class DevSearchBackend:
176
181
  case-sensitive, missing fields behave like `None`, incompatible
177
182
  mixed-type comparisons and invalid lookup/value combinations
178
183
  return `False`, and `None` compares only through `exact`.
184
+ Explicit `SearchIdentityFilterGroup` equality/membership uses
185
+ native casts and owner scope without changing these operator
186
+ rules. Matching document metadata and a present field are
187
+ required. Plain mappings retain raw comparisons.
179
188
  filter_expression (str | None): Unsupported in this backend; passing a value raises NotImplementedError.
180
189
  sort (Sequence[str] | None): Signed document data field names.
181
190
  Prefix a field with ``-`` for descending order. If omitted,
@@ -392,12 +401,38 @@ class DevSearchBackend:
392
401
  if not all(isinstance(group, Mapping) for group in filters):
393
402
  return False
394
403
  return any(self._passes_filters(document, group) for group in filters)
404
+ if isinstance(filters, SearchIdentityFilterGroup):
405
+ if filters.type_label is not None and document.type != filters.type_label:
406
+ return False
395
407
  for key, value in filters.items():
396
- if "__" in key:
408
+ identity = None
409
+ if isinstance(filters, SearchIdentityFilterGroup):
410
+ identity = identity_lookup(key, filters.identity_fields)
411
+ if identity is not None:
412
+ field_name, lookup, native_type = identity
413
+ if (
414
+ field_name not in document.data
415
+ or document.identity_fields.get(field_name) is not native_type
416
+ ):
417
+ return False
418
+ elif "__" in key:
397
419
  field_name, lookup = key.split("__", 1)
398
420
  else:
399
421
  field_name, lookup = key, "exact"
400
422
  doc_value = document.data.get(field_name)
423
+ if identity is not None and (
424
+ lookup != "in" or isinstance(value, (list, tuple, set))
425
+ ):
426
+ doc_value = (
427
+ [canonical_identity(native_type, item) for item in doc_value]
428
+ if isinstance(doc_value, (list, tuple, set))
429
+ else canonical_identity(native_type, doc_value)
430
+ )
431
+ value = (
432
+ [canonical_identity(native_type, item) for item in value]
433
+ if isinstance(value, (list, tuple, set))
434
+ else canonical_identity(native_type, value)
435
+ )
401
436
  if lookup == "exact" and isinstance(value, (list, tuple, set)):
402
437
  if isinstance(doc_value, (list, tuple, set)):
403
438
  if not set(doc_value).intersection(value):