GeneralManager 0.82.1__tar.gz → 0.82.3__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.1/src/GeneralManager.egg-info → generalmanager-0.82.3}/PKG-INFO +1 -1
  2. {generalmanager-0.82.1 → generalmanager-0.82.3}/pyproject.toml +1 -1
  3. {generalmanager-0.82.1 → generalmanager-0.82.3/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql.py +18 -1
  5. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_identifiers.py +43 -1
  6. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_search.py +56 -11
  7. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/property.py +18 -1
  8. {generalmanager-0.82.1 → generalmanager-0.82.3}/LICENSE +0 -0
  9. {generalmanager-0.82.1 → generalmanager-0.82.3}/README.md +0 -0
  10. {generalmanager-0.82.1 → generalmanager-0.82.3}/setup.cfg +0 -0
  11. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  12. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  13. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/GeneralManager.egg-info/requires.txt +0 -0
  14. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/GeneralManager.egg-info/top_level.txt +0 -0
  15. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/__init__.py +0 -0
  16. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/__init__.py +0 -0
  17. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/api.py +0 -0
  18. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/bucket.py +0 -0
  19. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/cache.py +0 -0
  20. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/dataframes.py +0 -0
  21. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/factory.py +0 -0
  22. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/general_manager.py +0 -0
  23. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/interface.py +0 -0
  24. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/manager.py +0 -0
  25. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/measurement.py +0 -0
  26. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/permission.py +0 -0
  27. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/rule.py +0 -0
  28. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/search.py +0 -0
  29. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/_types/utils.py +0 -0
  30. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/__init__.py +0 -0
  31. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_as_of.py +0 -0
  32. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_errors.py +0 -0
  33. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_groups.py +0 -0
  34. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_mutations.py +0 -0
  35. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_ordering.py +0 -0
  36. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_output.py +0 -0
  37. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_prefetch.py +0 -0
  38. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_relations.py +0 -0
  39. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_resolvers.py +0 -0
  40. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  41. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_subscriptions.py +0 -0
  42. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_type.py +0 -0
  43. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_view.py +0 -0
  44. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_warmup.py +0 -0
  45. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  46. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  47. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/mutation.py +0 -0
  48. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/notification_batching.py +0 -0
  49. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/registry.py +0 -0
  50. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/remote_api.py +0 -0
  51. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/remote_invalidation.py +0 -0
  52. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/api/remote_invalidation_client.py +0 -0
  53. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/apps.py +0 -0
  54. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/as_of.py +0 -0
  55. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bootstrap.py +0 -0
  56. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/__init__.py +0 -0
  57. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  58. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/_ordering.py +0 -0
  59. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/base_bucket.py +0 -0
  60. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/calculation_bucket.py +0 -0
  61. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/database_bucket.py +0 -0
  62. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/excel_bucket.py +0 -0
  63. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/group_bucket.py +0 -0
  64. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/indexing.py +0 -0
  65. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/projection.py +0 -0
  66. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/bucket/request_bucket.py +0 -0
  67. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/__init__.py +0 -0
  68. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/_dependency_graph.py +0 -0
  69. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/batch_refresh.py +0 -0
  70. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/cache_decorator.py +0 -0
  71. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/cache_tracker.py +0 -0
  72. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/data_change_context.py +0 -0
  73. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/dependency_cache.py +0 -0
  74. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/dependency_index.py +0 -0
  75. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/dependency_matching.py +0 -0
  76. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/dependency_publish.py +0 -0
  77. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/dependency_shards.py +0 -0
  78. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/model_dependency_collector.py +0 -0
  79. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/run_context.py +0 -0
  80. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/run_context_lru.py +0 -0
  81. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/signals.py +0 -0
  82. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/cache/transaction_barrier.py +0 -0
  83. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/__init__.py +0 -0
  84. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/audit.py +0 -0
  85. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/bootstrap.py +0 -0
  86. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/checks.py +0 -0
  87. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/consumer.py +0 -0
  88. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/context.py +0 -0
  89. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/errors.py +0 -0
  90. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/__init__.py +0 -0
  91. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/__main__.py +0 -0
  92. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/baseline.py +0 -0
  93. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  94. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  95. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  96. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  97. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  98. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  99. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  100. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/diagnostics.py +0 -0
  101. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/fingerprints.py +0 -0
  102. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/fixtures.py +0 -0
  103. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  104. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  105. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/judges/contract.py +0 -0
  106. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  107. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  108. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/readiness.py +0 -0
  109. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/runner.py +0 -0
  110. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/evals/traces.py +0 -0
  111. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/grounding.py +0 -0
  112. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/models.py +0 -0
  113. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/__init__.py +0 -0
  114. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/budget.py +0 -0
  115. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/calculations.py +0 -0
  116. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/catalog.py +0 -0
  117. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/config.py +0 -0
  118. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/events.py +0 -0
  119. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/evidence.py +0 -0
  120. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/models.py +0 -0
  121. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/planner.py +0 -0
  122. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/provider_calls.py +0 -0
  123. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/resolver.py +0 -0
  124. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/routing.py +0 -0
  125. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/scheduler.py +0 -0
  126. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/synthesis.py +0 -0
  127. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/planned/validation.py +0 -0
  128. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/__init__.py +0 -0
  129. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/_shared.py +0 -0
  130. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/anthropic.py +0 -0
  131. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/base.py +0 -0
  132. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/google.py +0 -0
  133. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/ollama.py +0 -0
  134. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/providers/openai.py +0 -0
  135. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/rate_limits.py +0 -0
  136. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/routing.py +0 -0
  137. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/schema_index.py +0 -0
  138. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/settings.py +0 -0
  139. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/signals.py +0 -0
  140. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/system_prompt.py +0 -0
  141. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/tool_metadata.py +0 -0
  142. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/tools.py +0 -0
  143. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/turns.py +0 -0
  144. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/chat/views.py +0 -0
  145. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/conf.py +0 -0
  146. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/dataframes/__init__.py +0 -0
  147. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/dataframes/measurements.py +0 -0
  148. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/factory/__init__.py +0 -0
  149. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/factory/auto_factory.py +0 -0
  150. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/factory/factories.py +0 -0
  151. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/factory/factory_methods.py +0 -0
  152. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/__init__.py +0 -0
  153. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/base_interface.py +0 -0
  154. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/__init__.py +0 -0
  155. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/calculation.py +0 -0
  156. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/database.py +0 -0
  157. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/excel.py +0 -0
  158. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  159. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/bundles/request.py +0 -0
  160. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/__init__.py +0 -0
  161. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/base.py +0 -0
  162. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/builtin.py +0 -0
  163. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  164. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  165. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  166. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  167. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/configuration.py +0 -0
  168. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  169. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  170. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  171. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  172. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  173. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  174. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  175. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/factory.py +0 -0
  176. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  177. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  178. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  179. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  180. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  181. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  182. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  183. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  184. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  185. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  186. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  187. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  188. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  189. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  190. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  191. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  192. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  193. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  194. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/registry.py +0 -0
  195. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  196. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  197. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/excel.py +0 -0
  198. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/excel_store.py +0 -0
  199. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/excel_workbook.py +0 -0
  200. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  201. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  202. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  203. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/__init__.py +0 -0
  204. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/calculation.py +0 -0
  205. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/database.py +0 -0
  206. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/excel.py +0 -0
  207. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  208. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/read_only.py +0 -0
  209. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  210. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/interfaces/request.py +0 -0
  211. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/manifests/__init__.py +0 -0
  212. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  213. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  214. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/manifests/capability_models.py +0 -0
  215. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/orm_interface.py +0 -0
  216. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/requests.py +0 -0
  217. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/utils/__init__.py +0 -0
  218. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  219. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/utils/errors.py +0 -0
  220. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/utils/history.py +0 -0
  221. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/interface/utils/models.py +0 -0
  222. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/logging.py +0 -0
  223. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  224. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  225. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  226. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  227. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/search_index.py +0 -0
  228. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/search_reconcile.py +0 -0
  229. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  230. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/shell.py +0 -0
  231. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  232. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  233. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/__init__.py +0 -0
  234. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/bulk_create.py +0 -0
  235. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/general_manager.py +0 -0
  236. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/group_manager.py +0 -0
  237. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/input.py +0 -0
  238. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/manager/meta.py +0 -0
  239. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/measurement/__init__.py +0 -0
  240. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/measurement/measurement.py +0 -0
  241. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/measurement/measurement_field.py +0 -0
  242. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/metrics/__init__.py +0 -0
  243. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/metrics/graphql.py +0 -0
  244. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0001_initial.py +0 -0
  245. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  246. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  247. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  248. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  249. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  250. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  251. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  252. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  253. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  254. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  255. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  256. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  257. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/migrations/__init__.py +0 -0
  258. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/models.py +0 -0
  259. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/__init__.py +0 -0
  260. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/audit.py +0 -0
  261. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/base_permission.py +0 -0
  262. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/graphql_capabilities.py +0 -0
  263. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/manager_based_permission.py +0 -0
  264. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/mutation_permission.py +0 -0
  265. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/permission_checks.py +0 -0
  266. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/permission_data_manager.py +0 -0
  267. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/permission/utils.py +0 -0
  268. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/public_api_registry.py +0 -0
  269. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/py.typed +0 -0
  270. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/rule/__init__.py +0 -0
  271. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/rule/handler.py +0 -0
  272. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/rule/rule.py +0 -0
  273. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/__init__.py +0 -0
  274. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/async_tasks.py +0 -0
  275. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backend.py +0 -0
  276. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backend_registry.py +0 -0
  277. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backends/__init__.py +0 -0
  278. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backends/dev.py +0 -0
  279. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backends/meilisearch.py +0 -0
  280. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backends/opensearch.py +0 -0
  281. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/backends/typesense.py +0 -0
  282. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/checks.py +0 -0
  283. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/config.py +0 -0
  284. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/indexer.py +0 -0
  285. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/invalidation.py +0 -0
  286. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/m2m_invalidation.py +0 -0
  287. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/models.py +0 -0
  288. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/reconciliation.py +0 -0
  289. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/registry.py +0 -0
  290. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/tasks.py +0 -0
  291. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/search/utils.py +0 -0
  292. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/seeding/__init__.py +0 -0
  293. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/seeding/manager_landscape.py +0 -0
  294. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/__init__.py +0 -0
  295. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/adapters.py +0 -0
  296. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/checks.py +0 -0
  297. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/config.py +0 -0
  298. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/errors.py +0 -0
  299. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/finalization.py +0 -0
  300. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/graphql.py +0 -0
  301. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/graphql_types.py +0 -0
  302. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/metrics.py +0 -0
  303. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/models.py +0 -0
  304. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/public.py +0 -0
  305. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/s3.py +0 -0
  306. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/services.py +0 -0
  307. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/tokens.py +0 -0
  308. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/types.py +0 -0
  309. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/urls.py +0 -0
  310. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/uploads/views.py +0 -0
  311. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/__init__.py +0 -0
  312. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  313. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  314. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/_make_cache_key.py +0 -0
  315. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/_none_to_zero.py +0 -0
  316. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/filter_parser.py +0 -0
  317. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/format_string.py +0 -0
  318. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/json_encoder.py +0 -0
  319. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/path_mapping.py +0 -0
  320. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/public_api.py +0 -0
  321. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/testing.py +0 -0
  322. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/utils/type_checks.py +0 -0
  323. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/__init__.py +0 -0
  324. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/actions.py +0 -0
  325. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/backend_registry.py +0 -0
  326. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/backends/__init__.py +0 -0
  327. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/backends/celery.py +0 -0
  328. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/backends/local.py +0 -0
  329. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/backends/n8n.py +0 -0
  330. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/config.py +0 -0
  331. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/engine.py +0 -0
  332. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/event_registry.py +0 -0
  333. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/events.py +0 -0
  334. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/models.py +0 -0
  335. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/signal_bridge.py +0 -0
  336. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/tasks.py +0 -0
  337. {generalmanager-0.82.1 → generalmanager-0.82.3}/src/general_manager/workflow/telemetry.py +0 -0
  338. {generalmanager-0.82.1 → generalmanager-0.82.3}/tests/test_settings.py +0 -0
  339. {generalmanager-0.82.1 → generalmanager-0.82.3}/tests/test_urls.py +0 -0
  340. {generalmanager-0.82.1 → generalmanager-0.82.3}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.82.1
3
+ Version: 0.82.3
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.1"
7
+ version = "0.82.3"
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.1
3
+ Version: 0.82.3
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
@@ -38,7 +38,10 @@ from django.core.exceptions import ObjectDoesNotExist
38
38
  from django.db import DEFAULT_DB_ALIAS, models, transaction
39
39
  from django.utils.module_loading import import_string
40
40
 
41
- from general_manager.api.graphql_identifiers import build_identification_arguments
41
+ from general_manager.api.graphql_identifiers import (
42
+ build_identification_arguments,
43
+ property_identifier_type,
44
+ )
42
45
  from general_manager.bucket.base_bucket import Bucket
43
46
  from general_manager.bucket.group_bucket import GroupBucket
44
47
  from general_manager.cache.dependency_index import (
@@ -929,6 +932,20 @@ class GraphQL:
929
932
  ) in generalManagerClass.Interface.get_graph_ql_properties().items():
930
933
  raw_hint = attr_value.graphql_type_hint
931
934
 
935
+ if attr_value.is_identifier:
936
+ native_type, is_collection = property_identifier_type(
937
+ raw_hint,
938
+ owner_name=generalManagerClass.__name__,
939
+ field_name=attr_name,
940
+ )
941
+ fields[attr_name] = (
942
+ graphene.List(graphene.ID) if is_collection else graphene.ID()
943
+ )
944
+ fields[f"resolve_{attr_name}"] = cls._create_resolver(
945
+ attr_name, native_type
946
+ )
947
+ continue
948
+
932
949
  if _contains_measurement(raw_hint):
933
950
  mapped = map_graphql_output_annotation(
934
951
  raw_hint,
@@ -3,7 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Mapping
6
- from typing import cast
6
+ from types import UnionType
7
+ from typing import Annotated, Union, cast, get_args, get_origin
8
+ from uuid import UUID
7
9
 
8
10
  import graphene
9
11
  from django.db import models
@@ -16,9 +18,49 @@ from general_manager.api.graphql_relations import (
16
18
  get_graphql_manager_registry,
17
19
  resolve_general_manager_type,
18
20
  )
21
+ from general_manager.api.graphql_output import GraphQLOutputAnnotationError
19
22
  from general_manager.manager.general_manager import GeneralManager
20
23
 
21
24
 
25
+ def property_identifier_type(
26
+ annotation: object, *, owner_name: str, field_name: str
27
+ ) -> tuple[type, bool]:
28
+ """Validate an explicit native identity hint and return its type and shape.
29
+
30
+ This shared interpretation lets output and filter builders consume the
31
+ descriptor's public ``is_identifier`` flag without changing its annotation
32
+ or the native resolver value. Optional wrappers do not add non-null output
33
+ constraints to legacy manager properties.
34
+ """
35
+ original_annotation = annotation
36
+
37
+ def unwrap(hint: object) -> object:
38
+ while get_origin(hint) is Annotated:
39
+ hint = get_args(hint)[0]
40
+ if get_origin(hint) in (Union, UnionType):
41
+ members = get_args(hint)
42
+ if len(members) == 2 and type(None) in members:
43
+ return unwrap(next(t for t in members if t is not type(None)))
44
+ return hint
45
+
46
+ annotation = unwrap(annotation)
47
+ origin = get_origin(annotation)
48
+ is_collection = origin in (list, tuple, set)
49
+ if is_collection:
50
+ elements = get_args(annotation)
51
+ if origin is tuple and len(elements) == 2 and elements[1] is Ellipsis:
52
+ elements = elements[:1]
53
+ if elements and (origin is tuple or len(elements) == 1):
54
+ native_type = unwrap(elements[0])
55
+ if native_type in (int, str, UUID) and all(
56
+ unwrap(element) is native_type for element in elements
57
+ ):
58
+ return cast(type, native_type), True
59
+ elif annotation in (int, str, UUID):
60
+ return cast(type, annotation), False
61
+ raise GraphQLOutputAnnotationError(owner_name, field_name, original_annotation)
62
+
63
+
22
64
  def is_orm_identifier_input(manager_class: type[GeneralManager], name: str) -> bool:
23
65
  """Identify the ORM constructor alias addressing the actual model PK."""
24
66
  model = getattr(manager_class.Interface, "_model", None)
@@ -18,13 +18,15 @@ 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
 
27
28
  from general_manager.conf import get_setting
29
+ from general_manager.api.graphql_identifiers import property_identifier_type
28
30
  from general_manager.api.graphql_ordering import (
29
31
  GraphQLOrderingInputError,
30
32
  create_ordering_types,
@@ -34,6 +36,7 @@ from general_manager.api.graphql_ordering import (
34
36
  from general_manager.bucket._ordering import SortTerm, sort_items
35
37
  from general_manager.logging import get_logger
36
38
  from general_manager.manager.general_manager import GeneralManager
39
+ from general_manager.manager.input import Input
37
40
  from general_manager.measurement.measurement import Measurement
38
41
  from general_manager.utils.type_checks import safe_issubclass
39
42
  from general_manager.search.backend_registry import get_search_backend
@@ -842,12 +845,20 @@ def create_filter_options(
842
845
  continue
843
846
  hints = [t for t in get_args(prop.graphql_type_hint) if t is not type(None)]
844
847
  prop_type = hints[0] if hints else cast(type, prop.graphql_type_hint)
848
+ prop_info: dict[str, object] = {}
849
+ if prop.is_identifier:
850
+ prop_type, _ = property_identifier_type(
851
+ prop.graphql_type_hint,
852
+ owner_name=field_type.__name__,
853
+ field_name=prop_name,
854
+ )
855
+ prop_info["is_identifier"] = True
845
856
  filter_fields = {
846
857
  **filter_fields,
847
858
  **{
848
859
  k: v
849
860
  for k, v in get_filter_options(
850
- prop_type, prop_name, map_field_to_graphene_read
861
+ prop_type, prop_name, map_field_to_graphene_read, prop_info
851
862
  )
852
863
  if v is not None
853
864
  },
@@ -871,13 +882,16 @@ def normalize_id_filter_value(
871
882
  value: object,
872
883
  ) -> object:
873
884
  """
874
- Convert equality filters marked as scalar identities to their native types.
885
+ Convert confirmed identity equality operands to their native types.
875
886
 
876
887
  Actual ORM primary keys use the declared constructor input, independent of
877
888
  the model column name. Raw relation references use the target field's
878
889
  ``to_python`` conversion, including ``to_field`` references. Ordered lookups
879
- and non-list/tuple ``in`` values pass through unchanged. Conversion preserves
880
- 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.
881
895
 
882
896
  Raises:
883
897
  Exceptions from ``Input.cast()`` or ORM field conversion propagate.
@@ -891,6 +905,22 @@ def normalize_id_filter_value(
891
905
  interface = getattr(field_type, "Interface", None)
892
906
  if interface is None:
893
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
+
894
924
  metadata = interface.get_attribute_types().get(attribute_name, {})
895
925
  if not metadata.get("is_identifier"):
896
926
  return value
@@ -915,10 +945,19 @@ def normalize_id_filter_value(
915
945
  if converter is None:
916
946
  return value
917
947
 
918
- if operator == "in":
919
- if not isinstance(value, (list, tuple)):
920
- return value
921
- 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)
922
961
  return converter(value)
923
962
 
924
963
 
@@ -1207,16 +1246,22 @@ def register_search_query(
1207
1246
  decision = getattr(permission_plan, "decision", "conditional")
1208
1247
  if decision == "deny_all":
1209
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
+ }
1210
1255
  backend_shape = get_backend_shape(manager_class)
1211
1256
  instance_check_reasons = resolve_instance_check_reasons(
1212
1257
  permission_plan,
1213
1258
  backend_shape=backend_shape,
1214
1259
  )
1215
1260
  filter_groups = (
1216
- parsed_filters or None
1261
+ manager_filters or None
1217
1262
  if decision == "allow_all"
1218
1263
  else merge_permission_filters(
1219
- parsed_filters,
1264
+ manager_filters,
1220
1265
  permission_plan.filters,
1221
1266
  )
1222
1267
  )
@@ -55,7 +55,7 @@ class GraphQLPropertyTimeoutConfigurationError(ValueError):
55
55
  class GraphQLProperty(property):
56
56
  """Descriptor that exposes a resolver with GraphQL metadata and caching.
57
57
 
58
- Stable inspection attributes are `sortable`, `filterable`,
58
+ Stable inspection attributes are `sortable`, `filterable`, `is_identifier`,
59
59
  `query_annotation`, `cache`, `timeout`, `warm_up`, and `graphql_type_hint`.
60
60
  The descriptor preserves normal `property` behavior such as `fget` and
61
61
  `__doc__`, but those values follow Python's property/wraps mechanics rather
@@ -66,6 +66,7 @@ class GraphQLProperty(property):
66
66
 
67
67
  sortable: bool
68
68
  filterable: bool
69
+ is_identifier: bool
69
70
  warm_up: bool
70
71
  query_annotation: object | None
71
72
  timeout: int | None
@@ -77,6 +78,7 @@ class GraphQLProperty(property):
77
78
  *,
78
79
  sortable: bool = False,
79
80
  filterable: bool = False,
81
+ is_identifier: bool = False,
80
82
  query_annotation: object | None = None,
81
83
  cache: GraphQLPropertyCache = "none",
82
84
  timeout: int | None = None,
@@ -101,6 +103,10 @@ class GraphQLProperty(property):
101
103
  filterable: Whether generated GraphQL fields may expose filtering
102
104
  for this property. Stored as supplied; runtime truthiness is not
103
105
  coerced or validated.
106
+ is_identifier: Declare native integer, string, or UUID identities,
107
+ either scalar or a homogeneous list, tuple, or set. Generates
108
+ GraphQL ID output without changing Python values. Unsupported
109
+ annotations raise TypeError during schema generation.
104
110
  query_annotation: Opaque ORM annotation object or callable consumed
105
111
  by database bucket query construction.
106
112
  cache: Resolver cache scope. `"none"` evaluates every access,
@@ -160,6 +166,7 @@ class GraphQLProperty(property):
160
166
 
161
167
  self.sortable = sortable
162
168
  self.filterable = filterable
169
+ self.is_identifier = is_identifier
163
170
  self.query_annotation = query_annotation
164
171
  self.cache = cache
165
172
  self.timeout = timeout
@@ -276,6 +283,7 @@ def graph_ql_property(
276
283
  *,
277
284
  sortable: bool = False,
278
285
  filterable: bool = False,
286
+ is_identifier: bool = False,
279
287
  query_annotation: object | None = None,
280
288
  cache: GraphQLPropertyCache = "run",
281
289
  timeout: int | None = None,
@@ -290,6 +298,7 @@ def graph_ql_property(
290
298
  *,
291
299
  sortable: bool = False,
292
300
  filterable: bool = False,
301
+ is_identifier: bool = False,
293
302
  query_annotation: object | None = None,
294
303
  cache: GraphQLPropertyCache = "run",
295
304
  timeout: int | None = None,
@@ -307,6 +316,13 @@ def graph_ql_property(
307
316
  property.
308
317
  filterable: Whether generated GraphQL fields may expose filtering for
309
318
  this property.
319
+ is_identifier: Explicitly declare native integer, string, or UUID
320
+ identities. Scalars map to ID and homogeneous list, tuple, or set
321
+ collections to [ID], preserving nullable property output and native
322
+ Python values. Optional annotations and optional elements are
323
+ supported. Manager objects, nested collections, ambiguous unions,
324
+ and other scalar types raise TypeError during schema generation.
325
+ Names and query_annotation never infer this flag. Defaults to False.
310
326
  query_annotation: Opaque ORM annotation object or callable consumed by
311
327
  database bucket query construction.
312
328
  cache: Cache scope. `"run"` is the default and memoizes only within the
@@ -354,6 +370,7 @@ def graph_ql_property(
354
370
  sortable=sortable,
355
371
  query_annotation=query_annotation,
356
372
  filterable=filterable,
373
+ is_identifier=is_identifier,
357
374
  cache=cache,
358
375
  timeout=timeout,
359
376
  warm_up=warm_up,
File without changes