GeneralManager 0.86.4__tar.gz → 0.86.6__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.
- {generalmanager-0.86.4/src/GeneralManager.egg-info → generalmanager-0.86.6}/PKG-INFO +1 -1
- {generalmanager-0.86.4 → generalmanager-0.86.6}/pyproject.toml +1 -1
- {generalmanager-0.86.4 → generalmanager-0.86.6/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/GeneralManager.egg-info/SOURCES.txt +1 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_mutations.py +59 -9
- generalmanager-0.86.6/src/general_manager/api/mutation_controls.py +5 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/remote_api.py +2 -4
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/requests.py +38 -3
- {generalmanager-0.86.4 → generalmanager-0.86.6}/LICENSE +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/README.md +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/setup.cfg +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_identifiers.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/apps.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/batch_refresh.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/transaction_barrier.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/routing.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/conf.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/logging.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/search_reconcile.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/sync_read_only.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/bulk_create.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/public_api_registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/py.typed +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/identity.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/invalidation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/tests/test_settings.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/tests/test_urls.py +0 -0
- {generalmanager-0.86.4 → generalmanager-0.86.6}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.6
|
|
4
4
|
Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
|
|
5
5
|
Author-email: Tim Kleindick <tkleindick@yahoo.de>
|
|
6
6
|
License: MIT License
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "GeneralManager"
|
|
7
|
-
version = "0.86.
|
|
7
|
+
version = "0.86.6"
|
|
8
8
|
description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.6
|
|
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
|
|
@@ -50,6 +50,7 @@ src/general_manager/api/graphql_warmup.py
|
|
|
50
50
|
src/general_manager/api/graphql_warmup_registry.py
|
|
51
51
|
src/general_manager/api/graphql_warmup_tasks.py
|
|
52
52
|
src/general_manager/api/mutation.py
|
|
53
|
+
src/general_manager/api/mutation_controls.py
|
|
53
54
|
src/general_manager/api/notification_batching.py
|
|
54
55
|
src/general_manager/api/property.py
|
|
55
56
|
src/general_manager/api/registry.py
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_mutations.py
RENAMED
|
@@ -21,6 +21,7 @@ from django.db import models
|
|
|
21
21
|
from django.core.exceptions import FieldDoesNotExist
|
|
22
22
|
|
|
23
23
|
from general_manager.interface.base_interface import AttributeTypedDict, InterfaceBase
|
|
24
|
+
from general_manager.api.mutation_controls import MUTATION_CONTROL_KEYS
|
|
24
25
|
from general_manager.api.graphql_relations import (
|
|
25
26
|
get_graphql_manager_registry,
|
|
26
27
|
resolve_general_manager_type,
|
|
@@ -55,6 +56,33 @@ class _UnsetHistoryComment:
|
|
|
55
56
|
_HISTORY_COMMENT_UNSET = _UnsetHistoryComment()
|
|
56
57
|
|
|
57
58
|
|
|
59
|
+
class ReservedMutationControlFieldError(ValueError):
|
|
60
|
+
"""Raised when an editable field collides with manager execution metadata."""
|
|
61
|
+
|
|
62
|
+
def __init__(self, field_name: str) -> None:
|
|
63
|
+
super().__init__(
|
|
64
|
+
f"Editable GraphQL field {field_name!r} collides with a reserved "
|
|
65
|
+
"manager mutation control. Rename the field or make it read-only."
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ReservedMutationControlInputError(GraphQLError):
|
|
70
|
+
"""Report client input attempting to override trusted authorization metadata."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, key: str) -> None:
|
|
73
|
+
super().__init__(
|
|
74
|
+
f"Mutation input cannot include reserved key {key!r}.",
|
|
75
|
+
extensions={"code": "BAD_USER_INPUT"},
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _reject_mutation_authorization_controls(kwargs: MutationPayload) -> None:
|
|
80
|
+
"""Allow audit comments but reject client-controlled authorization metadata."""
|
|
81
|
+
for key in sorted(MUTATION_CONTROL_KEYS - {"history_comment"}):
|
|
82
|
+
if key in kwargs:
|
|
83
|
+
raise ReservedMutationControlInputError(key)
|
|
84
|
+
|
|
85
|
+
|
|
58
86
|
class _EditableGrapheneField(Protocol):
|
|
59
87
|
"""Graphene field instance carrying GeneralManager's dynamic editability flag."""
|
|
60
88
|
|
|
@@ -168,8 +196,10 @@ def _normalize_mutation_kwargs_for_manager(
|
|
|
168
196
|
ORM mutation capabilities expect ``field_id``/``field_id_list`` for manager
|
|
169
197
|
relations. Structured references pass through their manager constructor so
|
|
170
198
|
all declared inputs are validated. Scalar reference values stay unchanged.
|
|
171
|
-
Unknown keys and already-normalized keys are preserved
|
|
199
|
+
Unknown keys and already-normalized keys are preserved, except reserved
|
|
200
|
+
authorization controls, which are rejected before and after normalization.
|
|
172
201
|
"""
|
|
202
|
+
_reject_mutation_authorization_controls(kwargs)
|
|
173
203
|
interface_cls = getattr(general_manager_class, "Interface", None)
|
|
174
204
|
if interface_cls is None:
|
|
175
205
|
return dict(kwargs)
|
|
@@ -233,6 +263,7 @@ def _normalize_mutation_kwargs_for_manager(
|
|
|
233
263
|
)
|
|
234
264
|
normalized.pop(key, None)
|
|
235
265
|
|
|
266
|
+
_reject_mutation_authorization_controls(normalized)
|
|
236
267
|
return normalized
|
|
237
268
|
|
|
238
269
|
|
|
@@ -351,6 +382,10 @@ def create_write_fields(
|
|
|
351
382
|
Mapping from attribute name to a Graphene input field instance. Returned
|
|
352
383
|
fields carry a dynamic maintainer-facing ``editable`` flag used by the
|
|
353
384
|
generated mutation class builders.
|
|
385
|
+
|
|
386
|
+
Raises:
|
|
387
|
+
ReservedMutationControlFieldError: An editable field or its normalized
|
|
388
|
+
relation alias collides with reserved manager mutation metadata.
|
|
354
389
|
"""
|
|
355
390
|
fields: GrapheneFieldMap = {}
|
|
356
391
|
attribute_types = interface_cls.get_attribute_types()
|
|
@@ -360,6 +395,8 @@ def create_write_fields(
|
|
|
360
395
|
continue
|
|
361
396
|
if info["is_derived"]:
|
|
362
397
|
continue
|
|
398
|
+
if info["is_editable"] and name in MUTATION_CONTROL_KEYS:
|
|
399
|
+
raise ReservedMutationControlFieldError(name)
|
|
363
400
|
if _is_direct_relation_raw_id_alias(
|
|
364
401
|
name,
|
|
365
402
|
attribute_types,
|
|
@@ -375,6 +412,13 @@ def create_write_fields(
|
|
|
375
412
|
if default is NOT_PROVIDED or callable(default):
|
|
376
413
|
default = Undefined
|
|
377
414
|
manager_type = resolve_general_manager_type(typ, manager_registry)
|
|
415
|
+
if (
|
|
416
|
+
info["is_editable"]
|
|
417
|
+
and manager_type is not None
|
|
418
|
+
and not name.endswith(("_id", "_list"))
|
|
419
|
+
and f"{name}_id" in MUTATION_CONTROL_KEYS
|
|
420
|
+
):
|
|
421
|
+
raise ReservedMutationControlFieldError(name)
|
|
378
422
|
|
|
379
423
|
fld: object
|
|
380
424
|
if info.get("orm_field_kind") in {"file", "image"}:
|
|
@@ -477,6 +521,7 @@ def generate_create_mutation_class(
|
|
|
477
521
|
for field_name, value in kwargs.items()
|
|
478
522
|
if value is not NOT_PROVIDED
|
|
479
523
|
}
|
|
524
|
+
_reject_mutation_authorization_controls(kwargs)
|
|
480
525
|
_preflight_mutation_uploads(
|
|
481
526
|
info=info,
|
|
482
527
|
general_manager_class=generalManagerClass,
|
|
@@ -488,12 +533,14 @@ def generate_create_mutation_class(
|
|
|
488
533
|
kwargs = _normalize_mutation_kwargs_for_manager(generalManagerClass, kwargs)
|
|
489
534
|
history_comment = _pop_history_comment(kwargs)
|
|
490
535
|
create = cast(_ManagerCreateMethod, generalManagerClass.create)
|
|
491
|
-
create_kwargs = {"creator_id": info.context.user.id, **kwargs}
|
|
492
536
|
if isinstance(history_comment, _UnsetHistoryComment):
|
|
493
|
-
instance = create(**
|
|
537
|
+
instance = create(creator_id=info.context.user.id, **kwargs)
|
|
494
538
|
else:
|
|
495
|
-
|
|
496
|
-
|
|
539
|
+
instance = create(
|
|
540
|
+
creator_id=info.context.user.id,
|
|
541
|
+
history_comment=history_comment,
|
|
542
|
+
**kwargs,
|
|
543
|
+
)
|
|
497
544
|
except GraphQLError:
|
|
498
545
|
raise
|
|
499
546
|
except Exception as error:
|
|
@@ -587,6 +634,7 @@ def generate_update_mutation_class(
|
|
|
587
634
|
for field_name, value in kwargs.items()
|
|
588
635
|
if value is not NOT_PROVIDED
|
|
589
636
|
}
|
|
637
|
+
_reject_mutation_authorization_controls(kwargs)
|
|
590
638
|
_preflight_mutation_uploads(
|
|
591
639
|
info=info,
|
|
592
640
|
general_manager_class=generalManagerClass,
|
|
@@ -600,12 +648,14 @@ def generate_update_mutation_class(
|
|
|
600
648
|
update = cast(
|
|
601
649
|
_ManagerUpdateMethod, generalManagerClass(**identification).update
|
|
602
650
|
)
|
|
603
|
-
update_kwargs = {"creator_id": info.context.user.id, **kwargs}
|
|
604
651
|
if isinstance(history_comment, _UnsetHistoryComment):
|
|
605
|
-
instance = update(**
|
|
652
|
+
instance = update(creator_id=info.context.user.id, **kwargs)
|
|
606
653
|
else:
|
|
607
|
-
|
|
608
|
-
|
|
654
|
+
instance = update(
|
|
655
|
+
creator_id=info.context.user.id,
|
|
656
|
+
history_comment=history_comment,
|
|
657
|
+
**kwargs,
|
|
658
|
+
)
|
|
609
659
|
except GraphQLError:
|
|
610
660
|
raise
|
|
611
661
|
except Exception as error:
|
|
@@ -16,6 +16,7 @@ from django.http import HttpRequest, HttpResponse, JsonResponse
|
|
|
16
16
|
from django.urls import URLPattern, path
|
|
17
17
|
|
|
18
18
|
from general_manager.logging import get_logger
|
|
19
|
+
from general_manager.api.mutation_controls import MUTATION_CONTROL_KEYS
|
|
19
20
|
from general_manager.bucket._ordering import normalize_ordering
|
|
20
21
|
from general_manager.bucket.request_bucket import RequestBucket
|
|
21
22
|
|
|
@@ -25,9 +26,6 @@ if TYPE_CHECKING:
|
|
|
25
26
|
logger = get_logger("api.remote")
|
|
26
27
|
|
|
27
28
|
_SEGMENT_RE = re.compile(r"^[a-z0-9]+(?:-[a-z0-9]+)*$")
|
|
28
|
-
_MUTATION_CONTROL_KEYS = frozenset(
|
|
29
|
-
{"ignore_permission", "creator_id", "history_comment"}
|
|
30
|
-
)
|
|
31
29
|
_MUTATION_METADATA_KEY = "__metadata__"
|
|
32
30
|
_MUTATION_METADATA_FIELDS = frozenset({"history_comment"})
|
|
33
31
|
RemoteAPIView = Callable[[HttpRequest], HttpResponse]
|
|
@@ -432,7 +430,7 @@ def _parse_json_body(request: HttpRequest) -> RemoteJSONPayload:
|
|
|
432
430
|
def _parse_mutation_body(request: HttpRequest) -> tuple[RemoteJSONPayload, str | None]:
|
|
433
431
|
"""Separate schema values from supported remote mutation metadata."""
|
|
434
432
|
payload = _parse_json_body(request)
|
|
435
|
-
for control_key in
|
|
433
|
+
for control_key in MUTATION_CONTROL_KEYS:
|
|
436
434
|
if control_key in payload:
|
|
437
435
|
raise RemoteAPIRequestError.reserved_mutation_control(control_key)
|
|
438
436
|
|
|
@@ -5,19 +5,22 @@ from __future__ import annotations
|
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
6
|
import base64
|
|
7
7
|
from dataclasses import dataclass, field
|
|
8
|
+
from email.message import Message
|
|
8
9
|
import json
|
|
9
10
|
import random
|
|
10
11
|
from types import MappingProxyType
|
|
11
12
|
import time
|
|
12
13
|
from urllib.error import HTTPError, URLError
|
|
13
14
|
from urllib.parse import quote, urlencode, urlsplit
|
|
14
|
-
from urllib.request import Request as UrlRequest,
|
|
15
|
+
from urllib.request import HTTPRedirectHandler, Request as UrlRequest, build_opener
|
|
15
16
|
from uuid import uuid4
|
|
16
17
|
from typing import (
|
|
17
18
|
Callable,
|
|
19
|
+
IO,
|
|
18
20
|
Iterable,
|
|
19
21
|
Literal,
|
|
20
22
|
Mapping,
|
|
23
|
+
NoReturn,
|
|
21
24
|
Protocol,
|
|
22
25
|
TypeVar,
|
|
23
26
|
TypedDict,
|
|
@@ -1893,12 +1896,42 @@ def map_request_transport_error(
|
|
|
1893
1896
|
return mapped
|
|
1894
1897
|
|
|
1895
1898
|
|
|
1899
|
+
class _NoRedirectHandler(HTTPRedirectHandler):
|
|
1900
|
+
"""Leave redirect responses to the normal HTTP error handling path."""
|
|
1901
|
+
|
|
1902
|
+
def http_error_302(
|
|
1903
|
+
self,
|
|
1904
|
+
req: UrlRequest,
|
|
1905
|
+
fp: IO[bytes],
|
|
1906
|
+
code: int,
|
|
1907
|
+
msg: str,
|
|
1908
|
+
headers: Message,
|
|
1909
|
+
) -> NoReturn:
|
|
1910
|
+
# Reject before urllib parses Location, preserving malformed responses too.
|
|
1911
|
+
raise HTTPError(req.full_url, code, msg, headers, fp)
|
|
1912
|
+
|
|
1913
|
+
http_error_301 = http_error_302
|
|
1914
|
+
http_error_303 = http_error_302
|
|
1915
|
+
http_error_307 = http_error_302
|
|
1916
|
+
http_error_308 = http_error_302
|
|
1917
|
+
|
|
1918
|
+
|
|
1896
1919
|
class UrllibRequestTransport(SharedRequestTransport):
|
|
1897
1920
|
"""First-party JSON transport backed by Python's stdlib HTTP client.
|
|
1898
1921
|
|
|
1899
1922
|
The transport supports absolute HTTP(S) URLs, JSON request bodies, decoded
|
|
1900
1923
|
JSON object/list responses, operation-level timeout overrides, and HTTP
|
|
1901
|
-
status mapping through `RequestTransportStatusError`.
|
|
1924
|
+
status mapping through `RequestTransportStatusError`. The default opener
|
|
1925
|
+
rejects redirects, including same-origin redirects, instead of forwarding
|
|
1926
|
+
credentials or accessing response-controlled destinations. An injected
|
|
1927
|
+
`urlopen` callable is responsible for its own redirect policy.
|
|
1928
|
+
|
|
1929
|
+
The default opener does not inherit handlers registered globally with
|
|
1930
|
+
`urllib.request.install_opener`; environment proxy settings still apply.
|
|
1931
|
+
For custom TLS contexts or explicit proxy handlers, build an opener with
|
|
1932
|
+
those handlers plus redirect rejection and pass its `open` method as
|
|
1933
|
+
`urlopen`. Reject 301/302/303/307/308 before parsing `Location` to preserve
|
|
1934
|
+
the upstream status and headers even when that header is malformed.
|
|
1902
1935
|
"""
|
|
1903
1936
|
|
|
1904
1937
|
def __init__(
|
|
@@ -1907,7 +1940,9 @@ class UrllibRequestTransport(SharedRequestTransport):
|
|
|
1907
1940
|
urlopen: UrlopenCallable | None = None,
|
|
1908
1941
|
json_dumps: Callable[[object], str] | None = None,
|
|
1909
1942
|
) -> None:
|
|
1910
|
-
self._urlopen = urlopen or
|
|
1943
|
+
self._urlopen = urlopen or cast(
|
|
1944
|
+
UrlopenCallable, build_opener(_NoRedirectHandler()).open
|
|
1945
|
+
)
|
|
1911
1946
|
self._json_dumps = json_dumps or json.dumps
|
|
1912
1947
|
|
|
1913
1948
|
def send(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/GeneralManager.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/_types/general_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_identifiers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_relations.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_resolvers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_warmup_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/graphql_warmup_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/notification_batching.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/api/remote_invalidation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/_materialized_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/calculation_bucket.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/database_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/bucket/request_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/_dependency_graph.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/cache_decorator.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/data_change_context.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_cache.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_index.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_matching.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_publish.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/dependency_shards.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/run_context_lru.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/cache/transaction_barrier.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/diagnostics.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/fingerprints.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/evals/judges/contract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/calculations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/evidence.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/provider_calls.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/resolver.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/scheduler.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/synthesis.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/planned/validation.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/__init__.py
RENAMED
|
File without changes
|
{generalmanager-0.86.4 → generalmanager-0.86.6}/src/general_manager/chat/providers/_shared.py
RENAMED
|
File without changes
|