GeneralManager 0.86.8__tar.gz → 0.86.10__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {generalmanager-0.86.8/src/GeneralManager.egg-info → generalmanager-0.86.10}/PKG-INFO +1 -1
- {generalmanager-0.86.8 → generalmanager-0.86.10}/pyproject.toml +1 -1
- {generalmanager-0.86.8 → generalmanager-0.86.10/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_resolvers.py +7 -4
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_api.py +145 -18
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/calculation_bucket.py +18 -2
- {generalmanager-0.86.8 → generalmanager-0.86.10}/LICENSE +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/README.md +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/setup.cfg +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_identifiers.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/mutation_controls.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/apps.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/batch_refresh.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/transaction_barrier.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/routing.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/conf.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/logging.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/search_reconcile.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/sync_read_only.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/bulk_create.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/public_api_registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/py.typed +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/identity.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/invalidation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/test_settings.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/test_urls.py +0 -0
- {generalmanager-0.86.8 → generalmanager-0.86.10}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.10
|
|
4
4
|
Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
|
|
5
5
|
Author-email: Tim Kleindick <tkleindick@yahoo.de>
|
|
6
6
|
License: MIT License
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "GeneralManager"
|
|
7
|
-
version = "0.86.
|
|
7
|
+
version = "0.86.10"
|
|
8
8
|
description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.86.
|
|
3
|
+
Version: 0.86.10
|
|
4
4
|
Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
|
|
5
5
|
Author-email: Tim Kleindick <tkleindick@yahoo.de>
|
|
6
6
|
License: MIT License
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_resolvers.py
RENAMED
|
@@ -68,6 +68,9 @@ from general_manager.utils.type_checks import safe_issubclass
|
|
|
68
68
|
|
|
69
69
|
if TYPE_CHECKING:
|
|
70
70
|
from graphene import ResolveInfo as GraphQLResolveInfo
|
|
71
|
+
from general_manager.api.graphql_errors import (
|
|
72
|
+
GraphQLResolveInfo as ReadPermissionInfo,
|
|
73
|
+
)
|
|
71
74
|
from general_manager.permission.base_permission import (
|
|
72
75
|
BasePermission,
|
|
73
76
|
ReadPermissionPlan,
|
|
@@ -487,7 +490,7 @@ def apply_permission_filters(
|
|
|
487
490
|
def apply_read_authorization(
|
|
488
491
|
queryset: Bucket[GeneralManagerT],
|
|
489
492
|
general_manager_class: type[GeneralManagerT],
|
|
490
|
-
info:
|
|
493
|
+
info: ReadPermissionInfo,
|
|
491
494
|
*,
|
|
492
495
|
source: str,
|
|
493
496
|
) -> ReadAuthorizationResult[GeneralManagerT]:
|
|
@@ -517,7 +520,7 @@ def apply_read_authorization(
|
|
|
517
520
|
def finalize_read_authorization(
|
|
518
521
|
preparation: ReadAuthorizationPreparation[GeneralManagerT],
|
|
519
522
|
general_manager_class: type[GeneralManagerT],
|
|
520
|
-
info:
|
|
523
|
+
info: ReadPermissionInfo,
|
|
521
524
|
*,
|
|
522
525
|
source: str,
|
|
523
526
|
) -> ReadAuthorizationResult[GeneralManagerT]:
|
|
@@ -565,7 +568,7 @@ def finalize_read_authorization(
|
|
|
565
568
|
def prepare_read_authorization(
|
|
566
569
|
queryset: Bucket[GeneralManagerT],
|
|
567
570
|
general_manager_class: type[GeneralManagerT],
|
|
568
|
-
info:
|
|
571
|
+
info: ReadPermissionInfo,
|
|
569
572
|
*,
|
|
570
573
|
permission_plan: ReadPermissionPlan | None = None,
|
|
571
574
|
) -> ReadAuthorizationPreparation[GeneralManagerT]:
|
|
@@ -639,7 +642,7 @@ def prepare_read_authorization(
|
|
|
639
642
|
def filter_queryset_by_read_permission(
|
|
640
643
|
queryset: Bucket[GeneralManagerT],
|
|
641
644
|
general_manager_class: type[GeneralManagerT],
|
|
642
|
-
info:
|
|
645
|
+
info: ReadPermissionInfo,
|
|
643
646
|
*,
|
|
644
647
|
requires_instance_check: bool = True,
|
|
645
648
|
instance_check_reasons: tuple[str, ...] = (),
|
|
@@ -8,6 +8,8 @@ from uuid import uuid4
|
|
|
8
8
|
from collections.abc import Iterable, Iterator, Mapping
|
|
9
9
|
from dataclasses import dataclass
|
|
10
10
|
from importlib import import_module
|
|
11
|
+
from itertools import islice
|
|
12
|
+
from types import SimpleNamespace
|
|
11
13
|
from typing import Callable, Protocol, TYPE_CHECKING, cast
|
|
12
14
|
|
|
13
15
|
from django.conf import settings
|
|
@@ -16,11 +18,24 @@ from django.http import HttpRequest, HttpResponse, JsonResponse
|
|
|
16
18
|
from django.urls import URLPattern, path
|
|
17
19
|
|
|
18
20
|
from general_manager.logging import get_logger
|
|
21
|
+
from general_manager.conf import get_setting
|
|
19
22
|
from general_manager.api.mutation_controls import MUTATION_CONTROL_KEYS
|
|
20
23
|
from general_manager.bucket._ordering import normalize_ordering
|
|
21
24
|
from general_manager.bucket.request_bucket import RequestBucket
|
|
25
|
+
from general_manager.bucket.base_bucket import Bucket
|
|
26
|
+
from general_manager.bucket._materialized_bucket import MaterializedBucket
|
|
27
|
+
from general_manager.api.property import GraphQLProperty
|
|
28
|
+
from general_manager.api.graphql_errors import get_read_permission_filter
|
|
29
|
+
from general_manager.api.graphql_resolvers import (
|
|
30
|
+
check_read_permission_for_user,
|
|
31
|
+
finalize_read_authorization,
|
|
32
|
+
prepare_read_authorization,
|
|
33
|
+
)
|
|
22
34
|
|
|
23
35
|
if TYPE_CHECKING:
|
|
36
|
+
from general_manager.api.graphql_errors import (
|
|
37
|
+
GraphQLResolveInfo as ReadPermissionInfo,
|
|
38
|
+
)
|
|
24
39
|
from general_manager.manager.general_manager import GeneralManager
|
|
25
40
|
|
|
26
41
|
logger = get_logger("api.remote")
|
|
@@ -95,6 +110,12 @@ class RemoteAPIManagerClass(Protocol):
|
|
|
95
110
|
class RemoteAPIConfigurationError(ValueError):
|
|
96
111
|
"""Raised when RemoteAPI declarations are invalid."""
|
|
97
112
|
|
|
113
|
+
@classmethod
|
|
114
|
+
def invalid_page_limits(cls) -> "RemoteAPIConfigurationError":
|
|
115
|
+
return cls(
|
|
116
|
+
"RemoteAPI page limits must be positive integers and default must not exceed maximum"
|
|
117
|
+
)
|
|
118
|
+
|
|
98
119
|
@classmethod
|
|
99
120
|
def empty_segments(cls, base_path: str) -> "RemoteAPIConfigurationError":
|
|
100
121
|
return cls(
|
|
@@ -145,8 +166,11 @@ class RemoteAPIConfigurationError(ValueError):
|
|
|
145
166
|
class InvalidRemotePaginationError(ValueError):
|
|
146
167
|
"""Raised when remote query controls cannot produce a valid page."""
|
|
147
168
|
|
|
148
|
-
def __init__(self) -> None:
|
|
149
|
-
|
|
169
|
+
def __init__(self, max_size: int | None = None) -> None:
|
|
170
|
+
message = "page and page_size must be positive integers"
|
|
171
|
+
if max_size is not None:
|
|
172
|
+
message = f"page_size must not exceed {max_size}"
|
|
173
|
+
super().__init__(message)
|
|
150
174
|
|
|
151
175
|
|
|
152
176
|
class RemoteAPIRequestError(ValueError):
|
|
@@ -470,8 +494,63 @@ def _request_id(
|
|
|
470
494
|
return f"gm-{prefix}-{uuid4()}"
|
|
471
495
|
|
|
472
496
|
|
|
473
|
-
def
|
|
474
|
-
|
|
497
|
+
def _read_permission_info(request: HttpRequest) -> ReadPermissionInfo:
|
|
498
|
+
"""Adapt the request principal to the shared read-authorization context."""
|
|
499
|
+
from django.contrib.auth.models import AnonymousUser
|
|
500
|
+
|
|
501
|
+
user = getattr(request, "user", None)
|
|
502
|
+
return SimpleNamespace(
|
|
503
|
+
context=SimpleNamespace(user=AnonymousUser() if user is None else user)
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
def _serialize_manager(
|
|
508
|
+
manager: "GeneralManager", request: HttpRequest
|
|
509
|
+
) -> RemoteJSONPayload:
|
|
510
|
+
"""Resolve only fields the caller may read, without iterating their values."""
|
|
511
|
+
manager._ensure_manager_state_valid()
|
|
512
|
+
user = _read_permission_info(request).context.user
|
|
513
|
+
field_names = dict.fromkeys(manager._attributes)
|
|
514
|
+
for name, value in manager.__class__.__dict__.items():
|
|
515
|
+
if name == "history" or getattr(
|
|
516
|
+
value, "_general_manager_generated_relation", False
|
|
517
|
+
):
|
|
518
|
+
continue
|
|
519
|
+
if isinstance(value, (GraphQLProperty, property)):
|
|
520
|
+
field_names[name] = None
|
|
521
|
+
return {
|
|
522
|
+
name: getattr(manager, name)
|
|
523
|
+
for name in field_names
|
|
524
|
+
if check_read_permission_for_user(manager, user, name)
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def _serialize_readable_manager(
|
|
529
|
+
manager: "GeneralManager", request: HttpRequest, *, require_read: bool = False
|
|
530
|
+
) -> RemoteJSONList:
|
|
531
|
+
"""Apply the row policy to detail and mutation results before field reads."""
|
|
532
|
+
info = _read_permission_info(request)
|
|
533
|
+
permission_plan = get_read_permission_filter(type(manager), info)
|
|
534
|
+
source: Bucket[GeneralManager] = MaterializedBucket(type(manager), [manager])
|
|
535
|
+
if permission_plan.decision == "conditional" and any(
|
|
536
|
+
constraint.get("filter") or constraint.get("exclude")
|
|
537
|
+
for constraint in permission_plan.filters
|
|
538
|
+
):
|
|
539
|
+
# Database subsets must retain ORM lookup semantics (including excludes).
|
|
540
|
+
source = type(manager).all().with_instances([manager])
|
|
541
|
+
preparation = prepare_read_authorization(
|
|
542
|
+
source, type(manager), info, permission_plan=permission_plan
|
|
543
|
+
)
|
|
544
|
+
authorized = finalize_read_authorization(
|
|
545
|
+
preparation,
|
|
546
|
+
type(manager),
|
|
547
|
+
info,
|
|
548
|
+
source="remote_detail",
|
|
549
|
+
).queryset
|
|
550
|
+
items = [_serialize_manager(item, request) for item in authorized]
|
|
551
|
+
if require_read and not items:
|
|
552
|
+
raise PermissionError
|
|
553
|
+
return items
|
|
475
554
|
|
|
476
555
|
|
|
477
556
|
def _success_payload(
|
|
@@ -579,19 +658,26 @@ def _apply_ordering(
|
|
|
579
658
|
def _resolve_remote_pagination(
|
|
580
659
|
page: object,
|
|
581
660
|
page_size: object,
|
|
582
|
-
) -> tuple[int, int]
|
|
583
|
-
"""
|
|
584
|
-
|
|
585
|
-
|
|
661
|
+
) -> tuple[int, int]:
|
|
662
|
+
"""Apply finite server-owned defaults and reject oversized client pages."""
|
|
663
|
+
default_size = get_setting("REMOTE_API_DEFAULT_PAGE_SIZE", 10)
|
|
664
|
+
max_size = get_setting("REMOTE_API_MAX_PAGE_SIZE", 100)
|
|
665
|
+
for value in (default_size, max_size):
|
|
666
|
+
if not isinstance(value, int) or isinstance(value, bool) or value <= 0:
|
|
667
|
+
raise RemoteAPIConfigurationError.invalid_page_limits()
|
|
668
|
+
default_size = cast(int, default_size)
|
|
669
|
+
max_size = cast(int, max_size)
|
|
670
|
+
if default_size > max_size:
|
|
671
|
+
raise RemoteAPIConfigurationError.invalid_page_limits()
|
|
586
672
|
for value in (page, page_size):
|
|
587
673
|
if value is not None and (
|
|
588
674
|
not isinstance(value, int) or isinstance(value, bool) or value <= 0
|
|
589
675
|
):
|
|
590
676
|
raise InvalidRemotePaginationError()
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
)
|
|
677
|
+
effective_size = default_size if page_size is None else cast(int, page_size)
|
|
678
|
+
if effective_size > max_size:
|
|
679
|
+
raise InvalidRemotePaginationError(max_size)
|
|
680
|
+
return (1 if page is None else cast(int, page), effective_size)
|
|
595
681
|
|
|
596
682
|
|
|
597
683
|
@dataclass(frozen=True, slots=True)
|
|
@@ -632,6 +718,9 @@ def _forward_remote_request_controls(
|
|
|
632
718
|
"""Compile supported page and ordering controls into one remote request."""
|
|
633
719
|
if not _is_remote_request_bucket(bucket):
|
|
634
720
|
return bucket, False
|
|
721
|
+
# Snapshots have no upstream plan: controls would become local field filters.
|
|
722
|
+
if cast("RequestBucket[GeneralManager]", bucket).request_plan is None:
|
|
723
|
+
return bucket, False
|
|
635
724
|
ordering_values = [ordering] if isinstance(ordering, str) else list(ordering or ())
|
|
636
725
|
terms = normalize_ordering(ordering_values)
|
|
637
726
|
controls: dict[str, object] = {}
|
|
@@ -681,7 +770,23 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
681
770
|
body.get("page"),
|
|
682
771
|
body.get("page_size"),
|
|
683
772
|
)
|
|
773
|
+
info = _read_permission_info(request)
|
|
684
774
|
bucket = manager_cls.all()
|
|
775
|
+
permission_plan = get_read_permission_filter(config.manager_cls, info)
|
|
776
|
+
request_alternatives = (
|
|
777
|
+
isinstance(bucket, RequestBucket) and len(permission_plan.filters) > 1
|
|
778
|
+
)
|
|
779
|
+
if request_alternatives and (pagination is not None or ordering):
|
|
780
|
+
raise UnsupportedRequestGlobalOperationError(
|
|
781
|
+
"pagination" if pagination is not None else "ordering"
|
|
782
|
+
)
|
|
783
|
+
preparation = prepare_read_authorization(
|
|
784
|
+
cast("Bucket[GeneralManager]", bucket),
|
|
785
|
+
config.manager_cls,
|
|
786
|
+
info,
|
|
787
|
+
permission_plan=permission_plan,
|
|
788
|
+
)
|
|
789
|
+
bucket = cast(RemoteAPIBucket, preparation.queryset)
|
|
685
790
|
if filters:
|
|
686
791
|
bucket = bucket.filter(**cast(Mapping[str, object], filters))
|
|
687
792
|
if excludes:
|
|
@@ -691,7 +796,13 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
691
796
|
pagination,
|
|
692
797
|
ordering,
|
|
693
798
|
)
|
|
694
|
-
|
|
799
|
+
# A union materializes request branches and loses their completeness.
|
|
800
|
+
# Without that provenance we cannot claim a global authorized count.
|
|
801
|
+
provenance = (
|
|
802
|
+
RequestQueryProvenance(None, None, None, False)
|
|
803
|
+
if request_alternatives
|
|
804
|
+
else _request_query_provenance(bucket)
|
|
805
|
+
)
|
|
695
806
|
if provenance is not None and not provenance.is_complete:
|
|
696
807
|
if pagination is not None and pagination != (
|
|
697
808
|
provenance.page,
|
|
@@ -706,6 +817,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
706
817
|
and not remote_ordering_forwarded
|
|
707
818
|
):
|
|
708
819
|
raise UnsupportedRequestGlobalOperationError("ordering")
|
|
820
|
+
preparation.queryset = cast("Bucket[GeneralManager]", bucket)
|
|
821
|
+
authorization = finalize_read_authorization(
|
|
822
|
+
preparation, config.manager_cls, info, source="remote_query"
|
|
823
|
+
)
|
|
824
|
+
bucket = cast(RemoteAPIBucket, authorization.queryset)
|
|
709
825
|
bucket = (
|
|
710
826
|
bucket
|
|
711
827
|
if remote_ordering_forwarded
|
|
@@ -714,7 +830,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
714
830
|
total_count = (
|
|
715
831
|
bucket.count()
|
|
716
832
|
if provenance is None or provenance.is_complete
|
|
717
|
-
else
|
|
833
|
+
else (
|
|
834
|
+
None
|
|
835
|
+
if authorization.requires_instance_check
|
|
836
|
+
else provenance.total_count
|
|
837
|
+
)
|
|
718
838
|
)
|
|
719
839
|
upstream_page_matches = (
|
|
720
840
|
provenance is not None
|
|
@@ -726,7 +846,11 @@ def _build_query_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
726
846
|
start = (page - 1) * page_size
|
|
727
847
|
end = start + page_size
|
|
728
848
|
bucket = bucket[start:end]
|
|
729
|
-
|
|
849
|
+
# Matching upstream metadata does not guarantee a bounded response.
|
|
850
|
+
items = [
|
|
851
|
+
_serialize_manager(item, request)
|
|
852
|
+
for item in islice(bucket, pagination[1])
|
|
853
|
+
]
|
|
730
854
|
metadata_pagination = pagination
|
|
731
855
|
if metadata_pagination is None and provenance is not None:
|
|
732
856
|
metadata_pagination = (
|
|
@@ -811,8 +935,11 @@ def _build_item_view(config: RemoteAPIConfig) -> RemoteAPIItemView:
|
|
|
811
935
|
)
|
|
812
936
|
manager_cls = cast(RemoteAPIManagerClass, config.manager_cls)
|
|
813
937
|
detail_manager = manager_cls(id=_coerce_identifier(config, identifier))
|
|
938
|
+
items = _serialize_readable_manager(
|
|
939
|
+
detail_manager, request, require_read=True
|
|
940
|
+
)
|
|
814
941
|
return _success_payload(
|
|
815
|
-
items=
|
|
942
|
+
items=items,
|
|
816
943
|
config=config,
|
|
817
944
|
request_id=request_id,
|
|
818
945
|
)
|
|
@@ -837,7 +964,7 @@ def _build_item_view(config: RemoteAPIConfig) -> RemoteAPIItemView:
|
|
|
837
964
|
**payload,
|
|
838
965
|
)
|
|
839
966
|
return _success_payload(
|
|
840
|
-
items=
|
|
967
|
+
items=_serialize_readable_manager(updated, request),
|
|
841
968
|
config=config,
|
|
842
969
|
request_id=request_id,
|
|
843
970
|
)
|
|
@@ -925,7 +1052,7 @@ def _build_create_view(config: RemoteAPIConfig) -> RemoteAPIView:
|
|
|
925
1052
|
**payload,
|
|
926
1053
|
)
|
|
927
1054
|
return _success_payload(
|
|
928
|
-
items=
|
|
1055
|
+
items=_serialize_readable_manager(manager, request),
|
|
929
1056
|
config=config,
|
|
930
1057
|
request_id=request_id,
|
|
931
1058
|
status=201,
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/bucket/calculation_bucket.py
RENAMED
|
@@ -1283,11 +1283,27 @@ class CalculationBucket(Bucket[GeneralManagerType]):
|
|
|
1283
1283
|
**exclude_kwargs
|
|
1284
1284
|
)
|
|
1285
1285
|
else:
|
|
1286
|
-
filter_funcs =
|
|
1286
|
+
filter_funcs = [
|
|
1287
|
+
*field_filters.get("filter_funcs", []),
|
|
1288
|
+
*(
|
|
1289
|
+
create_filter_function(lookup, expected)
|
|
1290
|
+
for lookup, expected in field_filters.get(
|
|
1291
|
+
"filter_kwargs", {}
|
|
1292
|
+
).items()
|
|
1293
|
+
),
|
|
1294
|
+
]
|
|
1287
1295
|
for filter_func in filter_funcs:
|
|
1288
1296
|
possible_values = filter(filter_func, possible_values)
|
|
1289
1297
|
|
|
1290
|
-
exclude_funcs =
|
|
1298
|
+
exclude_funcs = [
|
|
1299
|
+
*field_excludes.get("filter_funcs", []),
|
|
1300
|
+
*(
|
|
1301
|
+
create_filter_function(lookup, expected)
|
|
1302
|
+
for lookup, expected in field_excludes.get(
|
|
1303
|
+
"filter_kwargs", {}
|
|
1304
|
+
).items()
|
|
1305
|
+
),
|
|
1306
|
+
]
|
|
1291
1307
|
for exclude_func in exclude_funcs:
|
|
1292
1308
|
possible_values = filter(
|
|
1293
1309
|
_build_exclude_filter(exclude_func), possible_values
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/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.8 → generalmanager-0.86.10}/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.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_identifiers.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_mutations.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_ordering.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_prefetch.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_relations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/graphql_warmup_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/mutation_controls.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/api/notification_batching.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/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.8 → generalmanager-0.86.10}/src/general_manager/bucket/_materialized_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/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.8 → generalmanager-0.86.10}/src/general_manager/bucket/request_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/_dependency_graph.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/cache_decorator.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/data_change_context.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_cache.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_index.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_matching.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_publish.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/dependency_shards.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/cache/run_context_lru.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/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.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/diagnostics.py
RENAMED
|
File without changes
|
{generalmanager-0.86.8 → generalmanager-0.86.10}/src/general_manager/chat/evals/fingerprints.py
RENAMED
|
File without changes
|