GeneralManager 0.90.0__tar.gz → 0.91.1__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.90.0/src/GeneralManager.egg-info → generalmanager-0.91.1}/PKG-INFO +1 -1
- {generalmanager-0.90.0 → generalmanager-0.91.1}/pyproject.toml +1 -1
- {generalmanager-0.90.0 → generalmanager-0.91.1/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/SOURCES.txt +1 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_query_permissions.py +141 -2
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_resolvers.py +26 -1
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_search.py +22 -28
- generalmanager-0.91.1/src/general_manager/api/graphql_work_limits.py +35 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/orm_interface.py +15 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/general_manager.py +19 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/permission_data_manager.py +16 -2
- {generalmanager-0.90.0 → generalmanager-0.91.1}/LICENSE +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/README.md +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/setup.cfg +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_filter_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_identifiers.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_units.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_value_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/mutation_controls.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/apps.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/batch_refresh.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/cache/transaction_barrier.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/audit_identity.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/execution.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/result_set.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/outcomes.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/graphql_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/mutation_inputs.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/action_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/binding_diagnostics.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/calculation_scope.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/category_binding.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/choice_context.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/clarification.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/conversion.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/cross_query.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/deferred_calculations.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/deferred_schema.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/evidence_selection.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/group_actions.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/planner_context.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/schema_projection.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/selector_clarification.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/selector_question.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/schema_inspection.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/conf.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/history_query.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/collection_probes.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/capabilities/request/relation_inputs.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/unit_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/logging.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/search_reconcile.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/sync_read_only.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/bulk_create.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/relation_aliases.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/public_api_registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/py.typed +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/authorization.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/identity.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/invalidation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/projection.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/executable_contract.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/test_settings.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/test_urls.py +0 -0
- {generalmanager-0.90.0 → generalmanager-0.91.1}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.91.1
|
|
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.
|
|
7
|
+
version = "0.91.1"
|
|
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.
|
|
3
|
+
Version: 0.91.1
|
|
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
|
|
@@ -53,6 +53,7 @@ src/general_manager/api/graphql_view.py
|
|
|
53
53
|
src/general_manager/api/graphql_warmup.py
|
|
54
54
|
src/general_manager/api/graphql_warmup_registry.py
|
|
55
55
|
src/general_manager/api/graphql_warmup_tasks.py
|
|
56
|
+
src/general_manager/api/graphql_work_limits.py
|
|
56
57
|
src/general_manager/api/mutation.py
|
|
57
58
|
src/general_manager/api/mutation_controls.py
|
|
58
59
|
src/general_manager/api/notification_batching.py
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_query_permissions.py
RENAMED
|
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING
|
|
|
9
9
|
|
|
10
10
|
from graphql import GraphQLError
|
|
11
11
|
|
|
12
|
+
from general_manager.api.graphql_work_limits import get_graphql_work_limit
|
|
12
13
|
from general_manager.bucket.base_bucket import Bucket
|
|
13
14
|
from general_manager.bucket.request_bucket import RequestBucket
|
|
14
15
|
from general_manager.manager.general_manager import GeneralManager
|
|
@@ -47,7 +48,7 @@ CUSTOM_PROJECTION_ERROR = (
|
|
|
47
48
|
)
|
|
48
49
|
|
|
49
50
|
# Bound field/path decisions; bucket materialization and row checks precede this.
|
|
50
|
-
MAX_QUERY_PERMISSION_CANDIDATES =
|
|
51
|
+
MAX_QUERY_PERMISSION_CANDIDATES: int | None = None
|
|
51
52
|
_LOOKUPS = {
|
|
52
53
|
"exact",
|
|
53
54
|
"iexact",
|
|
@@ -79,11 +80,16 @@ class QueryFieldAuthorizationBudget:
|
|
|
79
80
|
"""Share only accounting across authorization calls in one operation."""
|
|
80
81
|
|
|
81
82
|
decisions: int = 0
|
|
83
|
+
limit: int | None = field(
|
|
84
|
+
default_factory=lambda: get_graphql_work_limit(
|
|
85
|
+
"GRAPHQL_QUERY_PERMISSION_LIMIT", MAX_QUERY_PERMISSION_CANDIDATES
|
|
86
|
+
)
|
|
87
|
+
)
|
|
82
88
|
|
|
83
89
|
def charge(self) -> None:
|
|
84
90
|
"""Reject work exceeding the operation's field/path decision limit."""
|
|
85
91
|
self.decisions += 1
|
|
86
|
-
if self.decisions >
|
|
92
|
+
if self.limit is not None and self.decisions > self.limit:
|
|
87
93
|
raise GraphQLError(_LIMIT_ERROR)
|
|
88
94
|
|
|
89
95
|
|
|
@@ -655,3 +661,136 @@ def authorize_query_fields(
|
|
|
655
661
|
check(candidate, normalized_parts)
|
|
656
662
|
if isinstance(candidates, RequestBucket) and not candidates.response_is_complete:
|
|
657
663
|
raise GraphQLError(INCOMPLETE_ERROR)
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
def _prepare_pushdown_structure(
|
|
667
|
+
manager: type[GeneralManager],
|
|
668
|
+
) -> _NativeQueryStructure | None:
|
|
669
|
+
"""Attest native construction before statically interpreting field policies."""
|
|
670
|
+
from general_manager.utils.executable_contract import executable_matches
|
|
671
|
+
|
|
672
|
+
if type(manager) is not GeneralManagerMeta:
|
|
673
|
+
return None
|
|
674
|
+
from general_manager.manager.general_manager import (
|
|
675
|
+
_QUERY_PUSHDOWN_MANAGER_METHODS,
|
|
676
|
+
_COMMON_MANAGER_IDENTIFICATION,
|
|
677
|
+
)
|
|
678
|
+
from general_manager.interface.orm_interface import (
|
|
679
|
+
_QUERY_PUSHDOWN_INTERFACE_METHODS,
|
|
680
|
+
)
|
|
681
|
+
|
|
682
|
+
if not _unchanged_metadata_methods(manager, _QUERY_PUSHDOWN_MANAGER_METHODS):
|
|
683
|
+
return None
|
|
684
|
+
identification, signature = _COMMON_MANAGER_IDENTIFICATION
|
|
685
|
+
if getattr_static(
|
|
686
|
+
manager, "identification"
|
|
687
|
+
) is not identification or not executable_matches(identification.fget, signature):
|
|
688
|
+
return None
|
|
689
|
+
interface = getattr_static(manager, "Interface", None)
|
|
690
|
+
if not _unchanged_metadata_methods(interface, _QUERY_PUSHDOWN_INTERFACE_METHODS):
|
|
691
|
+
return None
|
|
692
|
+
for owner in (manager, interface):
|
|
693
|
+
if any(
|
|
694
|
+
getattr_static(owner, name, None) is not getattr_static(object, name)
|
|
695
|
+
for name in ("__new__", "__getattribute__", "__setattr__")
|
|
696
|
+
):
|
|
697
|
+
return None
|
|
698
|
+
structure = _prepare_native_query_structure(manager)
|
|
699
|
+
if structure is None:
|
|
700
|
+
return None
|
|
701
|
+
return structure
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
def can_filter_before_query_authorization(
|
|
705
|
+
candidates: Bucket[GeneralManager],
|
|
706
|
+
paths: Iterable[str],
|
|
707
|
+
info: ResolveInfo | None = None,
|
|
708
|
+
) -> bool:
|
|
709
|
+
"""Prove predicates harmless once, before narrowing a native row domain.
|
|
710
|
+
|
|
711
|
+
Permission declarations remain stable during a query. Every relation hop
|
|
712
|
+
must be readable, and each traversed target must have an unconditional row
|
|
713
|
+
read plan for this actor; otherwise membership could reveal hidden targets.
|
|
714
|
+
Unknown/custom policies retain full-domain runtime authorization.
|
|
715
|
+
"""
|
|
716
|
+
from general_manager.bucket.database_bucket import DatabaseBucket
|
|
717
|
+
from general_manager.api.graphql_errors import get_read_permission_filter
|
|
718
|
+
from general_manager.api.graphql_relations import (
|
|
719
|
+
get_graphql_manager_registry,
|
|
720
|
+
resolve_general_manager_type,
|
|
721
|
+
)
|
|
722
|
+
from general_manager.permission.manager_based_permission import (
|
|
723
|
+
additional_local_read_permission,
|
|
724
|
+
)
|
|
725
|
+
|
|
726
|
+
if type(candidates) is not DatabaseBucket:
|
|
727
|
+
return False
|
|
728
|
+
structures: dict[type[GeneralManager], _NativeQueryStructure | None] = {}
|
|
729
|
+
readable_targets: dict[type[GeneralManager], bool] = {}
|
|
730
|
+
|
|
731
|
+
def safe_path(manager: type[GeneralManager], parts: tuple[str, ...]) -> bool:
|
|
732
|
+
if manager not in structures:
|
|
733
|
+
structures[manager] = _prepare_pushdown_structure(manager)
|
|
734
|
+
structure = structures[manager]
|
|
735
|
+
if structure is None or not parts:
|
|
736
|
+
return False
|
|
737
|
+
prepared = structure.flat_field(parts)
|
|
738
|
+
if prepared is not None:
|
|
739
|
+
return not prepared.additional
|
|
740
|
+
field_name, *rest = parts
|
|
741
|
+
aliases, names, _ = _operand_field_names(
|
|
742
|
+
manager, field_name, structure.attributes, native_paths=False
|
|
743
|
+
)
|
|
744
|
+
if (
|
|
745
|
+
len(aliases) > 1
|
|
746
|
+
or not names.intersection(structure.attributes)
|
|
747
|
+
or names.intersection(structure.properties)
|
|
748
|
+
or any(
|
|
749
|
+
additional_local_read_permission(
|
|
750
|
+
structure.permission, name, manager=manager
|
|
751
|
+
)
|
|
752
|
+
is not False
|
|
753
|
+
for name in names
|
|
754
|
+
)
|
|
755
|
+
):
|
|
756
|
+
return False
|
|
757
|
+
metadata: dict[str, object] = dict(
|
|
758
|
+
structure.attributes.get(aliases[0] if aliases else field_name, {})
|
|
759
|
+
)
|
|
760
|
+
target = resolve_general_manager_type(
|
|
761
|
+
metadata.get("type"), get_graphql_manager_registry()
|
|
762
|
+
)
|
|
763
|
+
if target is None or not rest:
|
|
764
|
+
return False
|
|
765
|
+
if target not in structures:
|
|
766
|
+
structures[target] = _prepare_pushdown_structure(target)
|
|
767
|
+
target_structure = structures[target]
|
|
768
|
+
if target_structure is None:
|
|
769
|
+
return False
|
|
770
|
+
# A target field called e.g. "contains" wins over lookup spelling,
|
|
771
|
+
# matching the existing runtime authorization grammar.
|
|
772
|
+
if (
|
|
773
|
+
len(rest) == 1
|
|
774
|
+
and rest[0] in _LOOKUPS
|
|
775
|
+
and rest[0]
|
|
776
|
+
not in (
|
|
777
|
+
set(target_structure.attributes)
|
|
778
|
+
| set(target_structure.properties)
|
|
779
|
+
| set(target_structure.interface.get_attributes())
|
|
780
|
+
)
|
|
781
|
+
):
|
|
782
|
+
return True
|
|
783
|
+
if info is None:
|
|
784
|
+
return False
|
|
785
|
+
if target not in readable_targets:
|
|
786
|
+
plan = get_read_permission_filter(target, info)
|
|
787
|
+
readable_targets[target] = (
|
|
788
|
+
plan.decision == "allow_all"
|
|
789
|
+
and not plan.requires_instance_check
|
|
790
|
+
and not plan.filters
|
|
791
|
+
)
|
|
792
|
+
return readable_targets[target] and safe_path(target, tuple(rest))
|
|
793
|
+
|
|
794
|
+
return all(
|
|
795
|
+
safe_path(candidates._manager_class, tuple(path.split("__"))) for path in paths
|
|
796
|
+
)
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_resolvers.py
RENAMED
|
@@ -1184,6 +1184,12 @@ def check_read_permission(
|
|
|
1184
1184
|
return check_read_permission_for_user(instance, info.context.user, field_name)
|
|
1185
1185
|
|
|
1186
1186
|
|
|
1187
|
+
_QUERY_PUSHDOWN_CHECKS = tuple(
|
|
1188
|
+
(function, executable_signature(function))
|
|
1189
|
+
for function in (check_read_permission, check_read_permission_for_user)
|
|
1190
|
+
)
|
|
1191
|
+
|
|
1192
|
+
|
|
1187
1193
|
def resolve_with_read_permission(
|
|
1188
1194
|
instance: GeneralManager,
|
|
1189
1195
|
info: GraphQLResolveInfo,
|
|
@@ -2114,6 +2120,24 @@ def create_list_resolver(
|
|
|
2114
2120
|
# requests nor validate the remote lookup vocabulary.
|
|
2115
2121
|
qs = MaterializedBucket(manager_class, qs)
|
|
2116
2122
|
else:
|
|
2123
|
+
from general_manager.api.graphql_query_permissions import (
|
|
2124
|
+
can_filter_before_query_authorization,
|
|
2125
|
+
)
|
|
2126
|
+
|
|
2127
|
+
filter_first = all(
|
|
2128
|
+
current is original and executable_matches(original, signature)
|
|
2129
|
+
for current, (original, signature) in zip(
|
|
2130
|
+
(check_read_permission, check_read_permission_for_user),
|
|
2131
|
+
_QUERY_PUSHDOWN_CHECKS,
|
|
2132
|
+
strict=True,
|
|
2133
|
+
)
|
|
2134
|
+
) and can_filter_before_query_authorization(
|
|
2135
|
+
base_queryset,
|
|
2136
|
+
set(plan.filters) | set(plan.excludes) | set(plan.normalized_excludes),
|
|
2137
|
+
info,
|
|
2138
|
+
)
|
|
2139
|
+
if filter_first:
|
|
2140
|
+
base_queryset = apply_query_parameter_plan(base_queryset, plan, None)
|
|
2117
2141
|
authorization_result = apply_read_authorization(
|
|
2118
2142
|
base_queryset,
|
|
2119
2143
|
manager_class,
|
|
@@ -2130,7 +2154,8 @@ def create_list_resolver(
|
|
|
2130
2154
|
budget_additional_permissions_only=True,
|
|
2131
2155
|
prepare_native_structure=isinstance(qs, DatabaseBucket),
|
|
2132
2156
|
)
|
|
2133
|
-
|
|
2157
|
+
if not filter_first:
|
|
2158
|
+
qs = apply_query_parameter_plan(qs, plan, None)
|
|
2134
2159
|
if grouping_validator is not None:
|
|
2135
2160
|
grouping_validator(qs, group_by, order_by, info)
|
|
2136
2161
|
qs_grouped = apply_grouping(qs, group_by)
|
|
@@ -10,7 +10,6 @@ from __future__ import annotations
|
|
|
10
10
|
from dataclasses import replace
|
|
11
11
|
|
|
12
12
|
import json
|
|
13
|
-
import os
|
|
14
13
|
from collections.abc import Callable, Generator, Iterable, Mapping
|
|
15
14
|
from datetime import date, datetime
|
|
16
15
|
from decimal import Decimal
|
|
@@ -28,6 +27,7 @@ from graphql import GraphQLError, GraphQLID
|
|
|
28
27
|
from django.core.exceptions import FieldDoesNotExist
|
|
29
28
|
from django.db import models
|
|
30
29
|
|
|
30
|
+
from general_manager.api.graphql_work_limits import get_graphql_work_limit
|
|
31
31
|
from general_manager.conf import get_setting
|
|
32
32
|
from general_manager.api.graphql_identifiers import property_identifier_type
|
|
33
33
|
from general_manager.api.graphql_ordering import (
|
|
@@ -101,15 +101,11 @@ SearchTotalMode = Literal["exact", "bounded"]
|
|
|
101
101
|
_BAD_USER_INPUT_CODE = "BAD_USER_INPUT"
|
|
102
102
|
_PAGE_MUST_BE_POSITIVE = "page must be a positive integer."
|
|
103
103
|
_PAGE_SIZE_MUST_BE_POSITIVE = "pageSize must be a positive integer."
|
|
104
|
-
DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT =
|
|
105
|
-
_SEARCH_TOTAL_SCAN_LIMIT_UNSET = object()
|
|
104
|
+
DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT: int | None = None
|
|
106
105
|
SEARCH_SOURCE_AUTHORIZATION_LIMIT_ERROR = (
|
|
107
106
|
"Search source authorization candidate limit exceeded."
|
|
108
107
|
)
|
|
109
108
|
SEARCH_TOTAL_MODE_ERROR = "must be one of: exact, bounded."
|
|
110
|
-
SEARCH_TOTAL_SCAN_LIMIT_ERROR = (
|
|
111
|
-
"GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT must be a positive integer."
|
|
112
|
-
)
|
|
113
109
|
_MALFORMED_NATIVE_ID = object()
|
|
114
110
|
|
|
115
111
|
_SEARCH_SCAN_LIMIT_EXCEEDED = (
|
|
@@ -204,24 +200,11 @@ def normalize_search_total_mode(total_mode: str | None = None) -> SearchTotalMod
|
|
|
204
200
|
return cast(SearchTotalMode, normalized)
|
|
205
201
|
|
|
206
202
|
|
|
207
|
-
def get_graphql_search_total_scan_limit() -> int:
|
|
208
|
-
"""Resolve the shared candidate budget from
|
|
209
|
-
|
|
210
|
-
"GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT",
|
|
211
|
-
_SEARCH_TOTAL_SCAN_LIMIT_UNSET,
|
|
203
|
+
def get_graphql_search_total_scan_limit() -> int | None:
|
|
204
|
+
"""Resolve the optional shared candidate budget from settings, then env."""
|
|
205
|
+
return get_graphql_work_limit(
|
|
206
|
+
"GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT", DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT
|
|
212
207
|
)
|
|
213
|
-
if raw_limit is _SEARCH_TOTAL_SCAN_LIMIT_UNSET:
|
|
214
|
-
env_limit = os.environ.get("GENERAL_MANAGER_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT")
|
|
215
|
-
if env_limit is None:
|
|
216
|
-
raw_limit = DEFAULT_GRAPHQL_SEARCH_TOTAL_SCAN_LIMIT
|
|
217
|
-
else:
|
|
218
|
-
try:
|
|
219
|
-
raw_limit = int(env_limit)
|
|
220
|
-
except ValueError:
|
|
221
|
-
raise _bad_user_input_error(SEARCH_TOTAL_SCAN_LIMIT_ERROR) from None
|
|
222
|
-
if not isinstance(raw_limit, int) or isinstance(raw_limit, bool) or raw_limit <= 0:
|
|
223
|
-
raise _bad_user_input_error(SEARCH_TOTAL_SCAN_LIMIT_ERROR)
|
|
224
|
-
return raw_limit
|
|
225
208
|
|
|
226
209
|
|
|
227
210
|
def sort_search_hit_entries(
|
|
@@ -1569,6 +1552,9 @@ def register_search_query(
|
|
|
1569
1552
|
QueryFieldAuthorizationBudget,
|
|
1570
1553
|
)
|
|
1571
1554
|
|
|
1555
|
+
source_limit = get_graphql_work_limit(
|
|
1556
|
+
"GRAPHQL_SEARCH_SOURCE_AUTHORIZATION_LIMIT", MAX_QUERY_PERMISSION_CANDIDATES
|
|
1557
|
+
)
|
|
1572
1558
|
source_candidate_count = 0
|
|
1573
1559
|
authorization_budget = QueryFieldAuthorizationBudget()
|
|
1574
1560
|
|
|
@@ -1577,7 +1563,7 @@ def register_search_query(
|
|
|
1577
1563
|
) -> Generator[GeneralManager, None, None]:
|
|
1578
1564
|
nonlocal source_candidate_count
|
|
1579
1565
|
for candidate in source:
|
|
1580
|
-
if source_candidate_count >=
|
|
1566
|
+
if source_limit is not None and source_candidate_count >= source_limit:
|
|
1581
1567
|
raise GraphQLError(SEARCH_SOURCE_AUTHORIZATION_LIMIT_ERROR)
|
|
1582
1568
|
source_candidate_count += 1
|
|
1583
1569
|
if passes_permission_filters(candidate, info, permission_plan=plan):
|
|
@@ -1804,11 +1790,19 @@ def register_search_query(
|
|
|
1804
1790
|
fast_source is not None and common_filter_execution_valid()
|
|
1805
1791
|
)
|
|
1806
1792
|
while True:
|
|
1807
|
-
remaining_scan_budget =
|
|
1808
|
-
|
|
1793
|
+
remaining_scan_budget = (
|
|
1794
|
+
None
|
|
1795
|
+
if total_scan_limit is None
|
|
1796
|
+
else total_scan_limit - scanned_hits
|
|
1797
|
+
)
|
|
1798
|
+
if remaining_scan_budget is not None and remaining_scan_budget <= 0:
|
|
1809
1799
|
manager_total_is_exact = False
|
|
1810
1800
|
break
|
|
1811
|
-
query_limit =
|
|
1801
|
+
query_limit = (
|
|
1802
|
+
fetch_limit
|
|
1803
|
+
if remaining_scan_budget is None
|
|
1804
|
+
else min(fetch_limit, remaining_scan_budget)
|
|
1805
|
+
)
|
|
1812
1806
|
result = backend.search(
|
|
1813
1807
|
index_name,
|
|
1814
1808
|
query,
|
|
@@ -1981,7 +1975,7 @@ def register_search_query(
|
|
|
1981
1975
|
break
|
|
1982
1976
|
if len(result.hits) < query_limit and not can_continue_page:
|
|
1983
1977
|
break
|
|
1984
|
-
if scanned_hits >= total_scan_limit:
|
|
1978
|
+
if total_scan_limit is not None and scanned_hits >= total_scan_limit:
|
|
1985
1979
|
manager_total_is_exact = False
|
|
1986
1980
|
break
|
|
1987
1981
|
total += total_hits_for_manager
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Server-owned optional GraphQL workload budgets, independent of permissions."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
from graphql import GraphQLError
|
|
8
|
+
|
|
9
|
+
from general_manager.conf import get_setting
|
|
10
|
+
|
|
11
|
+
_UNSET = object()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def get_graphql_work_limit(name: str, default: int | None = None) -> int | None:
|
|
15
|
+
"""Resolve Django settings before environment; explicit None means unlimited."""
|
|
16
|
+
value = get_setting(name, _UNSET)
|
|
17
|
+
if value is _UNSET:
|
|
18
|
+
raw = os.environ.get(f"GENERAL_MANAGER_{name}")
|
|
19
|
+
if raw is None:
|
|
20
|
+
return default
|
|
21
|
+
if raw.strip().lower() in {"none", "unlimited"}:
|
|
22
|
+
return None
|
|
23
|
+
try:
|
|
24
|
+
value = int(raw)
|
|
25
|
+
except ValueError:
|
|
26
|
+
value = raw
|
|
27
|
+
if value is None:
|
|
28
|
+
return None
|
|
29
|
+
if isinstance(value, int) and not isinstance(value, bool) and value > 0:
|
|
30
|
+
return value
|
|
31
|
+
message = f"{name} must be a positive integer or None (unlimited)."
|
|
32
|
+
raise GraphQLError(
|
|
33
|
+
message,
|
|
34
|
+
extensions={"code": "BAD_USER_INPUT"},
|
|
35
|
+
)
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/interface/orm_interface.py
RENAMED
|
@@ -189,3 +189,18 @@ class OrmInterfaceBase(InterfaceBase, Generic[HistoryModelT]):
|
|
|
189
189
|
),
|
|
190
190
|
)
|
|
191
191
|
return lifecycle.describe_custom_fields(model)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
from general_manager.utils.executable_contract import executable_signature as _signature
|
|
195
|
+
|
|
196
|
+
_QUERY_PUSHDOWN_INTERFACE_METHODS = tuple(
|
|
197
|
+
(
|
|
198
|
+
name,
|
|
199
|
+
descriptor,
|
|
200
|
+
_signature(
|
|
201
|
+
descriptor.__func__ if isinstance(descriptor, classmethod) else descriptor
|
|
202
|
+
),
|
|
203
|
+
)
|
|
204
|
+
for name in ("__init__", "_from_trusted_orm_instance")
|
|
205
|
+
for descriptor in (OrmInterfaceBase.__dict__[name],)
|
|
206
|
+
)
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/manager/general_manager.py
RENAMED
|
@@ -920,3 +920,22 @@ _COMMON_MANAGER_EXECUTABLES = tuple(
|
|
|
920
920
|
_COMMON_MANAGER_GETATTR,
|
|
921
921
|
)
|
|
922
922
|
)
|
|
923
|
+
|
|
924
|
+
|
|
925
|
+
# Native filter pushdown may not erase observable custom hydration behavior.
|
|
926
|
+
_QUERY_PUSHDOWN_MANAGER_METHODS = tuple(
|
|
927
|
+
(
|
|
928
|
+
name,
|
|
929
|
+
descriptor,
|
|
930
|
+
executable_signature(
|
|
931
|
+
descriptor.__func__ if isinstance(descriptor, classmethod) else descriptor
|
|
932
|
+
),
|
|
933
|
+
)
|
|
934
|
+
for name in (
|
|
935
|
+
"__init__",
|
|
936
|
+
"__getattr__",
|
|
937
|
+
"_from_trusted_orm_instance",
|
|
938
|
+
"_track_identification_dependency",
|
|
939
|
+
)
|
|
940
|
+
for descriptor in (GeneralManager.__dict__[name],)
|
|
941
|
+
)
|
|
@@ -45,6 +45,20 @@ class PermissionRelationResolutionError(PermissionError):
|
|
|
45
45
|
)
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
def _resolved_relation_model(
|
|
49
|
+
field: models.ForeignKey[models.Model],
|
|
50
|
+
) -> type[models.Model]:
|
|
51
|
+
"""Use Django's resolved relation owner, not an early cached string reference."""
|
|
52
|
+
# RelatedField.related_model is cached; inspecting it during model assembly
|
|
53
|
+
# can retain a string even after Django resolves remote_field.model.
|
|
54
|
+
related_model = getattr(field.remote_field, "model", None)
|
|
55
|
+
if not isinstance(related_model, type) or not issubclass(
|
|
56
|
+
related_model, models.Model
|
|
57
|
+
):
|
|
58
|
+
raise PermissionRelationResolutionError(field.name)
|
|
59
|
+
return related_model
|
|
60
|
+
|
|
61
|
+
|
|
48
62
|
GeneralManagerData = TypeVar("GeneralManagerData", bound=GeneralManager)
|
|
49
63
|
|
|
50
64
|
|
|
@@ -299,7 +313,7 @@ class PermissionDataManager(Generic[GeneralManagerData]):
|
|
|
299
313
|
if identifier is None or name == field.attname:
|
|
300
314
|
return identifier
|
|
301
315
|
|
|
302
|
-
related_type = field
|
|
316
|
+
related_type = _resolved_relation_model(field)
|
|
303
317
|
manager_type = getattr(related_type, "_general_manager_class", None)
|
|
304
318
|
# A write check needs the target on the write database even if a read
|
|
305
319
|
# router would select a replica. Standalone checks retain Django hints.
|
|
@@ -342,7 +356,7 @@ class PermissionDataManager(Generic[GeneralManagerData]):
|
|
|
342
356
|
backing = getattr(getattr(manager, "_interface", None), "_instance", None)
|
|
343
357
|
if (
|
|
344
358
|
manager.identification.get("id") != related.pk
|
|
345
|
-
or not isinstance(backing, field
|
|
359
|
+
or not isinstance(backing, _resolved_relation_model(field))
|
|
346
360
|
or backing.pk != related.pk
|
|
347
361
|
or backing._state.db != related._state.db
|
|
348
362
|
or getattr(backing, field.target_field.attname)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/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.90.0 → generalmanager-0.91.1}/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
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_filter_contract.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_identifiers.py
RENAMED
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_mutations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_relations.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_value_contract.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/graphql_warmup_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/mutation_controls.py
RENAMED
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/api/notification_batching.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/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.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/_materialized_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/calculation_bucket.py
RENAMED
|
File without changes
|
{generalmanager-0.90.0 → generalmanager-0.91.1}/src/general_manager/bucket/database_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|