GeneralManager 0.82.4__tar.gz → 0.83.0__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.82.4/src/GeneralManager.egg-info → generalmanager-0.83.0}/PKG-INFO +1 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/pyproject.toml +1 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/SOURCES.txt +2 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/search.py +4 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_search.py +5 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bootstrap.py +1 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/management.py +23 -6
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/search_index.py +2 -12
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/search_reconcile.py +11 -6
- generalmanager-0.83.0/src/general_manager/management/commands/sync_read_only.py +169 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/public_api_registry.py +5 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backend.py +7 -2
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/dev.py +36 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/meilisearch.py +106 -13
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/config.py +26 -1
- generalmanager-0.83.0/src/general_manager/search/identity.py +287 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/indexer.py +16 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/reconciliation.py +14 -1
- {generalmanager-0.82.4 → generalmanager-0.83.0}/LICENSE +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/README.md +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/setup.cfg +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_identifiers.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/apps.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/batch_refresh.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/cache/transaction_barrier.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/routing.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/conf.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/logging.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/bulk_create.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/py.typed +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/invalidation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/tests/test_settings.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/tests/test_urls.py +0 -0
- {generalmanager-0.82.4 → generalmanager-0.83.0}/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.83.0
|
|
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.83.0"
|
|
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.83.0
|
|
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
|
|
@@ -229,6 +229,7 @@ src/general_manager/management/commands/search_index.py
|
|
|
229
229
|
src/general_manager/management/commands/search_reconcile.py
|
|
230
230
|
src/general_manager/management/commands/seed_manager_landscape.py
|
|
231
231
|
src/general_manager/management/commands/shell.py
|
|
232
|
+
src/general_manager/management/commands/sync_read_only.py
|
|
232
233
|
src/general_manager/management/commands/workflow_drain_outbox.py
|
|
233
234
|
src/general_manager/management/commands/workflow_replay_dead_letters.py
|
|
234
235
|
src/general_manager/manager/__init__.py
|
|
@@ -274,6 +275,7 @@ src/general_manager/search/backend.py
|
|
|
274
275
|
src/general_manager/search/backend_registry.py
|
|
275
276
|
src/general_manager/search/checks.py
|
|
276
277
|
src/general_manager/search/config.py
|
|
278
|
+
src/general_manager/search/identity.py
|
|
277
279
|
src/general_manager/search/indexer.py
|
|
278
280
|
src/general_manager/search/invalidation.py
|
|
279
281
|
src/general_manager/search/m2m_invalidation.py
|
|
@@ -18,10 +18,12 @@ __all__ = [
|
|
|
18
18
|
"SearchConfigSpec",
|
|
19
19
|
"SearchDocument",
|
|
20
20
|
"SearchHit",
|
|
21
|
+
"SearchIdentityFilterGroup",
|
|
21
22
|
"SearchIndexer",
|
|
22
23
|
"SearchInvalidationRule",
|
|
23
24
|
"SearchResult",
|
|
24
25
|
"TypesenseBackend",
|
|
26
|
+
"build_search_filters",
|
|
25
27
|
"configure_search_backend",
|
|
26
28
|
"configure_search_backend_from_settings",
|
|
27
29
|
"get_search_backend",
|
|
@@ -44,10 +46,12 @@ from general_manager.search.config import SearchConfigProtocol
|
|
|
44
46
|
from general_manager.search.config import SearchConfigSpec
|
|
45
47
|
from general_manager.search.backend import SearchDocument
|
|
46
48
|
from general_manager.search.backend import SearchHit
|
|
49
|
+
from general_manager.search.identity import SearchIdentityFilterGroup
|
|
47
50
|
from general_manager.search.indexer import SearchIndexer
|
|
48
51
|
from general_manager.search.config import SearchInvalidationRule
|
|
49
52
|
from general_manager.search.backend import SearchResult
|
|
50
53
|
from general_manager.search.backends.typesense import TypesenseBackend
|
|
54
|
+
from general_manager.search.identity import build_search_filters
|
|
51
55
|
from general_manager.search.backend_registry import configure_search_backend
|
|
52
56
|
from general_manager.search.backend_registry import (
|
|
53
57
|
configure_search_backend_from_settings,
|
|
@@ -41,6 +41,7 @@ from general_manager.measurement.measurement import Measurement
|
|
|
41
41
|
from general_manager.utils.type_checks import safe_issubclass
|
|
42
42
|
from general_manager.search.backend_registry import get_search_backend
|
|
43
43
|
from general_manager.search.backend import SearchHit
|
|
44
|
+
from general_manager.search.identity import SearchFilters, build_search_filters
|
|
44
45
|
from general_manager.search.registry import (
|
|
45
46
|
get_search_config,
|
|
46
47
|
get_type_label,
|
|
@@ -1257,7 +1258,7 @@ def register_search_query(
|
|
|
1257
1258
|
permission_plan,
|
|
1258
1259
|
backend_shape=backend_shape,
|
|
1259
1260
|
)
|
|
1260
|
-
filter_groups = (
|
|
1261
|
+
filter_groups: SearchFilters = (
|
|
1261
1262
|
manager_filters or None
|
|
1262
1263
|
if decision == "allow_all"
|
|
1263
1264
|
else merge_permission_filters(
|
|
@@ -1265,6 +1266,9 @@ def register_search_query(
|
|
|
1265
1266
|
permission_plan.filters,
|
|
1266
1267
|
)
|
|
1267
1268
|
)
|
|
1269
|
+
filter_groups = build_search_filters(
|
|
1270
|
+
manager_class, index_name, filter_groups
|
|
1271
|
+
)
|
|
1268
1272
|
total_hits_for_manager = 0
|
|
1269
1273
|
candidate_hits_for_manager = 0
|
|
1270
1274
|
offset_cursor = 0
|
|
@@ -191,7 +191,7 @@ def install_startup_hook_runner() -> None:
|
|
|
191
191
|
) -> None:
|
|
192
192
|
run_main = os.environ.get("RUN_MAIN") == "true"
|
|
193
193
|
command = argv[1] if len(argv) > 1 else None
|
|
194
|
-
should_run_hooks = command != "runserver" or run_main
|
|
194
|
+
should_run_hooks = command != "runserver" or run_main or "--noreload" in argv
|
|
195
195
|
hooks_registry = registered_startup_hook_entries() if should_run_hooks else {}
|
|
196
196
|
if hooks_registry:
|
|
197
197
|
resolver_groups: list[
|
|
@@ -3,12 +3,14 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
|
-
from collections.abc import Callable, Sequence
|
|
7
|
-
from contextlib import AbstractContextManager
|
|
6
|
+
from collections.abc import Callable, Iterator, Sequence
|
|
7
|
+
from contextlib import AbstractContextManager, contextmanager
|
|
8
|
+
from contextvars import ContextVar
|
|
8
9
|
from hashlib import sha256
|
|
9
10
|
from typing import TYPE_CHECKING, ClassVar, Protocol, TypeVar, cast
|
|
10
11
|
|
|
11
12
|
from django.core.checks import Warning
|
|
13
|
+
from django.conf import settings
|
|
12
14
|
from django.db import (
|
|
13
15
|
IntegrityError,
|
|
14
16
|
connection as django_connection,
|
|
@@ -44,6 +46,19 @@ from ._types import (
|
|
|
44
46
|
)
|
|
45
47
|
|
|
46
48
|
logger = get_logger("interface.read_only")
|
|
49
|
+
_automatic_sync_suppressed: ContextVar[bool] = ContextVar(
|
|
50
|
+
"read_only_automatic_sync_suppressed", default=False
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@contextmanager
|
|
55
|
+
def _suppress_automatic_sync() -> Iterator[None]:
|
|
56
|
+
"""Let explicit CLI maintenance own sync while other startup hooks still run."""
|
|
57
|
+
token = _automatic_sync_suppressed.set(True)
|
|
58
|
+
try:
|
|
59
|
+
yield
|
|
60
|
+
finally:
|
|
61
|
+
_automatic_sync_suppressed.reset(token)
|
|
47
62
|
|
|
48
63
|
|
|
49
64
|
class _ColumnDescription(Protocol):
|
|
@@ -1156,9 +1171,9 @@ class ReadOnlyManagementCapability(BaseCapability):
|
|
|
1156
1171
|
returned. The registered hook catches `MissingReadOnlyBindingError`
|
|
1157
1172
|
only to tolerate binding metadata becoming unavailable between
|
|
1158
1173
|
registration and startup execution; other sync errors propagate.
|
|
1159
|
-
Automatic synchronization
|
|
1160
|
-
|
|
1161
|
-
|
|
1174
|
+
Automatic synchronization uses `READ_ONLY_SYNC_ON_STARTUP`, falling
|
|
1175
|
+
back to Django `DEBUG` when unset. Explicit `sync_data()` calls remain
|
|
1176
|
+
available regardless of that setting.
|
|
1162
1177
|
|
|
1163
1178
|
Parameters:
|
|
1164
1179
|
interface_cls: Interface class used to derive the bound manager and model.
|
|
@@ -1192,7 +1207,9 @@ class ReadOnlyManagementCapability(BaseCapability):
|
|
|
1192
1207
|
binding is not available (raises MissingReadOnlyBindingError), logs a debug
|
|
1193
1208
|
message and returns without raising.
|
|
1194
1209
|
"""
|
|
1195
|
-
if not get_setting(
|
|
1210
|
+
if _automatic_sync_suppressed.get() or not get_setting(
|
|
1211
|
+
"READ_ONLY_SYNC_ON_STARTUP", settings.DEBUG
|
|
1212
|
+
):
|
|
1196
1213
|
return
|
|
1197
1214
|
try:
|
|
1198
1215
|
self.sync_data(interface_cls)
|
|
@@ -9,9 +9,8 @@ from django.core.management.base import BaseCommand
|
|
|
9
9
|
|
|
10
10
|
from general_manager.logging import get_logger
|
|
11
11
|
from general_manager.search.backend_registry import get_search_backend
|
|
12
|
-
from general_manager.search.indexer import SearchIndexer
|
|
12
|
+
from general_manager.search.indexer import SearchIndexer, _ensure_index
|
|
13
13
|
from general_manager.search.registry import (
|
|
14
|
-
collect_index_settings,
|
|
15
14
|
get_index_names,
|
|
16
15
|
iter_searchable_managers,
|
|
17
16
|
)
|
|
@@ -99,16 +98,7 @@ class Command(BaseCommand):
|
|
|
99
98
|
target_indexes = get_index_names()
|
|
100
99
|
|
|
101
100
|
for index_name in sorted(target_indexes):
|
|
102
|
-
|
|
103
|
-
backend.ensure_index(
|
|
104
|
-
index_name,
|
|
105
|
-
{
|
|
106
|
-
"searchable_fields": settings_payload.searchable_fields,
|
|
107
|
-
"filterable_fields": settings_payload.filterable_fields,
|
|
108
|
-
"sortable_fields": settings_payload.sortable_fields,
|
|
109
|
-
"field_boosts": settings_payload.field_boosts,
|
|
110
|
-
},
|
|
111
|
-
)
|
|
101
|
+
_ensure_index(backend, index_name)
|
|
112
102
|
logger.info(
|
|
113
103
|
"search index ensured",
|
|
114
104
|
context={"index": index_name},
|
|
@@ -92,13 +92,18 @@ class Command(BaseCommand):
|
|
|
92
92
|
|
|
93
93
|
while True:
|
|
94
94
|
result = reconcile_search_indexes(force=force, max_states=max_states)
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
f"({result.documents} documents, {result.failed} failures)."
|
|
100
|
-
)
|
|
95
|
+
summary = (
|
|
96
|
+
"Reconciled "
|
|
97
|
+
f"{result.reconciled} search index states "
|
|
98
|
+
f"({result.documents} documents, {result.failed} failures)."
|
|
101
99
|
)
|
|
100
|
+
if result.failed:
|
|
101
|
+
self.stderr.write(self.style.ERROR(summary))
|
|
102
|
+
if once:
|
|
103
|
+
message = "Search reconciliation failed; inspect logs and SearchIndexState.last_error."
|
|
104
|
+
raise CommandError(message)
|
|
105
|
+
else:
|
|
106
|
+
self.stdout.write(self.style.SUCCESS(summary))
|
|
102
107
|
if once:
|
|
103
108
|
return
|
|
104
109
|
force = False
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""Explicit deployment maintenance for registered read-only managers."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from argparse import ArgumentParser
|
|
6
|
+
from collections.abc import Iterable, Sequence
|
|
7
|
+
from typing import cast
|
|
8
|
+
|
|
9
|
+
from django.core.management.base import BaseCommand, CommandError
|
|
10
|
+
from django.db import connections
|
|
11
|
+
|
|
12
|
+
from general_manager.interface.capabilities.read_only.management import (
|
|
13
|
+
ReadOnlyManagementCapability,
|
|
14
|
+
_ReadOnlyInterface,
|
|
15
|
+
_SchemaConnection,
|
|
16
|
+
_suppress_automatic_sync,
|
|
17
|
+
)
|
|
18
|
+
from general_manager.interface.infrastructure.startup_hooks import (
|
|
19
|
+
order_interfaces_by_dependency,
|
|
20
|
+
)
|
|
21
|
+
from general_manager.manager.meta import GeneralManagerMeta
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _manager_path(interface: _ReadOnlyInterface) -> str:
|
|
25
|
+
"""Identify a bound manager without importing arbitrary selector input."""
|
|
26
|
+
manager = interface._parent_class
|
|
27
|
+
return f"{manager.__module__}.{manager.__qualname__}"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _capability(interface: _ReadOnlyInterface) -> ReadOnlyManagementCapability:
|
|
31
|
+
"""Use the manager's configured management capability, including overrides."""
|
|
32
|
+
return cast(
|
|
33
|
+
ReadOnlyManagementCapability,
|
|
34
|
+
interface.require_capability(
|
|
35
|
+
"read_only_management", expected_type=ReadOnlyManagementCapability
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _select_interfaces(value: object) -> list[_ReadOnlyInterface]:
|
|
41
|
+
"""Validate selectors and include transitive read-only relation dependencies."""
|
|
42
|
+
interfaces = list(
|
|
43
|
+
dict.fromkeys(
|
|
44
|
+
cast(_ReadOnlyInterface, manager.Interface)
|
|
45
|
+
for manager in GeneralManagerMeta.all_classes
|
|
46
|
+
if getattr(manager.Interface, "_interface_type", None) == "readonly"
|
|
47
|
+
)
|
|
48
|
+
)
|
|
49
|
+
if value is None:
|
|
50
|
+
selected = interfaces
|
|
51
|
+
else:
|
|
52
|
+
selectors: tuple[object, ...]
|
|
53
|
+
if isinstance(value, str):
|
|
54
|
+
selectors = (value,)
|
|
55
|
+
elif isinstance(value, Iterable):
|
|
56
|
+
selectors = tuple(value)
|
|
57
|
+
else:
|
|
58
|
+
selectors = ()
|
|
59
|
+
if not selectors or any(
|
|
60
|
+
not isinstance(selector, str) or not selector for selector in selectors
|
|
61
|
+
):
|
|
62
|
+
message = "--manager must contain one or more nonempty manager names."
|
|
63
|
+
raise CommandError(message)
|
|
64
|
+
selected = []
|
|
65
|
+
for selector in selectors:
|
|
66
|
+
matches = [
|
|
67
|
+
interface
|
|
68
|
+
for interface in interfaces
|
|
69
|
+
if selector
|
|
70
|
+
in (interface._parent_class.__name__, _manager_path(interface))
|
|
71
|
+
]
|
|
72
|
+
if not matches:
|
|
73
|
+
message = f"Unknown read-only manager: {selector}."
|
|
74
|
+
raise CommandError(message)
|
|
75
|
+
if len(matches) > 1:
|
|
76
|
+
paths = ", ".join(sorted(_manager_path(item) for item in matches))
|
|
77
|
+
message = (
|
|
78
|
+
f"Ambiguous read-only manager {selector}; use one of: {paths}."
|
|
79
|
+
)
|
|
80
|
+
raise CommandError(message)
|
|
81
|
+
if matches[0] not in selected:
|
|
82
|
+
selected.append(matches[0])
|
|
83
|
+
|
|
84
|
+
dependencies: dict[_ReadOnlyInterface, set[_ReadOnlyInterface]] = {}
|
|
85
|
+
pending = list(selected)
|
|
86
|
+
while pending:
|
|
87
|
+
interface = pending.pop(0)
|
|
88
|
+
if interface in dependencies:
|
|
89
|
+
continue
|
|
90
|
+
dependencies[interface] = (
|
|
91
|
+
ReadOnlyManagementCapability._related_readonly_interfaces(interface)
|
|
92
|
+
)
|
|
93
|
+
pending.extend(sorted(dependencies[interface], key=_manager_path))
|
|
94
|
+
|
|
95
|
+
interface_list = sorted(dependencies, key=_manager_path)
|
|
96
|
+
ordered = cast(
|
|
97
|
+
list[_ReadOnlyInterface],
|
|
98
|
+
order_interfaces_by_dependency(
|
|
99
|
+
interface_list,
|
|
100
|
+
lambda interface: set(dependencies[cast(_ReadOnlyInterface, interface)]),
|
|
101
|
+
),
|
|
102
|
+
)
|
|
103
|
+
positions = {interface: index for index, interface in enumerate(ordered)}
|
|
104
|
+
if any(
|
|
105
|
+
positions[dependency] >= positions[interface]
|
|
106
|
+
for interface in ordered
|
|
107
|
+
for dependency in dependencies[interface]
|
|
108
|
+
):
|
|
109
|
+
message = "Read-only dependency cycle; cannot determine a safe sync order."
|
|
110
|
+
raise CommandError(message)
|
|
111
|
+
return ordered
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class Command(BaseCommand):
|
|
115
|
+
help = "Synchronize read-only managers and their dependencies after migrations."
|
|
116
|
+
|
|
117
|
+
def add_arguments(self, parser: ArgumentParser) -> None:
|
|
118
|
+
"""Accept repeatable unique class names or module-qualified manager paths."""
|
|
119
|
+
parser.add_argument(
|
|
120
|
+
"--manager",
|
|
121
|
+
action="append",
|
|
122
|
+
dest="managers",
|
|
123
|
+
help="Read-only manager name or module-qualified class path. Repeatable; defaults to all.",
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
def run_from_argv(self, argv: Sequence[str]) -> None:
|
|
127
|
+
"""Avoid duplicate automatic read-only sync before this explicit CLI step."""
|
|
128
|
+
with _suppress_automatic_sync():
|
|
129
|
+
super().run_from_argv(argv)
|
|
130
|
+
|
|
131
|
+
def handle(self, *_args: object, **options: object) -> None:
|
|
132
|
+
"""Preflight all schemas, then sync in dependency order or fail loudly.
|
|
133
|
+
|
|
134
|
+
No global transaction is added: completed managers may remain synced if
|
|
135
|
+
a later manager fails. Re-running the command converges the payloads.
|
|
136
|
+
"""
|
|
137
|
+
interfaces = _select_interfaces(options.get("managers"))
|
|
138
|
+
# The public sync API logs schema warnings and returns without writing.
|
|
139
|
+
# Deployment maintenance must instead fail before claiming success.
|
|
140
|
+
for interface in interfaces:
|
|
141
|
+
try:
|
|
142
|
+
capability = _capability(interface)
|
|
143
|
+
warnings = capability.ensure_schema_is_up_to_date(
|
|
144
|
+
interface,
|
|
145
|
+
interface._parent_class,
|
|
146
|
+
interface._model,
|
|
147
|
+
connection=cast(
|
|
148
|
+
_SchemaConnection,
|
|
149
|
+
connections[capability._database_alias(interface)],
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
except Exception as exc:
|
|
153
|
+
message = f"Read-only schema check failed for {_manager_path(interface)}: {exc}"
|
|
154
|
+
raise CommandError(message) from exc
|
|
155
|
+
if warnings:
|
|
156
|
+
detail = "; ".join(str(warning) for warning in warnings)
|
|
157
|
+
message = f"Read-only schema check failed for {_manager_path(interface)}: {detail}"
|
|
158
|
+
raise CommandError(message)
|
|
159
|
+
|
|
160
|
+
for interface in interfaces:
|
|
161
|
+
try:
|
|
162
|
+
_capability(interface).sync_data(interface, schema_validated=True)
|
|
163
|
+
except Exception as exc:
|
|
164
|
+
message = f"Read-only sync failed for {_manager_path(interface)}: {exc}"
|
|
165
|
+
raise CommandError(message) from exc
|
|
166
|
+
self.stdout.write(f"Synchronized {_manager_path(interface)}.")
|
|
167
|
+
self.stdout.write(
|
|
168
|
+
self.style.SUCCESS(f"Synchronized {len(interfaces)} read-only managers.")
|
|
169
|
+
)
|
|
@@ -793,6 +793,11 @@ RULE_EXPORTS: LazyExportMap = {
|
|
|
793
793
|
}
|
|
794
794
|
|
|
795
795
|
SEARCH_EXPORTS: LazyExportMap = {
|
|
796
|
+
"SearchIdentityFilterGroup": (
|
|
797
|
+
"general_manager.search.identity",
|
|
798
|
+
"SearchIdentityFilterGroup",
|
|
799
|
+
),
|
|
800
|
+
"build_search_filters": ("general_manager.search.identity", "build_search_filters"),
|
|
796
801
|
"FieldConfig": ("general_manager.search.config", "FieldConfig"),
|
|
797
802
|
"IndexConfig": ("general_manager.search.config", "IndexConfig"),
|
|
798
803
|
"SearchConfigProtocol": ("general_manager.search.config", "SearchConfigProtocol"),
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import builtins
|
|
5
6
|
from collections.abc import Mapping, Sequence
|
|
6
|
-
from dataclasses import dataclass
|
|
7
|
+
from dataclasses import dataclass, field
|
|
7
8
|
from typing import Protocol, runtime_checkable
|
|
8
9
|
|
|
9
10
|
|
|
@@ -20,7 +21,10 @@ class SearchDocument:
|
|
|
20
21
|
protocol does not require adapters to reject mismatches between
|
|
21
22
|
`document.index` and an `index_name` argument. `data` contains
|
|
22
23
|
searchable/stored fields. `field_boosts` and `index_boost` are hints for
|
|
23
|
-
adapters that support weighted matching.
|
|
24
|
+
adapters that support weighted matching. `identity_fields` maps explicit
|
|
25
|
+
identity names to native scalar types (`int`, `str`, or `UUID`), including
|
|
26
|
+
nullable/collection element types. It never coerces document values.
|
|
27
|
+
The payload mappings, including
|
|
24
28
|
`identification`, are not copied by the model; callers should treat them as
|
|
25
29
|
immutable after handing them to a backend. Dataclass field annotations are
|
|
26
30
|
the validation boundary; this model does not coerce or validate runtime
|
|
@@ -36,6 +40,7 @@ class SearchDocument:
|
|
|
36
40
|
data: Mapping[str, object]
|
|
37
41
|
field_boosts: Mapping[str, float]
|
|
38
42
|
index_boost: float | None = None
|
|
43
|
+
identity_fields: Mapping[str, builtins.type] = field(default_factory=dict)
|
|
39
44
|
|
|
40
45
|
|
|
41
46
|
@dataclass(frozen=True)
|
|
@@ -10,6 +10,11 @@ from threading import RLock
|
|
|
10
10
|
from general_manager.search.backend import SearchDocument, SearchHit, SearchResult
|
|
11
11
|
from general_manager.bucket._ordering import normalize_ordering, sort_items
|
|
12
12
|
from general_manager.utils.filter_parser import apply_lookup
|
|
13
|
+
from general_manager.search.identity import (
|
|
14
|
+
SearchIdentityFilterGroup,
|
|
15
|
+
identity_lookup,
|
|
16
|
+
canonical_identity,
|
|
17
|
+
)
|
|
13
18
|
|
|
14
19
|
|
|
15
20
|
@dataclass
|
|
@@ -176,6 +181,10 @@ class DevSearchBackend:
|
|
|
176
181
|
case-sensitive, missing fields behave like `None`, incompatible
|
|
177
182
|
mixed-type comparisons and invalid lookup/value combinations
|
|
178
183
|
return `False`, and `None` compares only through `exact`.
|
|
184
|
+
Explicit `SearchIdentityFilterGroup` equality/membership uses
|
|
185
|
+
native casts and owner scope without changing these operator
|
|
186
|
+
rules. Matching document metadata and a present field are
|
|
187
|
+
required. Plain mappings retain raw comparisons.
|
|
179
188
|
filter_expression (str | None): Unsupported in this backend; passing a value raises NotImplementedError.
|
|
180
189
|
sort (Sequence[str] | None): Signed document data field names.
|
|
181
190
|
Prefix a field with ``-`` for descending order. If omitted,
|
|
@@ -392,12 +401,38 @@ class DevSearchBackend:
|
|
|
392
401
|
if not all(isinstance(group, Mapping) for group in filters):
|
|
393
402
|
return False
|
|
394
403
|
return any(self._passes_filters(document, group) for group in filters)
|
|
404
|
+
if isinstance(filters, SearchIdentityFilterGroup):
|
|
405
|
+
if filters.type_label is not None and document.type != filters.type_label:
|
|
406
|
+
return False
|
|
395
407
|
for key, value in filters.items():
|
|
396
|
-
|
|
408
|
+
identity = None
|
|
409
|
+
if isinstance(filters, SearchIdentityFilterGroup):
|
|
410
|
+
identity = identity_lookup(key, filters.identity_fields)
|
|
411
|
+
if identity is not None:
|
|
412
|
+
field_name, lookup, native_type = identity
|
|
413
|
+
if (
|
|
414
|
+
field_name not in document.data
|
|
415
|
+
or document.identity_fields.get(field_name) is not native_type
|
|
416
|
+
):
|
|
417
|
+
return False
|
|
418
|
+
elif "__" in key:
|
|
397
419
|
field_name, lookup = key.split("__", 1)
|
|
398
420
|
else:
|
|
399
421
|
field_name, lookup = key, "exact"
|
|
400
422
|
doc_value = document.data.get(field_name)
|
|
423
|
+
if identity is not None and (
|
|
424
|
+
lookup != "in" or isinstance(value, (list, tuple, set))
|
|
425
|
+
):
|
|
426
|
+
doc_value = (
|
|
427
|
+
[canonical_identity(native_type, item) for item in doc_value]
|
|
428
|
+
if isinstance(doc_value, (list, tuple, set))
|
|
429
|
+
else canonical_identity(native_type, doc_value)
|
|
430
|
+
)
|
|
431
|
+
value = (
|
|
432
|
+
[canonical_identity(native_type, item) for item in value]
|
|
433
|
+
if isinstance(value, (list, tuple, set))
|
|
434
|
+
else canonical_identity(native_type, value)
|
|
435
|
+
)
|
|
401
436
|
if lookup == "exact" and isinstance(value, (list, tuple, set)):
|
|
402
437
|
if isinstance(doc_value, (list, tuple, set)):
|
|
403
438
|
if not set(doc_value).intersection(value):
|