GeneralManager 0.86.8__tar.gz → 0.86.10__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 (343) hide show
  1. {generalmanager-0.86.8/src/GeneralManager.egg-info → generalmanager-0.86.10}/PKG-INFO +1 -1
  2. {generalmanager-0.86.8 → generalmanager-0.86.10}/pyproject.toml +1 -1
  3. {generalmanager-0.86.8 → generalmanager-0.86.10/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_resolvers.py +7 -4
  5. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_api.py +145 -18
  6. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/calculation_bucket.py +18 -2
  7. {generalmanager-0.86.8 → generalmanager-0.86.10}/LICENSE +0 -0
  8. {generalmanager-0.86.8 → generalmanager-0.86.10}/README.md +0 -0
  9. {generalmanager-0.86.8 → generalmanager-0.86.10}/setup.cfg +0 -0
  10. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  11. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  12. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/requires.txt +0 -0
  13. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/top_level.txt +0 -0
  14. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/__init__.py +0 -0
  15. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/__init__.py +0 -0
  16. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/api.py +0 -0
  17. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/bucket.py +0 -0
  18. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/cache.py +0 -0
  19. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/dataframes.py +0 -0
  20. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/factory.py +0 -0
  21. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/general_manager.py +0 -0
  22. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/interface.py +0 -0
  23. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/manager.py +0 -0
  24. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/measurement.py +0 -0
  25. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/permission.py +0 -0
  26. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/rule.py +0 -0
  27. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/search.py +0 -0
  28. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/utils.py +0 -0
  29. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/__init__.py +0 -0
  30. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql.py +0 -0
  31. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_as_of.py +0 -0
  32. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_errors.py +0 -0
  33. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_groups.py +0 -0
  34. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_identifiers.py +0 -0
  35. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_mutations.py +0 -0
  36. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_ordering.py +0 -0
  37. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_output.py +0 -0
  38. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_prefetch.py +0 -0
  39. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_relations.py +0 -0
  40. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_search.py +0 -0
  41. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  42. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_subscriptions.py +0 -0
  43. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_type.py +0 -0
  44. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_view.py +0 -0
  45. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup.py +0 -0
  46. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  47. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  48. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/mutation.py +0 -0
  49. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/mutation_controls.py +0 -0
  50. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/notification_batching.py +0 -0
  51. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/property.py +0 -0
  52. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/registry.py +0 -0
  53. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_invalidation.py +0 -0
  54. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_invalidation_client.py +0 -0
  55. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/apps.py +0 -0
  56. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/as_of.py +0 -0
  57. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bootstrap.py +0 -0
  58. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/__init__.py +0 -0
  59. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  60. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/_ordering.py +0 -0
  61. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/base_bucket.py +0 -0
  62. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/database_bucket.py +0 -0
  63. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/excel_bucket.py +0 -0
  64. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/group_bucket.py +0 -0
  65. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/indexing.py +0 -0
  66. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/projection.py +0 -0
  67. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/request_bucket.py +0 -0
  68. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/__init__.py +0 -0
  69. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/_dependency_graph.py +0 -0
  70. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/batch_refresh.py +0 -0
  71. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/cache_decorator.py +0 -0
  72. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/cache_tracker.py +0 -0
  73. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/data_change_context.py +0 -0
  74. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_cache.py +0 -0
  75. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_index.py +0 -0
  76. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_matching.py +0 -0
  77. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_publish.py +0 -0
  78. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_shards.py +0 -0
  79. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/model_dependency_collector.py +0 -0
  80. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/run_context.py +0 -0
  81. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/run_context_lru.py +0 -0
  82. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/signals.py +0 -0
  83. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/transaction_barrier.py +0 -0
  84. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/__init__.py +0 -0
  85. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/audit.py +0 -0
  86. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/bootstrap.py +0 -0
  87. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/checks.py +0 -0
  88. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/consumer.py +0 -0
  89. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/context.py +0 -0
  90. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/errors.py +0 -0
  91. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/__init__.py +0 -0
  92. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/__main__.py +0 -0
  93. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/baseline.py +0 -0
  94. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  95. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  96. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  97. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  98. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  99. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  100. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  101. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/diagnostics.py +0 -0
  102. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/fingerprints.py +0 -0
  103. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/fixtures.py +0 -0
  104. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  105. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  106. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/contract.py +0 -0
  107. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  108. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  109. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/readiness.py +0 -0
  110. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/runner.py +0 -0
  111. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/traces.py +0 -0
  112. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/grounding.py +0 -0
  113. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/models.py +0 -0
  114. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/__init__.py +0 -0
  115. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/budget.py +0 -0
  116. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/calculations.py +0 -0
  117. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/catalog.py +0 -0
  118. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/config.py +0 -0
  119. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/events.py +0 -0
  120. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/evidence.py +0 -0
  121. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/models.py +0 -0
  122. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/planner.py +0 -0
  123. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/provider_calls.py +0 -0
  124. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/resolver.py +0 -0
  125. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/routing.py +0 -0
  126. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/scheduler.py +0 -0
  127. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/synthesis.py +0 -0
  128. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/validation.py +0 -0
  129. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/__init__.py +0 -0
  130. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/_shared.py +0 -0
  131. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/anthropic.py +0 -0
  132. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/base.py +0 -0
  133. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/google.py +0 -0
  134. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/ollama.py +0 -0
  135. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/openai.py +0 -0
  136. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/rate_limits.py +0 -0
  137. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/routing.py +0 -0
  138. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/schema_index.py +0 -0
  139. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/settings.py +0 -0
  140. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/signals.py +0 -0
  141. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/system_prompt.py +0 -0
  142. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/tool_metadata.py +0 -0
  143. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/tools.py +0 -0
  144. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/turns.py +0 -0
  145. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/views.py +0 -0
  146. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/conf.py +0 -0
  147. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/dataframes/__init__.py +0 -0
  148. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/dataframes/measurements.py +0 -0
  149. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/__init__.py +0 -0
  150. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/auto_factory.py +0 -0
  151. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/factories.py +0 -0
  152. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/factory_methods.py +0 -0
  153. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/__init__.py +0 -0
  154. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/base_interface.py +0 -0
  155. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/__init__.py +0 -0
  156. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/calculation.py +0 -0
  157. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/database.py +0 -0
  158. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/excel.py +0 -0
  159. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  160. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/request.py +0 -0
  161. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/__init__.py +0 -0
  162. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/base.py +0 -0
  163. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/builtin.py +0 -0
  164. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  165. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  166. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  167. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  168. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/configuration.py +0 -0
  169. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  170. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  171. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  172. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  173. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  174. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  175. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  176. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/factory.py +0 -0
  177. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  178. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  179. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  180. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  181. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  182. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  183. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  184. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  185. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  186. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  187. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  188. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  189. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  190. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  191. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  192. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  193. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  194. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  195. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/registry.py +0 -0
  196. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  197. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  198. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel.py +0 -0
  199. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel_store.py +0 -0
  200. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel_workbook.py +0 -0
  201. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  202. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  203. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  204. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/__init__.py +0 -0
  205. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/calculation.py +0 -0
  206. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/database.py +0 -0
  207. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/excel.py +0 -0
  208. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  209. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/read_only.py +0 -0
  210. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  211. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/request.py +0 -0
  212. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/__init__.py +0 -0
  213. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  214. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  215. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_models.py +0 -0
  216. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/orm_interface.py +0 -0
  217. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/requests.py +0 -0
  218. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/__init__.py +0 -0
  219. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  220. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/errors.py +0 -0
  221. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/history.py +0 -0
  222. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/models.py +0 -0
  223. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/logging.py +0 -0
  224. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  225. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  226. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  227. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  228. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/search_index.py +0 -0
  229. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/search_reconcile.py +0 -0
  230. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  231. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/shell.py +0 -0
  232. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/sync_read_only.py +0 -0
  233. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  234. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  235. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/__init__.py +0 -0
  236. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/bulk_create.py +0 -0
  237. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/general_manager.py +0 -0
  238. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/group_manager.py +0 -0
  239. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/input.py +0 -0
  240. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/meta.py +0 -0
  241. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/__init__.py +0 -0
  242. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/measurement.py +0 -0
  243. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/measurement_field.py +0 -0
  244. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/metrics/__init__.py +0 -0
  245. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/metrics/graphql.py +0 -0
  246. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0001_initial.py +0 -0
  247. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  248. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  249. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  250. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  251. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  252. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  253. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  254. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  255. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  256. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  257. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  258. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  259. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/__init__.py +0 -0
  260. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/models.py +0 -0
  261. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/__init__.py +0 -0
  262. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/audit.py +0 -0
  263. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/base_permission.py +0 -0
  264. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/graphql_capabilities.py +0 -0
  265. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/manager_based_permission.py +0 -0
  266. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/mutation_permission.py +0 -0
  267. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/permission_checks.py +0 -0
  268. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/permission_data_manager.py +0 -0
  269. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/utils.py +0 -0
  270. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/public_api_registry.py +0 -0
  271. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/py.typed +0 -0
  272. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/__init__.py +0 -0
  273. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/handler.py +0 -0
  274. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/rule.py +0 -0
  275. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/__init__.py +0 -0
  276. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/async_tasks.py +0 -0
  277. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backend.py +0 -0
  278. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backend_registry.py +0 -0
  279. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/__init__.py +0 -0
  280. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/dev.py +0 -0
  281. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/meilisearch.py +0 -0
  282. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/opensearch.py +0 -0
  283. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/typesense.py +0 -0
  284. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/checks.py +0 -0
  285. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/config.py +0 -0
  286. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/identity.py +0 -0
  287. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/indexer.py +0 -0
  288. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/invalidation.py +0 -0
  289. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/m2m_invalidation.py +0 -0
  290. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/models.py +0 -0
  291. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/reconciliation.py +0 -0
  292. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/registry.py +0 -0
  293. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/tasks.py +0 -0
  294. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/utils.py +0 -0
  295. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/seeding/__init__.py +0 -0
  296. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/seeding/manager_landscape.py +0 -0
  297. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/__init__.py +0 -0
  298. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/adapters.py +0 -0
  299. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/checks.py +0 -0
  300. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/config.py +0 -0
  301. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/errors.py +0 -0
  302. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/finalization.py +0 -0
  303. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/graphql.py +0 -0
  304. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/graphql_types.py +0 -0
  305. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/metrics.py +0 -0
  306. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/models.py +0 -0
  307. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/public.py +0 -0
  308. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/s3.py +0 -0
  309. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/services.py +0 -0
  310. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/tokens.py +0 -0
  311. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/types.py +0 -0
  312. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/urls.py +0 -0
  313. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/views.py +0 -0
  314. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/__init__.py +0 -0
  315. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  316. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  317. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_make_cache_key.py +0 -0
  318. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_none_to_zero.py +0 -0
  319. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/filter_parser.py +0 -0
  320. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/format_string.py +0 -0
  321. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/json_encoder.py +0 -0
  322. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/path_mapping.py +0 -0
  323. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/public_api.py +0 -0
  324. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/testing.py +0 -0
  325. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/type_checks.py +0 -0
  326. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/__init__.py +0 -0
  327. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/actions.py +0 -0
  328. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backend_registry.py +0 -0
  329. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/__init__.py +0 -0
  330. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/celery.py +0 -0
  331. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/local.py +0 -0
  332. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/n8n.py +0 -0
  333. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/config.py +0 -0
  334. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/engine.py +0 -0
  335. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/event_registry.py +0 -0
  336. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/events.py +0 -0
  337. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/models.py +0 -0
  338. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/signal_bridge.py +0 -0
  339. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/tasks.py +0 -0
  340. {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/telemetry.py +0 -0
  341. {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/test_settings.py +0 -0
  342. {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/test_urls.py +0 -0
  343. {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.86.8
3
+ Version: 0.86.10
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.86.8"
7
+ version = "0.86.10"
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.86.8
3
+ Version: 0.86.10
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -68,6 +68,9 @@ from general_manager.utils.type_checks import safe_issubclass
68
68
 
69
69
  if TYPE_CHECKING:
70
70
  from graphene import ResolveInfo as GraphQLResolveInfo
71
+ from general_manager.api.graphql_errors import (
72
+ GraphQLResolveInfo as ReadPermissionInfo,
73
+ )
71
74
  from general_manager.permission.base_permission import (
72
75
  BasePermission,
73
76
  ReadPermissionPlan,
@@ -487,7 +490,7 @@ def apply_permission_filters(
487
490
  def apply_read_authorization(
488
491
  queryset: Bucket[GeneralManagerT],
489
492
  general_manager_class: type[GeneralManagerT],
490
- info: GraphQLResolveInfo,
493
+ info: ReadPermissionInfo,
491
494
  *,
492
495
  source: str,
493
496
  ) -> ReadAuthorizationResult[GeneralManagerT]:
@@ -517,7 +520,7 @@ def apply_read_authorization(
517
520
  def finalize_read_authorization(
518
521
  preparation: ReadAuthorizationPreparation[GeneralManagerT],
519
522
  general_manager_class: type[GeneralManagerT],
520
- info: GraphQLResolveInfo,
523
+ info: ReadPermissionInfo,
521
524
  *,
522
525
  source: str,
523
526
  ) -> ReadAuthorizationResult[GeneralManagerT]:
@@ -565,7 +568,7 @@ def finalize_read_authorization(
565
568
  def prepare_read_authorization(
566
569
  queryset: Bucket[GeneralManagerT],
567
570
  general_manager_class: type[GeneralManagerT],
568
- info: GraphQLResolveInfo,
571
+ info: ReadPermissionInfo,
569
572
  *,
570
573
  permission_plan: ReadPermissionPlan | None = None,
571
574
  ) -> ReadAuthorizationPreparation[GeneralManagerT]:
@@ -639,7 +642,7 @@ def prepare_read_authorization(
639
642
  def filter_queryset_by_read_permission(
640
643
  queryset: Bucket[GeneralManagerT],
641
644
  general_manager_class: type[GeneralManagerT],
642
- info: GraphQLResolveInfo,
645
+ info: ReadPermissionInfo,
643
646
  *,
644
647
  requires_instance_check: bool = True,
645
648
  instance_check_reasons: tuple[str, ...] = (),
@@ -8,6 +8,8 @@ from uuid import uuid4
8
8
  from collections.abc import Iterable, Iterator, Mapping
9
9
  from dataclasses import dataclass
10
10
  from importlib import import_module
11
+ from itertools import islice
12
+ from types import SimpleNamespace
11
13
  from typing import Callable, Protocol, TYPE_CHECKING, cast
12
14
 
13
15
  from django.conf import settings
@@ -16,11 +18,24 @@ from django.http import HttpRequest, HttpResponse, JsonResponse
16
18
  from django.urls import URLPattern, path
17
19
 
18
20
  from general_manager.logging import get_logger
21
+ from general_manager.conf import get_setting
19
22
  from general_manager.api.mutation_controls import MUTATION_CONTROL_KEYS
20
23
  from general_manager.bucket._ordering import normalize_ordering
21
24
  from general_manager.bucket.request_bucket import RequestBucket
25
+ from general_manager.bucket.base_bucket import Bucket
26
+ from general_manager.bucket._materialized_bucket import MaterializedBucket
27
+ from general_manager.api.property import GraphQLProperty
28
+ from general_manager.api.graphql_errors import get_read_permission_filter
29
+ from general_manager.api.graphql_resolvers import (
30
+ check_read_permission_for_user,
31
+ finalize_read_authorization,
32
+ prepare_read_authorization,
33
+ )
22
34
 
23
35
  if TYPE_CHECKING:
36
+ from general_manager.api.graphql_errors import (
37
+ GraphQLResolveInfo as ReadPermissionInfo,
38
+ )
24
39
  from general_manager.manager.general_manager import GeneralManager
25
40
 
26
41
  logger = get_logger("api.remote")
@@ -95,6 +110,12 @@ class RemoteAPIManagerClass(Protocol):
95
110
  class RemoteAPIConfigurationError(ValueError):
96
111
  """Raised when RemoteAPI declarations are invalid."""
97
112
 
113
+ @classmethod
114
+ def invalid_page_limits(cls) -> "RemoteAPIConfigurationError":
115
+ return cls(
116
+ "RemoteAPI page limits must be positive integers and default must not exceed maximum"
117
+ )
118
+
98
119
  @classmethod
99
120
  def empty_segments(cls, base_path: str) -> "RemoteAPIConfigurationError":
100
121
  return cls(
@@ -145,8 +166,11 @@ class RemoteAPIConfigurationError(ValueError):
145
166
  class InvalidRemotePaginationError(ValueError):
146
167
  """Raised when remote query controls cannot produce a valid page."""
147
168
 
148
- def __init__(self) -> None:
149
- super().__init__("page and page_size must be positive integers")
169
+ def __init__(self, max_size: int | None = None) -> None:
170
+ message = "page and page_size must be positive integers"
171
+ if max_size is not None:
172
+ message = f"page_size must not exceed {max_size}"
173
+ super().__init__(message)
150
174
 
151
175
 
152
176
  class RemoteAPIRequestError(ValueError):
@@ -470,8 +494,63 @@ def _request_id(
470
494
  return f"gm-{prefix}-{uuid4()}"
471
495
 
472
496
 
473
- def _serialize_manager(manager: "GeneralManager") -> RemoteJSONPayload:
474
- return dict(manager)
497
+ def _read_permission_info(request: HttpRequest) -> ReadPermissionInfo:
498
+ """Adapt the request principal to the shared read-authorization context."""
499
+ from django.contrib.auth.models import AnonymousUser
500
+
501
+ user = getattr(request, "user", None)
502
+ return SimpleNamespace(
503
+ context=SimpleNamespace(user=AnonymousUser() if user is None else user)
504
+ )
505
+
506
+
507
+ def _serialize_manager(
508
+ manager: "GeneralManager", request: HttpRequest
509
+ ) -> RemoteJSONPayload:
510
+ """Resolve only fields the caller may read, without iterating their values."""
511
+ manager._ensure_manager_state_valid()
512
+ user = _read_permission_info(request).context.user
513
+ field_names = dict.fromkeys(manager._attributes)
514
+ for name, value in manager.__class__.__dict__.items():
515
+ if name == "history" or getattr(
516
+ value, "_general_manager_generated_relation", False
517
+ ):
518
+ continue
519
+ if isinstance(value, (GraphQLProperty, property)):
520
+ field_names[name] = None
521
+ return {
522
+ name: getattr(manager, name)
523
+ for name in field_names
524
+ if check_read_permission_for_user(manager, user, name)
525
+ }
526
+
527
+
528
+ def _serialize_readable_manager(
529
+ manager: "GeneralManager", request: HttpRequest, *, require_read: bool = False
530
+ ) -> RemoteJSONList:
531
+ """Apply the row policy to detail and mutation results before field reads."""
532
+ info = _read_permission_info(request)
533
+ permission_plan = get_read_permission_filter(type(manager), info)
534
+ source: Bucket[GeneralManager] = MaterializedBucket(type(manager), [manager])
535
+ if permission_plan.decision == "conditional" and any(
536
+ constraint.get("filter") or constraint.get("exclude")
537
+ for constraint in permission_plan.filters
538
+ ):
539
+ # Database subsets must retain ORM lookup semantics (including excludes).
540
+ source = type(manager).all().with_instances([manager])
541
+ preparation = prepare_read_authorization(
542
+ source, type(manager), info, permission_plan=permission_plan
543
+ )
544
+ authorized = finalize_read_authorization(
545
+ preparation,
546
+ type(manager),
547
+ info,
548
+ source="remote_detail",
549
+ ).queryset
550
+ items = [_serialize_manager(item, request) for item in authorized]
551
+ if require_read and not items:
552
+ raise PermissionError
553
+ return items
475
554
 
476
555
 
477
556
  def _success_payload(
@@ -579,19 +658,26 @@ def _apply_ordering(
579
658
  def _resolve_remote_pagination(
580
659
  page: object,
581
660
  page_size: object,
582
- ) -> tuple[int, int] | None:
583
- """Normalize known remote query controls without accepting booleans as ints."""
584
- if page is None and page_size is None:
585
- return None
661
+ ) -> tuple[int, int]:
662
+ """Apply finite server-owned defaults and reject oversized client pages."""
663
+ default_size = get_setting("REMOTE_API_DEFAULT_PAGE_SIZE", 10)
664
+ max_size = get_setting("REMOTE_API_MAX_PAGE_SIZE", 100)
665
+ for value in (default_size, max_size):
666
+ if not isinstance(value, int) or isinstance(value, bool) or value <= 0:
667
+ raise RemoteAPIConfigurationError.invalid_page_limits()
668
+ default_size = cast(int, default_size)
669
+ max_size = cast(int, max_size)
670
+ if default_size > max_size:
671
+ raise RemoteAPIConfigurationError.invalid_page_limits()
586
672
  for value in (page, page_size):
587
673
  if value is not None and (
588
674
  not isinstance(value, int) or isinstance(value, bool) or value <= 0
589
675
  ):
590
676
  raise InvalidRemotePaginationError()
591
- return (
592
- 1 if page is None else cast(int, page),
593
- 10 if page_size is None else cast(int, page_size),
594
- )
677
+ effective_size = default_size if page_size is None else cast(int, page_size)
678
+ if effective_size > max_size:
679
+ raise InvalidRemotePaginationError(max_size)
680
+ return (1 if page is None else cast(int, page), effective_size)
595
681
 
596
682
 
597
683
  @dataclass(frozen=True, slots=True)
@@ -632,6 +718,9 @@ def _forward_remote_request_controls(
632
718
  """Compile supported page and ordering controls into one remote request."""
633
719
  if not _is_remote_request_bucket(bucket):
634
720
  return bucket, False
721
+ # Snapshots have no upstream plan: controls would become local field filters.
722
+ if cast("RequestBucket[GeneralManager]", bucket).request_plan is None:
723
+ return bucket, False
635
724
  ordering_values = [ordering] if isinstance(ordering, str) else list(ordering or ())
636
725
  terms = normalize_ordering(ordering_values)
637
726
  controls: dict[str, object] = {}
@@ -681,7 +770,23 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
681
770
  body.get("page"),
682
771
  body.get("page_size"),
683
772
  )
773
+ info = _read_permission_info(request)
684
774
  bucket = manager_cls.all()
775
+ permission_plan = get_read_permission_filter(config.manager_cls, info)
776
+ request_alternatives = (
777
+ isinstance(bucket, RequestBucket) and len(permission_plan.filters) > 1
778
+ )
779
+ if request_alternatives and (pagination is not None or ordering):
780
+ raise UnsupportedRequestGlobalOperationError(
781
+ "pagination" if pagination is not None else "ordering"
782
+ )
783
+ preparation = prepare_read_authorization(
784
+ cast("Bucket[GeneralManager]", bucket),
785
+ config.manager_cls,
786
+ info,
787
+ permission_plan=permission_plan,
788
+ )
789
+ bucket = cast(RemoteAPIBucket, preparation.queryset)
685
790
  if filters:
686
791
  bucket = bucket.filter(**cast(Mapping[str, object], filters))
687
792
  if excludes:
@@ -691,7 +796,13 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
691
796
  pagination,
692
797
  ordering,
693
798
  )
694
- provenance = _request_query_provenance(bucket)
799
+ # A union materializes request branches and loses their completeness.
800
+ # Without that provenance we cannot claim a global authorized count.
801
+ provenance = (
802
+ RequestQueryProvenance(None, None, None, False)
803
+ if request_alternatives
804
+ else _request_query_provenance(bucket)
805
+ )
695
806
  if provenance is not None and not provenance.is_complete:
696
807
  if pagination is not None and pagination != (
697
808
  provenance.page,
@@ -706,6 +817,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
706
817
  and not remote_ordering_forwarded
707
818
  ):
708
819
  raise UnsupportedRequestGlobalOperationError("ordering")
820
+ preparation.queryset = cast("Bucket[GeneralManager]", bucket)
821
+ authorization = finalize_read_authorization(
822
+ preparation, config.manager_cls, info, source="remote_query"
823
+ )
824
+ bucket = cast(RemoteAPIBucket, authorization.queryset)
709
825
  bucket = (
710
826
  bucket
711
827
  if remote_ordering_forwarded
@@ -714,7 +830,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
714
830
  total_count = (
715
831
  bucket.count()
716
832
  if provenance is None or provenance.is_complete
717
- else provenance.total_count
833
+ else (
834
+ None
835
+ if authorization.requires_instance_check
836
+ else provenance.total_count
837
+ )
718
838
  )
719
839
  upstream_page_matches = (
720
840
  provenance is not None
@@ -726,7 +846,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
726
846
  start = (page - 1) * page_size
727
847
  end = start + page_size
728
848
  bucket = bucket[start:end]
729
- items = [_serialize_manager(item) for item in bucket]
849
+ # Matching upstream metadata does not guarantee a bounded response.
850
+ items = [
851
+ _serialize_manager(item, request)
852
+ for item in islice(bucket, pagination[1])
853
+ ]
730
854
  metadata_pagination = pagination
731
855
  if metadata_pagination is None and provenance is not None:
732
856
  metadata_pagination = (
@@ -811,8 +935,11 @@ def _build_item_view(config: RemoteAPIConfig) -> RemoteAPIItemView:
811
935
  )
812
936
  manager_cls = cast(RemoteAPIManagerClass, config.manager_cls)
813
937
  detail_manager = manager_cls(id=_coerce_identifier(config, identifier))
938
+ items = _serialize_readable_manager(
939
+ detail_manager, request, require_read=True
940
+ )
814
941
  return _success_payload(
815
- items=[_serialize_manager(detail_manager)],
942
+ items=items,
816
943
  config=config,
817
944
  request_id=request_id,
818
945
  )
@@ -837,7 +964,7 @@ def _build_item_view(config: RemoteAPIConfig) -> RemoteAPIItemView:
837
964
  **payload,
838
965
  )
839
966
  return _success_payload(
840
- items=[_serialize_manager(updated)],
967
+ items=_serialize_readable_manager(updated, request),
841
968
  config=config,
842
969
  request_id=request_id,
843
970
  )
@@ -925,7 +1052,7 @@ def _build_create_view(config: RemoteAPIConfig) -> RemoteAPIView:
925
1052
  **payload,
926
1053
  )
927
1054
  return _success_payload(
928
- items=[_serialize_manager(manager)],
1055
+ items=_serialize_readable_manager(manager, request),
929
1056
  config=config,
930
1057
  request_id=request_id,
931
1058
  status=201,
@@ -1283,11 +1283,27 @@ class CalculationBucket(Bucket[GeneralManagerType]):
1283
1283
  **exclude_kwargs
1284
1284
  )
1285
1285
  else:
1286
- filter_funcs = field_filters.get("filter_funcs", [])
1286
+ filter_funcs = [
1287
+ *field_filters.get("filter_funcs", []),
1288
+ *(
1289
+ create_filter_function(lookup, expected)
1290
+ for lookup, expected in field_filters.get(
1291
+ "filter_kwargs", {}
1292
+ ).items()
1293
+ ),
1294
+ ]
1287
1295
  for filter_func in filter_funcs:
1288
1296
  possible_values = filter(filter_func, possible_values)
1289
1297
 
1290
- exclude_funcs = field_excludes.get("filter_funcs", [])
1298
+ exclude_funcs = [
1299
+ *field_excludes.get("filter_funcs", []),
1300
+ *(
1301
+ create_filter_function(lookup, expected)
1302
+ for lookup, expected in field_excludes.get(
1303
+ "filter_kwargs", {}
1304
+ ).items()
1305
+ ),
1306
+ ]
1291
1307
  for exclude_func in exclude_funcs:
1292
1308
  possible_values = filter(
1293
1309
  _build_exclude_filter(exclude_func), possible_values