GeneralManager 0.82.2__tar.gz → 0.82.4__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 (340) hide show
  1. {generalmanager-0.82.2/src/GeneralManager.egg-info → generalmanager-0.82.4}/PKG-INFO +1 -1
  2. {generalmanager-0.82.2 → generalmanager-0.82.4}/pyproject.toml +1 -1
  3. {generalmanager-0.82.2 → generalmanager-0.82.4/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql.py +7 -0
  5. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_output.py +44 -1
  6. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_search.py +46 -10
  7. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_type.py +8 -1
  8. {generalmanager-0.82.2 → generalmanager-0.82.4}/LICENSE +0 -0
  9. {generalmanager-0.82.2 → generalmanager-0.82.4}/README.md +0 -0
  10. {generalmanager-0.82.2 → generalmanager-0.82.4}/setup.cfg +0 -0
  11. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  12. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  13. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/GeneralManager.egg-info/requires.txt +0 -0
  14. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/GeneralManager.egg-info/top_level.txt +0 -0
  15. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/__init__.py +0 -0
  16. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/__init__.py +0 -0
  17. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/api.py +0 -0
  18. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/bucket.py +0 -0
  19. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/cache.py +0 -0
  20. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/dataframes.py +0 -0
  21. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/factory.py +0 -0
  22. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/general_manager.py +0 -0
  23. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/interface.py +0 -0
  24. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/manager.py +0 -0
  25. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/measurement.py +0 -0
  26. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/permission.py +0 -0
  27. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/rule.py +0 -0
  28. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/search.py +0 -0
  29. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/_types/utils.py +0 -0
  30. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/__init__.py +0 -0
  31. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_as_of.py +0 -0
  32. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_errors.py +0 -0
  33. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_groups.py +0 -0
  34. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_identifiers.py +0 -0
  35. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_mutations.py +0 -0
  36. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_ordering.py +0 -0
  37. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_prefetch.py +0 -0
  38. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_relations.py +0 -0
  39. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_resolvers.py +0 -0
  40. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  41. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_subscriptions.py +0 -0
  42. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_view.py +0 -0
  43. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_warmup.py +0 -0
  44. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  45. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  46. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/mutation.py +0 -0
  47. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/notification_batching.py +0 -0
  48. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/property.py +0 -0
  49. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/registry.py +0 -0
  50. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/remote_api.py +0 -0
  51. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/remote_invalidation.py +0 -0
  52. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/api/remote_invalidation_client.py +0 -0
  53. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/apps.py +0 -0
  54. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/as_of.py +0 -0
  55. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bootstrap.py +0 -0
  56. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/__init__.py +0 -0
  57. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  58. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/_ordering.py +0 -0
  59. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/base_bucket.py +0 -0
  60. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/calculation_bucket.py +0 -0
  61. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/database_bucket.py +0 -0
  62. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/excel_bucket.py +0 -0
  63. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/group_bucket.py +0 -0
  64. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/indexing.py +0 -0
  65. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/projection.py +0 -0
  66. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/bucket/request_bucket.py +0 -0
  67. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/__init__.py +0 -0
  68. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/_dependency_graph.py +0 -0
  69. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/batch_refresh.py +0 -0
  70. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/cache_decorator.py +0 -0
  71. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/cache_tracker.py +0 -0
  72. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/data_change_context.py +0 -0
  73. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/dependency_cache.py +0 -0
  74. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/dependency_index.py +0 -0
  75. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/dependency_matching.py +0 -0
  76. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/dependency_publish.py +0 -0
  77. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/dependency_shards.py +0 -0
  78. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/model_dependency_collector.py +0 -0
  79. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/run_context.py +0 -0
  80. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/run_context_lru.py +0 -0
  81. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/signals.py +0 -0
  82. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/cache/transaction_barrier.py +0 -0
  83. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/__init__.py +0 -0
  84. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/audit.py +0 -0
  85. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/bootstrap.py +0 -0
  86. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/checks.py +0 -0
  87. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/consumer.py +0 -0
  88. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/context.py +0 -0
  89. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/errors.py +0 -0
  90. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/__init__.py +0 -0
  91. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/__main__.py +0 -0
  92. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/baseline.py +0 -0
  93. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  94. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  95. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  96. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  97. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  98. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  99. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  100. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/diagnostics.py +0 -0
  101. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/fingerprints.py +0 -0
  102. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/fixtures.py +0 -0
  103. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  104. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  105. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/judges/contract.py +0 -0
  106. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  107. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  108. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/readiness.py +0 -0
  109. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/runner.py +0 -0
  110. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/evals/traces.py +0 -0
  111. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/grounding.py +0 -0
  112. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/models.py +0 -0
  113. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/__init__.py +0 -0
  114. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/budget.py +0 -0
  115. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/calculations.py +0 -0
  116. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/catalog.py +0 -0
  117. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/config.py +0 -0
  118. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/events.py +0 -0
  119. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/evidence.py +0 -0
  120. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/models.py +0 -0
  121. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/planner.py +0 -0
  122. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/provider_calls.py +0 -0
  123. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/resolver.py +0 -0
  124. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/routing.py +0 -0
  125. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/scheduler.py +0 -0
  126. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/synthesis.py +0 -0
  127. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/planned/validation.py +0 -0
  128. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/__init__.py +0 -0
  129. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/_shared.py +0 -0
  130. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/anthropic.py +0 -0
  131. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/base.py +0 -0
  132. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/google.py +0 -0
  133. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/ollama.py +0 -0
  134. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/providers/openai.py +0 -0
  135. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/rate_limits.py +0 -0
  136. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/routing.py +0 -0
  137. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/schema_index.py +0 -0
  138. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/settings.py +0 -0
  139. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/signals.py +0 -0
  140. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/system_prompt.py +0 -0
  141. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/tool_metadata.py +0 -0
  142. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/tools.py +0 -0
  143. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/turns.py +0 -0
  144. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/chat/views.py +0 -0
  145. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/conf.py +0 -0
  146. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/dataframes/__init__.py +0 -0
  147. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/dataframes/measurements.py +0 -0
  148. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/factory/__init__.py +0 -0
  149. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/factory/auto_factory.py +0 -0
  150. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/factory/factories.py +0 -0
  151. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/factory/factory_methods.py +0 -0
  152. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/__init__.py +0 -0
  153. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/base_interface.py +0 -0
  154. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/__init__.py +0 -0
  155. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/calculation.py +0 -0
  156. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/database.py +0 -0
  157. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/excel.py +0 -0
  158. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  159. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/bundles/request.py +0 -0
  160. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/__init__.py +0 -0
  161. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/base.py +0 -0
  162. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/builtin.py +0 -0
  163. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  164. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  165. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  166. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  167. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/configuration.py +0 -0
  168. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  169. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  170. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  171. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  172. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  173. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  174. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  175. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/factory.py +0 -0
  176. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  177. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  178. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  179. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  180. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  181. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  182. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  183. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  184. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  185. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  186. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  187. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  188. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  189. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  190. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  191. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  192. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  193. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  194. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/registry.py +0 -0
  195. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  196. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  197. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/excel.py +0 -0
  198. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/excel_store.py +0 -0
  199. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/excel_workbook.py +0 -0
  200. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  201. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  202. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  203. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/__init__.py +0 -0
  204. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/calculation.py +0 -0
  205. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/database.py +0 -0
  206. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/excel.py +0 -0
  207. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  208. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/read_only.py +0 -0
  209. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  210. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/interfaces/request.py +0 -0
  211. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/manifests/__init__.py +0 -0
  212. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  213. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  214. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/manifests/capability_models.py +0 -0
  215. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/orm_interface.py +0 -0
  216. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/requests.py +0 -0
  217. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/utils/__init__.py +0 -0
  218. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  219. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/utils/errors.py +0 -0
  220. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/utils/history.py +0 -0
  221. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/interface/utils/models.py +0 -0
  222. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/logging.py +0 -0
  223. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  224. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  225. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  226. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  227. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/search_index.py +0 -0
  228. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/search_reconcile.py +0 -0
  229. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  230. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/shell.py +0 -0
  231. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  232. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  233. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/__init__.py +0 -0
  234. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/bulk_create.py +0 -0
  235. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/general_manager.py +0 -0
  236. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/group_manager.py +0 -0
  237. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/input.py +0 -0
  238. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/manager/meta.py +0 -0
  239. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/measurement/__init__.py +0 -0
  240. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/measurement/measurement.py +0 -0
  241. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/measurement/measurement_field.py +0 -0
  242. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/metrics/__init__.py +0 -0
  243. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/metrics/graphql.py +0 -0
  244. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0001_initial.py +0 -0
  245. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  246. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  247. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  248. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  249. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  250. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  251. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  252. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  253. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  254. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  255. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  256. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  257. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/migrations/__init__.py +0 -0
  258. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/models.py +0 -0
  259. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/__init__.py +0 -0
  260. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/audit.py +0 -0
  261. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/base_permission.py +0 -0
  262. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/graphql_capabilities.py +0 -0
  263. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/manager_based_permission.py +0 -0
  264. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/mutation_permission.py +0 -0
  265. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/permission_checks.py +0 -0
  266. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/permission_data_manager.py +0 -0
  267. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/permission/utils.py +0 -0
  268. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/public_api_registry.py +0 -0
  269. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/py.typed +0 -0
  270. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/rule/__init__.py +0 -0
  271. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/rule/handler.py +0 -0
  272. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/rule/rule.py +0 -0
  273. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/__init__.py +0 -0
  274. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/async_tasks.py +0 -0
  275. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backend.py +0 -0
  276. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backend_registry.py +0 -0
  277. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backends/__init__.py +0 -0
  278. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backends/dev.py +0 -0
  279. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backends/meilisearch.py +0 -0
  280. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backends/opensearch.py +0 -0
  281. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/backends/typesense.py +0 -0
  282. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/checks.py +0 -0
  283. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/config.py +0 -0
  284. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/indexer.py +0 -0
  285. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/invalidation.py +0 -0
  286. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/m2m_invalidation.py +0 -0
  287. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/models.py +0 -0
  288. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/reconciliation.py +0 -0
  289. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/registry.py +0 -0
  290. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/tasks.py +0 -0
  291. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/search/utils.py +0 -0
  292. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/seeding/__init__.py +0 -0
  293. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/seeding/manager_landscape.py +0 -0
  294. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/__init__.py +0 -0
  295. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/adapters.py +0 -0
  296. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/checks.py +0 -0
  297. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/config.py +0 -0
  298. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/errors.py +0 -0
  299. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/finalization.py +0 -0
  300. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/graphql.py +0 -0
  301. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/graphql_types.py +0 -0
  302. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/metrics.py +0 -0
  303. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/models.py +0 -0
  304. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/public.py +0 -0
  305. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/s3.py +0 -0
  306. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/services.py +0 -0
  307. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/tokens.py +0 -0
  308. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/types.py +0 -0
  309. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/urls.py +0 -0
  310. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/uploads/views.py +0 -0
  311. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/__init__.py +0 -0
  312. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  313. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  314. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/_make_cache_key.py +0 -0
  315. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/_none_to_zero.py +0 -0
  316. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/filter_parser.py +0 -0
  317. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/format_string.py +0 -0
  318. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/json_encoder.py +0 -0
  319. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/path_mapping.py +0 -0
  320. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/public_api.py +0 -0
  321. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/testing.py +0 -0
  322. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/utils/type_checks.py +0 -0
  323. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/__init__.py +0 -0
  324. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/actions.py +0 -0
  325. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/backend_registry.py +0 -0
  326. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/backends/__init__.py +0 -0
  327. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/backends/celery.py +0 -0
  328. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/backends/local.py +0 -0
  329. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/backends/n8n.py +0 -0
  330. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/config.py +0 -0
  331. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/engine.py +0 -0
  332. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/event_registry.py +0 -0
  333. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/events.py +0 -0
  334. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/models.py +0 -0
  335. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/signal_bridge.py +0 -0
  336. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/tasks.py +0 -0
  337. {generalmanager-0.82.2 → generalmanager-0.82.4}/src/general_manager/workflow/telemetry.py +0 -0
  338. {generalmanager-0.82.2 → generalmanager-0.82.4}/tests/test_settings.py +0 -0
  339. {generalmanager-0.82.2 → generalmanager-0.82.4}/tests/test_urls.py +0 -0
  340. {generalmanager-0.82.2 → generalmanager-0.82.4}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.82.2
3
+ Version: 0.82.4
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.2"
7
+ version = "0.82.4"
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.2
3
+ Version: 0.82.4
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
@@ -100,6 +100,7 @@ from general_manager.api.graphql_mutations import (
100
100
  generate_delete_mutation_class as _generate_delete_mutation_class_fn,
101
101
  )
102
102
  from general_manager.api.graphql_output import (
103
+ GraphQLOutputIdentityMetadataError,
103
104
  create_output_field_resolver,
104
105
  map_graphql_output_annotation,
105
106
  resolve_output_type_hints,
@@ -518,6 +519,11 @@ class GraphQL:
518
519
  )
519
520
  fields: dict[str, graphene.Field] = {}
520
521
  for declared_field in dataclasses.fields(output_class):
522
+ is_identifier = declared_field.metadata.get("is_identifier", False)
523
+ if not isinstance(is_identifier, bool):
524
+ raise GraphQLOutputIdentityMetadataError(
525
+ output_name, declared_field.name, is_identifier
526
+ )
521
527
  mapped = map_graphql_output_annotation(
522
528
  hints[declared_field.name],
523
529
  owner_name=output_name,
@@ -528,6 +534,7 @@ class GraphQL:
528
534
  output_type_registry=cls.graphql_output_type_registry,
529
535
  measurement_type=MeasurementType,
530
536
  scalar_mapper=cls._map_field_to_graphene_base_type,
537
+ is_identifier=is_identifier,
531
538
  )
532
539
  field = cast(graphene.Field, mapped.field)
533
540
  field.resolver = create_output_field_resolver(
@@ -9,6 +9,7 @@ from decimal import Decimal
9
9
  import sys
10
10
  from types import UnionType
11
11
  from typing import Any, ForwardRef, Union, get_args, get_origin, get_type_hints
12
+ from uuid import UUID
12
13
 
13
14
  import graphene
14
15
 
@@ -40,6 +41,16 @@ class GraphQLOutputAnnotationError(TypeError):
40
41
  )
41
42
 
42
43
 
44
+ class GraphQLOutputIdentityMetadataError(TypeError):
45
+ """Raised when an output field's identity flag is not boolean."""
46
+
47
+ def __init__(self, owner_name: str, field_name: str, flag: object) -> None:
48
+ super().__init__(
49
+ f"Invalid is_identifier metadata for {owner_name}.{field_name}: "
50
+ f"expected bool, got {flag!r}"
51
+ )
52
+
53
+
43
54
  @dataclass(frozen=True, slots=True)
44
55
  class _MappedAnnotation:
45
56
  """Internal Graphene type metadata before a field wrapper is mounted."""
@@ -144,6 +155,7 @@ def _map_collection_annotation(
144
155
  output_type_registry: Mapping[str, type[graphene.ObjectType]],
145
156
  measurement_type: type[graphene.ObjectType],
146
157
  scalar_mapper: Callable[[type], type],
158
+ is_identifier: bool = False,
147
159
  ) -> _MappedAnnotation:
148
160
  origin = get_origin(annotation)
149
161
  if origin not in (list, tuple, set):
@@ -159,6 +171,13 @@ def _map_collection_annotation(
159
171
  raise _annotation_error(owner_name, field_name, annotation)
160
172
  element_annotation = args[0]
161
173
 
174
+ if is_identifier:
175
+ _, identity_type = _unwrap_optional_annotation(
176
+ element_annotation, owner_name=owner_name, field_name=field_name
177
+ )
178
+ if identity_type not in (int, str, UUID):
179
+ raise _annotation_error(owner_name, field_name, annotation)
180
+
162
181
  element = _map_annotation(
163
182
  element_annotation,
164
183
  owner_name=owner_name,
@@ -169,6 +188,7 @@ def _map_collection_annotation(
169
188
  output_type_registry=output_type_registry,
170
189
  measurement_type=measurement_type,
171
190
  scalar_mapper=scalar_mapper,
191
+ is_identifier=is_identifier,
172
192
  )
173
193
  element_type = element.graphene_type
174
194
  if not element.nullable:
@@ -192,6 +212,7 @@ def _map_non_optional_value(
192
212
  output_type_registry: Mapping[str, type[graphene.ObjectType]],
193
213
  measurement_type: type[graphene.ObjectType],
194
214
  scalar_mapper: Callable[[type], type],
215
+ is_identifier: bool = False,
195
216
  ) -> _MappedAnnotation:
196
217
  annotation = _resolve_registered_name(
197
218
  annotation,
@@ -220,6 +241,17 @@ def _map_non_optional_value(
220
241
  output_type_registry=output_type_registry,
221
242
  measurement_type=measurement_type,
222
243
  scalar_mapper=scalar_mapper,
244
+ is_identifier=is_identifier,
245
+ )
246
+
247
+ if is_identifier:
248
+ if annotation not in (int, str, UUID):
249
+ raise _annotation_error(owner_name, field_name, annotation)
250
+ return _MappedAnnotation(
251
+ graphene.ID,
252
+ annotation,
253
+ nullable=False,
254
+ contains_measurement=False,
223
255
  )
224
256
 
225
257
  if safe_issubclass(annotation, GraphQLType):
@@ -290,6 +322,7 @@ def _map_annotation(
290
322
  output_type_registry: Mapping[str, type[graphene.ObjectType]],
291
323
  measurement_type: type[graphene.ObjectType],
292
324
  scalar_mapper: Callable[[type], type],
325
+ is_identifier: bool = False,
293
326
  ) -> _MappedAnnotation:
294
327
  nullable, concrete = _unwrap_optional_annotation(
295
328
  annotation,
@@ -306,6 +339,7 @@ def _map_annotation(
306
339
  output_type_registry=output_type_registry,
307
340
  measurement_type=measurement_type,
308
341
  scalar_mapper=scalar_mapper,
342
+ is_identifier=is_identifier,
309
343
  )
310
344
  return replace(mapped, nullable=nullable)
311
345
 
@@ -322,6 +356,7 @@ def _map_non_optional_annotation(
322
356
  measurement_type: type[graphene.ObjectType],
323
357
  scalar_mapper: Callable[[type], type],
324
358
  required: bool,
359
+ is_identifier: bool = False,
325
360
  ) -> MappedGraphQLOutput:
326
361
  """Map one non-optional annotation to a Graphene field."""
327
362
  mapped = _map_non_optional_value(
@@ -334,6 +369,7 @@ def _map_non_optional_annotation(
334
369
  output_type_registry=output_type_registry,
335
370
  measurement_type=measurement_type,
336
371
  scalar_mapper=scalar_mapper,
372
+ is_identifier=is_identifier,
337
373
  )
338
374
  field_kwargs: dict[str, object] = {}
339
375
  if mapped.contains_measurement:
@@ -355,8 +391,14 @@ def map_graphql_output_annotation(
355
391
  output_type_registry: Mapping[str, type[graphene.ObjectType]],
356
392
  measurement_type: type[graphene.ObjectType],
357
393
  scalar_mapper: Callable[[type], type],
394
+ is_identifier: bool = False,
358
395
  ) -> MappedGraphQLOutput:
359
- """Map a strict GraphQL output annotation to a mounted Graphene field."""
396
+ """Map a strict output hint, preserving nullability and native values.
397
+
398
+ Explicit identity fields accept int, str, UUID, and supported flat
399
+ collections of those types. Their resolver type stays native while the
400
+ generated scalar is ID. Unmarked fields retain the strict legacy mapping.
401
+ """
360
402
  nullable, concrete_type = _unwrap_optional_annotation(
361
403
  annotation,
362
404
  owner_name=owner_name,
@@ -374,6 +416,7 @@ def map_graphql_output_annotation(
374
416
  measurement_type=measurement_type,
375
417
  scalar_mapper=scalar_mapper,
376
418
  required=not nullable,
419
+ is_identifier=is_identifier,
377
420
  )
378
421
  except GraphQLOutputAnnotationError as error:
379
422
  # Preserve the annotation written on the owning field in diagnostics,
@@ -18,9 +18,10 @@ from typing import (
18
18
  cast,
19
19
  get_args,
20
20
  )
21
+ from uuid import UUID
21
22
 
22
23
  import graphene
23
- from graphql import GraphQLError
24
+ from graphql import GraphQLError, GraphQLID
24
25
  from django.core.exceptions import FieldDoesNotExist
25
26
  from django.db import models
26
27
 
@@ -35,6 +36,7 @@ from general_manager.api.graphql_ordering import (
35
36
  from general_manager.bucket._ordering import SortTerm, sort_items
36
37
  from general_manager.logging import get_logger
37
38
  from general_manager.manager.general_manager import GeneralManager
39
+ from general_manager.manager.input import Input
38
40
  from general_manager.measurement.measurement import Measurement
39
41
  from general_manager.utils.type_checks import safe_issubclass
40
42
  from general_manager.search.backend_registry import get_search_backend
@@ -880,13 +882,16 @@ def normalize_id_filter_value(
880
882
  value: object,
881
883
  ) -> object:
882
884
  """
883
- Convert equality filters marked as scalar identities to their native types.
885
+ Convert confirmed identity equality operands to their native types.
884
886
 
885
887
  Actual ORM primary keys use the declared constructor input, independent of
886
888
  the model column name. Raw relation references use the target field's
887
889
  ``to_python`` conversion, including ``to_field`` references. Ordered lookups
888
- and non-list/tuple ``in`` values pass through unchanged. Conversion preserves
889
- existing filter semantics; constructor and write validation remain separate.
890
+ and non-list/tuple ``in`` values pass through unchanged. Declared native
891
+ properties use their validated annotation and the standard Input cast;
892
+ collection operands retain the backend's existing element comparisons.
893
+ Equality lists retain production adapters' OR grammar. Constructor and
894
+ write validation remain separate. Null operands and elements remain null.
890
895
 
891
896
  Raises:
892
897
  Exceptions from ``Input.cast()`` or ORM field conversion propagate.
@@ -900,6 +905,22 @@ def normalize_id_filter_value(
900
905
  interface = getattr(field_type, "Interface", None)
901
906
  if interface is None:
902
907
  return value
908
+ prop = interface.get_graph_ql_properties().get(attribute_name)
909
+ if prop is not None:
910
+ if not prop.is_identifier:
911
+ return value
912
+ native_type, _ = property_identifier_type(
913
+ prop.graphql_type_hint,
914
+ owner_name=field_type.__name__,
915
+ field_name=attribute_name,
916
+ )
917
+ scalar_input = Input(native_type)
918
+ if operator == "in" and not isinstance(value, (list, tuple)):
919
+ return value
920
+ if isinstance(value, (list, tuple)):
921
+ return [_cast_identity_scalar(scalar_input.cast, item) for item in value]
922
+ return _cast_identity_scalar(scalar_input.cast, value)
923
+
903
924
  metadata = interface.get_attribute_types().get(attribute_name, {})
904
925
  if not metadata.get("is_identifier"):
905
926
  return value
@@ -924,10 +945,19 @@ def normalize_id_filter_value(
924
945
  if converter is None:
925
946
  return value
926
947
 
927
- if operator == "in":
928
- if not isinstance(value, (list, tuple)):
929
- return value
930
- return [converter(item) for item in value]
948
+ if operator == "in" and not isinstance(value, (list, tuple)):
949
+ return value
950
+ if isinstance(value, (list, tuple)):
951
+ return [_cast_identity_scalar(converter, item) for item in value]
952
+ return _cast_identity_scalar(converter, value)
953
+
954
+
955
+ def _cast_identity_scalar(
956
+ converter: Callable[[object], object], value: object
957
+ ) -> object:
958
+ """Use existing ID validation before native casting can truncate JSON values."""
959
+ if value is not None and not isinstance(value, UUID):
960
+ GraphQLID.parse_value(value)
931
961
  return converter(value)
932
962
 
933
963
 
@@ -1216,16 +1246,22 @@ def register_search_query(
1216
1246
  decision = getattr(permission_plan, "decision", "conditional")
1217
1247
  if decision == "deny_all":
1218
1248
  continue
1249
+ # Shared indexes may give the same field different native types.
1250
+ # Keep parsed user filters and permission constraints untouched.
1251
+ manager_filters = {
1252
+ key: normalize_id_filter_value(manager_class, key, value)
1253
+ for key, value in parsed_filters.items()
1254
+ }
1219
1255
  backend_shape = get_backend_shape(manager_class)
1220
1256
  instance_check_reasons = resolve_instance_check_reasons(
1221
1257
  permission_plan,
1222
1258
  backend_shape=backend_shape,
1223
1259
  )
1224
1260
  filter_groups = (
1225
- parsed_filters or None
1261
+ manager_filters or None
1226
1262
  if decision == "allow_all"
1227
1263
  else merge_permission_filters(
1228
- parsed_filters,
1264
+ manager_filters,
1229
1265
  permission_plan.filters,
1230
1266
  )
1231
1267
  )
@@ -29,7 +29,14 @@ class GraphQLTypeMeta(type):
29
29
 
30
30
 
31
31
  class GraphQLType(metaclass=GraphQLTypeMeta):
32
- """Frozen annotated value exposed only as a GraphQL output object."""
32
+ """Frozen annotated value exposed only as a GraphQL output object.
33
+
34
+ Use ``dataclasses.field(metadata={"is_identifier": True})`` to declare
35
+ native int, str, or UUID identity fields and their supported homogeneous
36
+ collections. Schema generation preserves annotation nullability and native
37
+ values while exposing ID scalars. Missing or false metadata keeps existing
38
+ output types; other flag values fail schema generation with TypeError.
39
+ """
33
40
 
34
41
 
35
42
  def get_registered_graphql_types() -> tuple[type[GraphQLType], ...]:
File without changes