GeneralManager 0.41.6__tar.gz → 0.41.8__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.41.6/src/GeneralManager.egg-info → generalmanager-0.41.8}/PKG-INFO +1 -1
- {generalmanager-0.41.6 → generalmanager-0.41.8}/pyproject.toml +1 -1
- {generalmanager-0.41.6 → generalmanager-0.41.8/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/group_bucket.py +76 -6
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/group_manager.py +33 -3
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/base_permission.py +9 -2
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/graphql_capabilities.py +10 -9
- {generalmanager-0.41.6 → generalmanager-0.41.8}/LICENSE +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/README.md +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/setup.cfg +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/cache.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/general_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/remote_invalidation.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/apps.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/dependency_index.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/signals.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/conf.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/base_interface.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/database.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/base.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/logging.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/general_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/models.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/public_api_registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/py.typed +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/args_to_kwargs.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/make_cache_key.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/none_to_zero.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/signal_bridge.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/tests/test_settings.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/tests/test_urls.py +0 -0
- {generalmanager-0.41.6 → generalmanager-0.41.8}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.8
|
|
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.41.
|
|
7
|
+
version = "0.41.8"
|
|
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.41.
|
|
3
|
+
Version: 0.41.8
|
|
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
|
|
@@ -1,11 +1,71 @@
|
|
|
1
1
|
"""Grouping bucket implementation for aggregating GeneralManager instances."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
|
-
from typing import Any, Generator, Generic, Type
|
|
4
|
+
from typing import Any, Generator, Generic, Type, cast
|
|
5
5
|
from general_manager.manager.group_manager import GroupManager
|
|
6
|
+
from general_manager.manager.general_manager import GeneralManager
|
|
6
7
|
from general_manager.bucket.base_bucket import Bucket, GeneralManagerType
|
|
7
8
|
|
|
8
9
|
|
|
10
|
+
def _freeze_group_value(value: Any) -> Any:
|
|
11
|
+
"""Return a hashable identity for values used to distinguish groups."""
|
|
12
|
+
if isinstance(value, GeneralManager):
|
|
13
|
+
return (
|
|
14
|
+
value.__class__,
|
|
15
|
+
tuple(
|
|
16
|
+
sorted(
|
|
17
|
+
(
|
|
18
|
+
key,
|
|
19
|
+
_freeze_group_value(identifier),
|
|
20
|
+
)
|
|
21
|
+
for key, identifier in value.identification.items()
|
|
22
|
+
)
|
|
23
|
+
),
|
|
24
|
+
)
|
|
25
|
+
if isinstance(value, dict):
|
|
26
|
+
return tuple(
|
|
27
|
+
sorted(
|
|
28
|
+
(
|
|
29
|
+
_freeze_group_value(key),
|
|
30
|
+
_freeze_group_value(item),
|
|
31
|
+
)
|
|
32
|
+
for key, item in value.items()
|
|
33
|
+
)
|
|
34
|
+
)
|
|
35
|
+
if isinstance(value, (list, tuple)):
|
|
36
|
+
return tuple(_freeze_group_value(item) for item in value)
|
|
37
|
+
if isinstance(value, set):
|
|
38
|
+
return frozenset(_freeze_group_value(item) for item in value)
|
|
39
|
+
return value
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _group_filter_kwargs(
|
|
43
|
+
manager_class: Type[GeneralManagerType],
|
|
44
|
+
group_by_value: tuple[tuple[str, Any], ...],
|
|
45
|
+
) -> dict[str, Any]:
|
|
46
|
+
"""Translate grouped manager values into backend-neutral relation lookups."""
|
|
47
|
+
filters: dict[str, Any] = {}
|
|
48
|
+
get_attribute_types = getattr(
|
|
49
|
+
manager_class.Interface,
|
|
50
|
+
"get_attribute_types",
|
|
51
|
+
None,
|
|
52
|
+
)
|
|
53
|
+
attributes = get_attribute_types() if callable(get_attribute_types) else {}
|
|
54
|
+
for key, value in group_by_value:
|
|
55
|
+
attribute_info = cast(dict[str, Any], attributes.get(key, {}))
|
|
56
|
+
filter_key = attribute_info.get("filter_lookup", key)
|
|
57
|
+
if isinstance(value, GeneralManager):
|
|
58
|
+
filters.update(
|
|
59
|
+
{
|
|
60
|
+
f"{filter_key}__{identifier_key}": identifier_value
|
|
61
|
+
for identifier_key, identifier_value in value.identification.items()
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
continue
|
|
65
|
+
filters[filter_key] = value
|
|
66
|
+
return filters
|
|
67
|
+
|
|
68
|
+
|
|
9
69
|
class InvalidGroupByKeyTypeError(TypeError):
|
|
10
70
|
"""Raised when a non-string value is provided as a group-by key."""
|
|
11
71
|
|
|
@@ -191,15 +251,25 @@ class GroupBucket(Generic[GeneralManagerType]):
|
|
|
191
251
|
Returns:
|
|
192
252
|
list[GroupManager[GeneralManagerType]]: A list of GroupManager objects, one per unique tuple of group-by key values; groups are produced in order sorted by the string representation of their key tuples.
|
|
193
253
|
"""
|
|
194
|
-
group_by_values:
|
|
254
|
+
group_by_values: dict[
|
|
255
|
+
tuple[tuple[str, Any], ...],
|
|
256
|
+
tuple[tuple[str, Any], ...],
|
|
257
|
+
] = {}
|
|
195
258
|
for entry in data:
|
|
196
|
-
|
|
197
|
-
|
|
259
|
+
group_by_value = tuple(
|
|
260
|
+
(arg, getattr(entry, arg)) for arg in self._group_by_keys
|
|
261
|
+
)
|
|
262
|
+
group_identity = tuple(
|
|
263
|
+
(arg, _freeze_group_value(value)) for arg, value in group_by_value
|
|
264
|
+
)
|
|
265
|
+
group_by_values.setdefault(group_identity, group_by_value)
|
|
198
266
|
|
|
199
267
|
groups: list[GroupManager[GeneralManagerType]] = []
|
|
200
|
-
for group_by_value in sorted(group_by_values, key=str):
|
|
268
|
+
for group_by_value in sorted(group_by_values.values(), key=str):
|
|
201
269
|
group_by_dict = {key: value for key, value in group_by_value}
|
|
202
|
-
grouped_manager_objects = data.filter(
|
|
270
|
+
grouped_manager_objects = data.filter(
|
|
271
|
+
**_group_filter_kwargs(self._manager_class, group_by_value)
|
|
272
|
+
)
|
|
203
273
|
groups.append(
|
|
204
274
|
GroupManager(
|
|
205
275
|
self._manager_class, group_by_dict, grouped_manager_objects
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/group_manager.py
RENAMED
|
@@ -12,6 +12,35 @@ from general_manager.bucket.base_bucket import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
def _freeze_manager_value(value: Any) -> Any:
|
|
16
|
+
"""Return a hashable representation for manager-backed group state."""
|
|
17
|
+
if isinstance(value, GeneralManager):
|
|
18
|
+
return tuple(
|
|
19
|
+
sorted(
|
|
20
|
+
(
|
|
21
|
+
key,
|
|
22
|
+
_freeze_manager_value(identifier),
|
|
23
|
+
)
|
|
24
|
+
for key, identifier in value.identification.items()
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
if isinstance(value, dict):
|
|
28
|
+
return tuple(
|
|
29
|
+
sorted(
|
|
30
|
+
(
|
|
31
|
+
_freeze_manager_value(key),
|
|
32
|
+
_freeze_manager_value(item),
|
|
33
|
+
)
|
|
34
|
+
for key, item in value.items()
|
|
35
|
+
)
|
|
36
|
+
)
|
|
37
|
+
if isinstance(value, (list, tuple)):
|
|
38
|
+
return tuple(_freeze_manager_value(item) for item in value)
|
|
39
|
+
if isinstance(value, set):
|
|
40
|
+
return frozenset(_freeze_manager_value(item) for item in value)
|
|
41
|
+
return value
|
|
42
|
+
|
|
43
|
+
|
|
15
44
|
class MissingGroupAttributeError(AttributeError):
|
|
16
45
|
"""Raised when a GroupManager access attempts to use an undefined attribute."""
|
|
17
46
|
|
|
@@ -61,8 +90,8 @@ class GroupManager(Generic[GeneralManagerType]):
|
|
|
61
90
|
return hash(
|
|
62
91
|
(
|
|
63
92
|
self._manager_class,
|
|
64
|
-
|
|
65
|
-
frozenset(self._data),
|
|
93
|
+
_freeze_manager_value(self._group_by_value),
|
|
94
|
+
frozenset(_freeze_manager_value(entry) for entry in self._data),
|
|
66
95
|
)
|
|
67
96
|
)
|
|
68
97
|
|
|
@@ -80,7 +109,8 @@ class GroupManager(Generic[GeneralManagerType]):
|
|
|
80
109
|
isinstance(other, self.__class__)
|
|
81
110
|
and self._manager_class == other._manager_class
|
|
82
111
|
and self._group_by_value == other._group_by_value
|
|
83
|
-
and frozenset(
|
|
112
|
+
and frozenset(_freeze_manager_value(entry) for entry in self._data)
|
|
113
|
+
== frozenset(_freeze_manager_value(entry) for entry in other._data)
|
|
84
114
|
)
|
|
85
115
|
|
|
86
116
|
def __repr__(self) -> str:
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/base_permission.py
RENAMED
|
@@ -5,9 +5,10 @@ from __future__ import annotations
|
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
6
|
from collections.abc import Mapping
|
|
7
7
|
from dataclasses import dataclass
|
|
8
|
-
from typing import TYPE_CHECKING, Any, Literal, TypeAlias
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Literal, TypeAlias, cast
|
|
9
9
|
|
|
10
10
|
from django.contrib.auth.models import AbstractBaseUser, AnonymousUser
|
|
11
|
+
from django.utils.functional import SimpleLazyObject, empty
|
|
11
12
|
|
|
12
13
|
from general_manager.logging import get_logger
|
|
13
14
|
from general_manager.permission.audit import (
|
|
@@ -74,7 +75,7 @@ class BasePermission(ABC):
|
|
|
74
75
|
) -> None:
|
|
75
76
|
"""Initialise the permission context for a specific manager and user."""
|
|
76
77
|
self._instance = instance
|
|
77
|
-
self._request_user = request_user
|
|
78
|
+
self._request_user = self.get_user_with_id(request_user)
|
|
78
79
|
|
|
79
80
|
@property
|
|
80
81
|
def instance(self) -> PermissionDataManager | GeneralManager | GeneralManagerMeta:
|
|
@@ -446,6 +447,12 @@ class BasePermission(ABC):
|
|
|
446
447
|
"""
|
|
447
448
|
from django.contrib.auth import get_user_model
|
|
448
449
|
|
|
450
|
+
if isinstance(user, SimpleLazyObject):
|
|
451
|
+
lazy_user = cast(Any, user)
|
|
452
|
+
if lazy_user._wrapped is empty:
|
|
453
|
+
lazy_user._setup()
|
|
454
|
+
user = lazy_user._wrapped
|
|
455
|
+
|
|
449
456
|
User = get_user_model()
|
|
450
457
|
if isinstance(user, (AbstractBaseUser, AnonymousUser)):
|
|
451
458
|
return user
|
|
@@ -100,7 +100,15 @@ class CapabilityEvaluationContext:
|
|
|
100
100
|
"""Operation-scoped cache for GraphQL permission capability evaluation."""
|
|
101
101
|
|
|
102
102
|
def __init__(self, *, user: Any | None = None) -> None:
|
|
103
|
-
|
|
103
|
+
from django.contrib.auth.models import AnonymousUser
|
|
104
|
+
|
|
105
|
+
from general_manager.permission.base_permission import BasePermission
|
|
106
|
+
|
|
107
|
+
self.user = (
|
|
108
|
+
BasePermission.get_user_with_id(user)
|
|
109
|
+
if user is not None
|
|
110
|
+
else AnonymousUser()
|
|
111
|
+
)
|
|
104
112
|
self._cache: dict[tuple[str, str, str, str], bool] = {}
|
|
105
113
|
|
|
106
114
|
def evaluate(self, declaration: GraphQLPermissionCapability, instance: Any) -> bool:
|
|
@@ -210,7 +218,7 @@ def get_graphql_capabilities(
|
|
|
210
218
|
def get_capability_context(info: Any) -> CapabilityEvaluationContext:
|
|
211
219
|
"""Return the operation-scoped capability context for a GraphQL resolver."""
|
|
212
220
|
request_context = getattr(info, "context", None)
|
|
213
|
-
user = getattr(request_context, "user",
|
|
221
|
+
user = getattr(request_context, "user", None)
|
|
214
222
|
operation_key = id(getattr(info, "operation", None))
|
|
215
223
|
storage_name = "_general_manager_graphql_capability_contexts"
|
|
216
224
|
contexts = getattr(request_context, storage_name, None)
|
|
@@ -272,10 +280,3 @@ def _instance_identity(instance: Any) -> str:
|
|
|
272
280
|
|
|
273
281
|
def _user_identity(user: Any) -> str:
|
|
274
282
|
return repr(getattr(user, "pk", getattr(user, "id", None)))
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
class _AnonymousUser:
|
|
278
|
-
is_authenticated = False
|
|
279
|
-
is_superuser = False
|
|
280
|
-
pk = None
|
|
281
|
-
id = None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/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
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/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
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_mutations.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_resolvers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/graphql_subscriptions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/api/remote_invalidation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/calculation_bucket.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/database_bucket.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/bucket/request_bucket.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/cache_decorator.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/cache/dependency_index.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/factory/factory_methods.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/base_interface.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/__init__.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/calculation.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/database.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/bundles/request.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/capabilities/base.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
|
|
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.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/database.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/interfaces/request.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/manifests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/orm_interface.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/errors.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/interface/utils/models.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/management/commands/shell.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/manager/general_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/measurement/measurement.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/measurement/measurement_field.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/migrations/0001_initial.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
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/permission/permission_checks.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
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backend_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/meilisearch.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/opensearch.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/search/backends/typesense.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/seeding/manager_landscape.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
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backend_registry.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/__init__.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/celery.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/local.py
RENAMED
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/backends/n8n.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/event_registry.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{generalmanager-0.41.6 → generalmanager-0.41.8}/src/general_manager/workflow/signal_bridge.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|