GeneralManager 0.82.5__tar.gz → 0.83.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.82.5/src/GeneralManager.egg-info → generalmanager-0.83.1}/PKG-INFO +1 -1
- {generalmanager-0.82.5 → generalmanager-0.83.1}/pyproject.toml +1 -1
- {generalmanager-0.82.5 → generalmanager-0.83.1/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/GeneralManager.egg-info/SOURCES.txt +1 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bootstrap.py +1 -1
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +16 -2
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/read_only/management.py +23 -6
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/search_reconcile.py +11 -6
- generalmanager-0.83.1/src/general_manager/management/commands/sync_read_only.py +169 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/measurement/measurement_field.py +18 -5
- {generalmanager-0.82.5 → generalmanager-0.83.1}/LICENSE +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/README.md +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/setup.cfg +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_identifiers.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/apps.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/batch_refresh.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/transaction_barrier.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/routing.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/conf.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/logging.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/bulk_create.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/public_api_registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/py.typed +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/identity.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/invalidation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/tests/test_settings.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.1}/tests/test_urls.py +0 -0
- {generalmanager-0.82.5 → generalmanager-0.83.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.83.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.83.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.83.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
|
|
@@ -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
|
|
@@ -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[
|
|
@@ -155,6 +155,20 @@ def _orm_file_field_kind(
|
|
|
155
155
|
return None
|
|
156
156
|
|
|
157
157
|
|
|
158
|
+
def _field_default(field: DjangoField) -> object:
|
|
159
|
+
"""Normalize concrete measurement defaults without evaluating runtime defaults."""
|
|
160
|
+
default = field.default
|
|
161
|
+
if (
|
|
162
|
+
not isinstance(field, MeasurementField)
|
|
163
|
+
or default is None
|
|
164
|
+
or default is models.NOT_PROVIDED
|
|
165
|
+
or callable(default)
|
|
166
|
+
):
|
|
167
|
+
return default
|
|
168
|
+
measurement, _ = field._normalize_value(default)
|
|
169
|
+
return measurement
|
|
170
|
+
|
|
171
|
+
|
|
158
172
|
def _to_snake_case(name: str) -> str:
|
|
159
173
|
"""Convert a CamelCase class name into snake_case."""
|
|
160
174
|
snake = re.sub("(.)([A-Z][a-z]+)", r"\1_\2", name)
|
|
@@ -257,7 +271,7 @@ class _FieldDescriptorBuilder:
|
|
|
257
271
|
else not field.null
|
|
258
272
|
),
|
|
259
273
|
is_editable=field.editable,
|
|
260
|
-
default=field
|
|
274
|
+
default=_field_default(field),
|
|
261
275
|
is_derived=False,
|
|
262
276
|
accessor=_instance_attribute_accessor(field_name),
|
|
263
277
|
orm_field_kind=orm_field_kind,
|
|
@@ -286,7 +300,7 @@ class _FieldDescriptorBuilder:
|
|
|
286
300
|
else not field.null and field.default is models.NOT_PROVIDED
|
|
287
301
|
),
|
|
288
302
|
is_editable=field.editable,
|
|
289
|
-
default=field
|
|
303
|
+
default=_field_default(field),
|
|
290
304
|
is_derived=False,
|
|
291
305
|
accessor=_instance_attribute_accessor(field.name),
|
|
292
306
|
orm_field_kind=orm_field_kind,
|
|
@@ -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)
|
|
@@ -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
|
+
)
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/measurement/measurement_field.py
RENAMED
|
@@ -740,10 +740,24 @@ class MeasurementField(MeasurementFieldBase):
|
|
|
740
740
|
does not make exact non-wrapped Pint subclasses part of this
|
|
741
741
|
field's stable API.
|
|
742
742
|
"""
|
|
743
|
+
measurement, magnitude = self._normalize_value(value)
|
|
744
|
+
setattr(instance, self.value_attr, magnitude)
|
|
745
|
+
setattr(
|
|
746
|
+
instance,
|
|
747
|
+
self.unit_attr,
|
|
748
|
+
str(measurement.unit) if measurement is not None else None,
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
def _normalize_value(
|
|
752
|
+
self, value: object
|
|
753
|
+
) -> tuple[Measurement | None, Decimal | None]:
|
|
754
|
+
"""Validate a value for storage or metadata without creating a model instance.
|
|
755
|
+
|
|
756
|
+
Return the measurement in its declared unit and its quantized base-unit
|
|
757
|
+
magnitude. This does not evaluate defaults or run model validators.
|
|
758
|
+
"""
|
|
743
759
|
if value is None:
|
|
744
|
-
|
|
745
|
-
setattr(instance, self.unit_attr, None)
|
|
746
|
-
return
|
|
760
|
+
return None, None
|
|
747
761
|
if isinstance(value, str):
|
|
748
762
|
try:
|
|
749
763
|
value = Measurement.from_string(value)
|
|
@@ -776,8 +790,7 @@ class MeasurementField(MeasurementFieldBase):
|
|
|
776
790
|
{self.name: [f"Unit must be compatible with '{self.base_unit}'."]}
|
|
777
791
|
) from e
|
|
778
792
|
|
|
779
|
-
|
|
780
|
-
setattr(instance, self.unit_attr, str(value.unit))
|
|
793
|
+
return value, self._normalize_base_magnitude(base_mag)
|
|
781
794
|
|
|
782
795
|
def validate(
|
|
783
796
|
self,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.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.82.5 → generalmanager-0.83.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
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_identifiers.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_mutations.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_relations.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_resolvers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_warmup_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/graphql_warmup_tasks.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/notification_batching.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/api/remote_invalidation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/_materialized_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/calculation_bucket.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/database_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/bucket/request_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/_dependency_graph.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/cache_decorator.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/data_change_context.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_cache.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_index.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_matching.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_publish.py
RENAMED
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/dependency_shards.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/run_context_lru.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/cache/transaction_barrier.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.82.5 → generalmanager-0.83.1}/src/general_manager/chat/evals/diagnostics.py
RENAMED
|
File without changes
|