lex-app 2.3.0__tar.gz → 2.3.2__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.
- {lex_app-2.3.0 → lex_app-2.3.2}/MANIFEST.in +2 -0
- {lex_app-2.3.0/lex_app.egg-info → lex_app-2.3.2}/PKG-INFO +1 -1
- lex_app-2.3.2/lex/_version.py +1 -0
- lex_app-2.3.2/lex/core/sql/bitemporal_activation.sql +284 -0
- {lex_app-2.3.0 → lex_app-2.3.2/lex_app.egg-info}/PKG-INFO +1 -1
- {lex_app-2.3.0 → lex_app-2.3.2}/lex_app.egg-info/SOURCES.txt +1 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/pyproject.toml +6 -0
- lex_app-2.3.0/lex/_version.py +0 -1
- {lex_app-2.3.0 → lex_app-2.3.2}/LICENSE.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/README.md +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/generate_pycharm_configs.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/__main__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/BackendHealthConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/CalculationLogConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/CalculationsConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/LogConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/ModelDataUpdateConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/UpdateCalculationStatusConsumer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/consumers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/filters/FilterTreeNode.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/filters/GenericFilters.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/filters/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/middleware/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/middleware/keycloak_permissions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/serializers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/serializers/base_serializers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/serializers/sensitive_fields.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/Context.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/api_key_requests.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/collection_utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/converters.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/helpers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/utils/temporal.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/LexLoggerView/LexLoggerView.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/LexLoggerView/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/ModelStructureObtainView.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/authentication/KeycloakManager.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/authentication/UserAPIView.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/authentication/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/calculations/ActiveCalculations.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/calculations/CleanCalculations.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/calculations/DownloadMarkdownPdf.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/calculations/InitCalculationLogs.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/calculations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/file_operations/FileDownload.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/file_operations/ModelExport.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/file_operations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/global_search_for_models/Search.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/global_search_for_models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/lex_api/LexAPI.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/lex_api/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/CalculationLogTreeView.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/History.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/List.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/Many.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/One.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/filter_backends.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/serializers/CalculationLogTreeSerializer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/serializers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_info/Fields.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_info/Widgets.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_info/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/pagination.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/permissions/ModelPermissions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/permissions/UserPermission.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/permissions/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/process_flow/CreateOrUpdate.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/process_flow/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/project_info/ProjectInfo.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/project_info/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/rbac/RBACInfo.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/rbac/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/sharepoint/DeleteUnusedFiles.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/sharepoint/SharePointFileDownload.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/sharepoint/SharePointPreview.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/sharepoint/SharePointShareLink.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/sharepoint/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/streamlit/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/dark-lex-logo.svg +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-bg.jpg +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-logo.png +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-logo.svg +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-test-report/email.html +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-test-report/lex-icon.png +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-test-report/lex-logo.png +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/assets/lex-test-report/pdf.html +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/handlers/ConsoleHandler.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/handlers/LexLogger.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/handlers/WebSocketHandler.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/handlers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0001_initial.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0002_auditlog_created_at_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0003_alter_auditlog_created_at_alter_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0004_remove_auditlog_audit_fields.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0005_calculationlog_calculationid_index.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0006_alter_auditlog_calculation_id.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0007_calculationlog_heading.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/mixins/AuditLogMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/mixins/BulkAuditLogMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/mixins/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/models/AuditLog.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/models/AuditLogStatus.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/models/CalculationLog.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/serializers/AuditLogMixinSerializer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/serializers/AuditLogSerializer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/serializers/CalculationLogSerializer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/serializers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/CacheManager.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/ContextResolver.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/DataModels.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/InitialDataAuditLogger.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/ModelContext.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/WebSocketNotifier.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/calculation_audit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/content_types.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/latest_calculation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/utils/legacy_audit_payload.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/authentication_backends/BearerMiddlewareAuthentication.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/authentication_backends/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/createprofiles.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/delete_keycloak_resources.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/keycloak_backup.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/keycloak_init_bak.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/keycloak_rollback_bak.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/management/commands/register_keycloak_resources.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/middleware.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/migrations/0001_initial.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/models/Profile.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/utils/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/utils/lex_authentication.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/views/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/views/permissions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/views/token_views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/authentication/views/user_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/backfill_history_sql.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/bin/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/bin/lex.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/calculated_updates/ObjectsToRecalculateStore.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/calculated_updates/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/calculated_updates/update_handler.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/cancellation/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/cancellation/cluster_cancel_index.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/exceptions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/fields/PDF_field.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/fields/XLSX_field.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/fields/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/management/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/management/commands/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/management/commands/bootstrap_callback_server.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/middleware/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/middleware/embed_token_auth.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/middleware/embed_xframe.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/migrations/0001_bitemporal_activation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/mixins/CalculatedModelMixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/mixins/ModelModificationRestriction.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/mixins/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models/CalculationModel.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models/HTMLReport.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models/LexModel.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models/Process.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/Bitemporal.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/MetaHistory.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/StandardHistory.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/activation_applier.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/bitemporal_signals.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/services/signal_registry.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/signals/ActiveCalculationStateStore.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/signals/CalculationSignals.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/signals/ModelMutationSignal.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/signals/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tasks/CeleryTaskDispatcher.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tasks/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tests/_bitemporal_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tests/bitemporal_test_settings.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tests/check_schema.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/tests/test_calculation_history_transitions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/transactions/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/transactions/transactions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/core/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/extract_legacy_logs.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/fix_v1_migration.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/full_migration_workflow.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/helpers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/helpers/cache_tables.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/legacy_calculation_id_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/legacy_calculation_log_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/legacy_log_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/legacy_user_change_log_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/admin/read_only_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/migrations/0001_initial.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/migrations/0002_alter_legacycalculationid_options_and_more.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/migrations/0003_legacylog.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/models/legacy_calculation_id.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/models/legacy_calculation_log.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/models/legacy_log.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/models/legacy_user_change_log.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/serializers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/legacy_data/serializers/legacy_data_serializers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/asgi.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/entrypoint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/exceptions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/heartbeat.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/redis_keys.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/registry.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_recovery/supervisor.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/celery_tasks.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/design_system/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/design_system/lex_tokens.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/fast_health.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/keycloak_exclusions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/Init2.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/backfill_audit_logging.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/backfill_bitemporal_history.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/bootstrap_keycloak.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/capture_db_tables.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/capture_migration_state.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/create_db.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/detect_model_changes.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/full_migration_workflow.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/generate_legacy_freeze_manifest.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/init.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/lex_migrate.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/normalize_is_calculated.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/rebase_incident_datetimes.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/rollback_migration_state.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/run_recovery_supervisor.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/sync_keycloak.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_command.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_payload.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_bootstrap_callback_server.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_init_command.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_lex_pytest_report_flags.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/management/commands/tests/test_migration_workflow_commands.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/migrations/0001_initial.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/migrations/0002_delete_asoftestmodel_and_more.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/Reflex.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/app.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/auth.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/dashboards.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/django_orm.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/examples/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/reflex/examples/_reflex_structure.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/routing.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/runtime_health.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/settings.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/simple_history_config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/Streamlit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/_lex_view_component/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/_lex_view_component/frontend/index.html +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/_widget_host_component/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/_widget_host_component/frontend/index.html +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/eager_frames.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/embed.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/examples/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/examples/_streamlit_structure.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/quackback.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/sidebar.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/theme/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/theme/config_writer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/theme/mapping.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/theme/tokens.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/widgets/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/widgets/host.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/widgets/keys.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/streamlit/widgets/spec.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/tests/ProcessAdminTestCase.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/tests/create_db.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/urls.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/lex_app/wsgi.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/manage.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/mcp_server/tools/embed.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/ModelCollection.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/ModelContainer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/ModelProcessAdmin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/constants.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models/utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/settings/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/settings/process_admin_settings.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/sites/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/sites/process_admin_site.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/tests/django_test_settings.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/tests/urls.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/bitemporal_sync.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/local_scheduler.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/model_registration.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/model_structure.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/utils/model_structure_builder.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/views/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/views/model_relation_views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/process_admin/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/proxy.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/tests.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/react/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/reflex_app.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/restore_legacy_logs.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/runtime_config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/sanitize_v2_migrations.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/streamlit_app.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/streamlit_theme.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/lex_config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/_e2e_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10a_crud_endpoints.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10b_history_endpoint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10c_many_endpoint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10d_reflex_search_exclusion.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10e_schema_introspection.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10f_global_search.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10g_one_endpoint_lifecycle.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10h_lex_api_sdk.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10i_fields_view_and_list_ui.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10j_filter_backends_and_storage.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10k_destroy_with_payload_mixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10l_file_download_view.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10m_calculation_log_tree.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/api_layer/test_10n_active_calculations_endpoint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/extra_models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6a_api_audit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6b_calculation_audit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6c_actor_resolution.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6d_payload_and_gfk.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6e_bulk_audit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6f_resilience.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6g_immutability.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6h_cache_manager.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6i_calculation_via_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6j_audit_utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6k_model_contracts.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6l_context_and_gfk_resolution.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6m_lexlogger_and_websocket.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6n_audit_log_serializers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6o_bulk_audit_normalize.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/audit_logging/test_6q_root_detection_with_headings.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15a_builder_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15b_child_node_creation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15c_silent_and_mixed.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15d_three_level_chain.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15e_combinatorial_pipeline.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15f_save_boundary.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15g_heading_context.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15h_pdf_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15i_latest_run_on_the_row.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculation_logging/test_15j_failed_run_keeps_its_log.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7a_atomic.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7b_non_atomic.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7c_hierarchy.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7d_state_guards.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7e_persistence_internals.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7f_combination_engine.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7g_create_pipeline.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7h_celery_dispatch.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7i_atomicity_matrix.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7j_three_level_matrix.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7k_exceptions_restrictions_xlsx.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7l_recalc_queue.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7m_calc_signals.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7n_cancellation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7o_fk_violation_abort.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7p_streaming_expansion.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7q_worker_default_dispatch.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/calculations/test_7s_calculation_audit_columns.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8a_sync_fallback.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8aa_postrun_shutdown_guard.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8ab_dispatcher_join_worker_safe.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8ac_sync_fallback_idempotent.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8ad_dispatched_task_cancel_marker.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8b_dispatch_context.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8c_calculation_audit_columns.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8g_task_infrastructure.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8h_eager_end_to_end.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8i_scope_contracts.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8j_task_bodies.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8k_redis_broker_integration.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8l_celery_dispatcher.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8m_undecorated_dispatch.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8u_cancel_revoke.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8v_cluster_cascade_cancel.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8w_recovery_terminal_guard.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8x_startup_reset_recovery_handoff.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/celery_async/test_8y_beat_recovery_driver.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2a_create.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2b_read.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2c_update.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2d_delete.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2e_bulk.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2f_missing_scenarios.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2f_ordering.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2g_filtering.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2i_cancel_endpoint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/crud_api/test_2j_instance_api_key.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/design_system/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/design_system/test_lex_tokens.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13a_legacy_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13b_ag_grid_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13c_grouped_selected.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13d_auth_edge.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13e_streaming_fast_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13f_export_timezone.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13g_xlsx_field_timezone.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/exports/test_13h_xlsx_field_binding.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/fixtures/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/gate_selftest/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/gate_selftest/test_gate_selftest.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5_11_fallback_snapshot.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5a_basic_history.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5b_calculation_history.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5c_history_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5g_valid_to_chaining.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5h_suppression_toolkit.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5i_api_contract.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5j_snapshot_actor.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5k_metahistory.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5l_future_valid_from.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5m_asof_edit_time.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/history/test_5o_activation_applier.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/initial_data/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/initial_data/test_1c_initial_data.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/initial_data/test_1f_seed_idempotency.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/initial_data/test_1i_initial_data_journey.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1a_lex_setup.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1aa_embedded_token_renewal.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ab_ignored_role_policy_cleanup.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ac_streamlit_session_survival.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ac_widget_host_manifest.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ad_proxy_assets_and_session_durability.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ad_streamlit_theme_follower.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ae_streamlit_theme.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1af_theme_switch_preserves_brand.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ag_spa_asset_caching.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ah_metadata_cache_headers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ai_eager_component_frames.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1aj_streamlit_sidebar_chrome.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ak_widget_keys_and_flow.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1al_example_dashboard.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1am_quackback_launcher.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1an_proxy_http2_safe_headers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ao_flow_composable_steps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ao_frontend_resolution.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ap_reflex_cli.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1aq_reflex_dashboards.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1ar_reflex_automatic_sign_in.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1as_reflex_token_cookie_compression.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1b_default_authz.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1b_lex_init.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1d_init_helpers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1e_keycloak_sync_manager.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1f_keycloak_drift.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1g_sync_manager_admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1h_bootstrap_flow.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1i_rebase_incident_datetimes.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1j_client_preflight.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1k_client_preflight_integration.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1l_full_pipeline_integration.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1m_cli_commands.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1n_init_helper_paths.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1o_lazy_imports_and_helpers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1p_settings_urls_views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1q_migration_files_complete.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1r_fetched_datetime_zone.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1s_log_cleanup_and_lex_debug.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1t_disable_server_side_cursors.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1u_fast_health_asgi.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1v_scheduler_tz_invariant.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1w_recovery_default_deployment_target.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1x_runtime_health_metadata.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1y_ide_run_configs.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/init/test_1z_proxy_iframe_breakout.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/test_journey_a_invoice_lifecycle.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/test_journey_b_portfolio_calculation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/test_journey_c_role_aware_visibility.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/test_journey_d_audit_trail.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/journeys/test_journey_e_validation_gate.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4a_field_level.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4b_action_level.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4c_keycloak_fallback.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4d_user_context.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4e_filter_backend.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4f_serializer_mixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4g_user_permissions_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4h_full_deny_matrix.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4i_permission_helpers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4j_filter_backends.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4m_api_key_middleware.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/permissions/test_4n_reflex_permissions.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/test_14a_query_params.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/test_14b_ag_post_filter_model.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/test_14c_ag_post_group_pivot.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/test_14e_secondary_branches.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/queries/test_14h_list_query_paths.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12a_history_meta_scopes.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12a_read_contract.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12b_type_roundtrip.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12c_list_and_many.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12d_audit_log_payload.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12e_factory.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12f_write_paths.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12g_datetime_tz_ambiguity.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12h_filefield_clear.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12i_fk_display_names.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12j_datetime_roundtrip_convention.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/serializers/test_12k_sensitive_field_denylist.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9_7_suppression_guards.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9a_state_and_broadcast.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9c_cache_cleanup.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9d_active_calculation_state_store.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9e_model_mutation_broadcast.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/signals_ws/test_9f_core_consumers.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/_stress_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11a_seed_baseline.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11b_list.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11c_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11d_period_calc.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11e_bulk_api.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11f_growth_and_scale.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11g_fk_heavy_export.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11h_calc_log_overhead.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/stress/test_11i_save_fingerprint.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3a_pre_validation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3b_post_validation.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3c_hook_ordering.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3d_recursion_guard.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3e_snapshot_lifecycle.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3f_lean_initial_state.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/test_project/tests/validation_hooks/test_3g_aware_datetime_assignment.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/e2e/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/e2e/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/e2e/_e2e_test_case.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/calculation/test_calculated_model_mixin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/calculation/test_calculation_wait_contexts.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_ai_asset_mode_sync.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_ai_update_bootstrap.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_ai_windows_parity.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_celery_recovery.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_mcp_server_sdk_compat.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tests/unit/infra/test_worker_self_termination.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/ai_dashboard.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/ai_faq.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/ai_issue_report.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/ai_worktree.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/django_bootstrap.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/mcp_mode_invoke.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/project_root.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/setup_with_ai.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/test_groups.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/tools/verify_ai_assets.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/admin.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/apps.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/channel_layer.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/config/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/config/generic_app_config.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/decorators/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/decorators/singleton.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/import_system/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/import_system/import_utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/import_system/model_loader.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/import_system/module_finder.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/migrations/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/models.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/storage/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/storage/custom_storage.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/utils/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/utils/gcs_utils.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex/utilities/views.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex_app.egg-info/dependency_links.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex_app.egg-info/entry_points.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex_app.egg-info/requires.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/lex_app.egg-info/top_level.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/migrations_logic/__init__.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/migrations_logic/fix_migrations.py +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/requirements.txt +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/setup.cfg +0 -0
- {lex_app-2.3.0 → lex_app-2.3.2}/setup.py +0 -0
|
@@ -8,6 +8,8 @@ recursive-include lex/react *
|
|
|
8
8
|
# works without installing the frontend package.
|
|
9
9
|
recursive-exclude lex/react/build *
|
|
10
10
|
recursive-include lex/assets *
|
|
11
|
+
# Read at runtime by the core migration 0001; see pyproject.toml package-data.
|
|
12
|
+
recursive-include lex/core/sql *.sql
|
|
11
13
|
include pyproject.toml
|
|
12
14
|
include requirements*.txt
|
|
13
15
|
include generate_pycharm_configs.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.3.2"
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
-- In-database activation of future-dated bitemporal records.
|
|
2
|
+
--
|
|
3
|
+
-- Installed by the lex.core migration ``0001_bitemporal_activation`` (PostgreSQL
|
|
4
|
+
-- only; other backends keep the in-process fallback). Called every minute by the
|
|
5
|
+
-- pg_cron job the instance controller registers per instance database:
|
|
6
|
+
--
|
|
7
|
+
-- SELECT lex_apply_due_activations();
|
|
8
|
+
--
|
|
9
|
+
-- Design and rationale:
|
|
10
|
+
-- docs/superpowers/specs/2026-09-16-bitemporal-activation-applier-design.md
|
|
11
|
+
--
|
|
12
|
+
-- One table and three functions, one contract:
|
|
13
|
+
--
|
|
14
|
+
-- lex_bitemporal_tables() discovery - every (main, history, meta, pk) triple,
|
|
15
|
+
-- derived from the catalog on every call.
|
|
16
|
+
-- Nothing is registered; nothing can be stale.
|
|
17
|
+
-- lex_pending_activations() visibility - every SCHEDULED meta row across every
|
|
18
|
+
-- triple, due or not, with how long it has
|
|
19
|
+
-- been due. Read-only. The monitoring surface.
|
|
20
|
+
-- lex_apply_due_activations() the applier - for every record with a due SCHEDULED
|
|
21
|
+
-- meta row: converge the main row to the
|
|
22
|
+
-- history row that is effective *now*, then
|
|
23
|
+
-- flip the due meta rows to DONE, in place.
|
|
24
|
+
-- Writes a heartbeat row on every run.
|
|
25
|
+
--
|
|
26
|
+
-- All three are SECURITY DEFINER: the cron job runs as the server admin the controller
|
|
27
|
+
-- uses, and the functions execute with the privileges of the app role that owns the
|
|
28
|
+
-- tables (the role that ran the migration). search_path is pinned with pg_catalog
|
|
29
|
+
-- first so nothing in public can shadow a catalog function.
|
|
30
|
+
--
|
|
31
|
+
-- The applier computes an end state; it never replays a sequence. Two runs produce one
|
|
32
|
+
-- result, and running it beside the Python path (activate_history_version) is safe:
|
|
33
|
+
-- both lock the history row, both upsert the main row, both flip only SCHEDULED rows.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
-- ---------------------------------------------------------------------------
|
|
37
|
+
-- Heartbeat
|
|
38
|
+
-- ---------------------------------------------------------------------------
|
|
39
|
+
-- One row, id = 1, upserted at the end of every applier run whether or not anything was
|
|
40
|
+
-- due. lex-app reads last_run_at at save time (activation_applier.applier_is_alive) to
|
|
41
|
+
-- decide whether a future-dated save still needs an in-process timer; operators read
|
|
42
|
+
-- the rest. Deliberately not a Django model: the framework registers every concrete
|
|
43
|
+
-- model it discovers under lex/ for history tracking and for the model list, and an
|
|
44
|
+
-- operational heartbeat belongs in neither.
|
|
45
|
+
CREATE TABLE IF NOT EXISTS lex_activation_applier_state (
|
|
46
|
+
id smallint PRIMARY KEY CHECK (id = 1),
|
|
47
|
+
last_run_at timestamptz NOT NULL,
|
|
48
|
+
last_run_applied integer NOT NULL DEFAULT 0,
|
|
49
|
+
last_run_failed integer NOT NULL DEFAULT 0,
|
|
50
|
+
last_run_duration_ms integer NOT NULL DEFAULT 0
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
-- ---------------------------------------------------------------------------
|
|
55
|
+
-- Discovery
|
|
56
|
+
-- ---------------------------------------------------------------------------
|
|
57
|
+
-- Rules (design §5.2):
|
|
58
|
+
-- 1. a meta table has all of meta_task_status, history_object_id, sys_from, sys_to;
|
|
59
|
+
-- 2. the main table is the meta table minus its "_meta_history" suffix;
|
|
60
|
+
-- 3. the history table is the main table with "historical" inserted before the LAST
|
|
61
|
+
-- underscore (model names never contain "_", app labels may);
|
|
62
|
+
-- 4. keep the triple only if all three tables exist and the main table has a
|
|
63
|
+
-- single-column primary key. Anything else is skipped with a NOTICE.
|
|
64
|
+
CREATE OR REPLACE FUNCTION lex_bitemporal_tables()
|
|
65
|
+
RETURNS TABLE (main_table text, history_table text, meta_table text, pk_column text)
|
|
66
|
+
LANGUAGE plpgsql STABLE SECURITY DEFINER
|
|
67
|
+
SET search_path = pg_catalog, public
|
|
68
|
+
AS $fn$
|
|
69
|
+
DECLARE
|
|
70
|
+
v_schema constant text := 'public';
|
|
71
|
+
r record;
|
|
72
|
+
v_main text;
|
|
73
|
+
v_hist text;
|
|
74
|
+
v_pk_count int;
|
|
75
|
+
v_pk text;
|
|
76
|
+
BEGIN
|
|
77
|
+
FOR r IN
|
|
78
|
+
SELECT c.table_name::text AS meta_t
|
|
79
|
+
FROM information_schema.columns c
|
|
80
|
+
WHERE c.table_schema = v_schema
|
|
81
|
+
AND c.column_name IN ('meta_task_status', 'history_object_id', 'sys_from', 'sys_to')
|
|
82
|
+
GROUP BY c.table_name
|
|
83
|
+
HAVING count(DISTINCT c.column_name) = 4
|
|
84
|
+
ORDER BY c.table_name
|
|
85
|
+
LOOP
|
|
86
|
+
IF right(r.meta_t, 13) <> '_meta_history' THEN
|
|
87
|
+
RAISE NOTICE 'lex_bitemporal_tables: % has the meta shape but not the meta name; skipped', r.meta_t;
|
|
88
|
+
CONTINUE;
|
|
89
|
+
END IF;
|
|
90
|
+
v_main := left(r.meta_t, length(r.meta_t) - 13);
|
|
91
|
+
v_hist := regexp_replace(v_main, '_([^_]+)$', '_historical\1');
|
|
92
|
+
|
|
93
|
+
IF to_regclass(format('%I.%I', v_schema, v_main)) IS NULL THEN
|
|
94
|
+
RAISE NOTICE 'lex_bitemporal_tables: main table % missing for %; skipped', v_main, r.meta_t;
|
|
95
|
+
CONTINUE;
|
|
96
|
+
END IF;
|
|
97
|
+
IF to_regclass(format('%I.%I', v_schema, v_hist)) IS NULL THEN
|
|
98
|
+
RAISE NOTICE 'lex_bitemporal_tables: history table % missing for %; skipped', v_hist, r.meta_t;
|
|
99
|
+
CONTINUE;
|
|
100
|
+
END IF;
|
|
101
|
+
|
|
102
|
+
SELECT count(*), min(a.attname::text)
|
|
103
|
+
INTO v_pk_count, v_pk
|
|
104
|
+
FROM pg_index i
|
|
105
|
+
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY (i.indkey)
|
|
106
|
+
WHERE i.indrelid = to_regclass(format('%I.%I', v_schema, v_main))
|
|
107
|
+
AND i.indisprimary;
|
|
108
|
+
IF v_pk_count <> 1 THEN
|
|
109
|
+
RAISE NOTICE 'lex_bitemporal_tables: % has % primary-key column(s); skipped', v_main, v_pk_count;
|
|
110
|
+
CONTINUE;
|
|
111
|
+
END IF;
|
|
112
|
+
|
|
113
|
+
main_table := v_main;
|
|
114
|
+
history_table := v_hist;
|
|
115
|
+
meta_table := r.meta_t;
|
|
116
|
+
pk_column := v_pk;
|
|
117
|
+
RETURN NEXT;
|
|
118
|
+
END LOOP;
|
|
119
|
+
END
|
|
120
|
+
$fn$;
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
-- ---------------------------------------------------------------------------
|
|
124
|
+
-- Visibility
|
|
125
|
+
-- ---------------------------------------------------------------------------
|
|
126
|
+
-- Every SCHEDULED meta row, joined to its history row. A meta row whose history row is
|
|
127
|
+
-- gone (history_object_id NULL) is listed with NULL pk/valid_from: an orphan the applier
|
|
128
|
+
-- will never touch and an operator should see.
|
|
129
|
+
CREATE OR REPLACE FUNCTION lex_pending_activations()
|
|
130
|
+
RETURNS TABLE (
|
|
131
|
+
main_table text,
|
|
132
|
+
pk text,
|
|
133
|
+
history_id bigint,
|
|
134
|
+
meta_history_id bigint,
|
|
135
|
+
valid_from timestamptz,
|
|
136
|
+
due boolean,
|
|
137
|
+
due_for interval,
|
|
138
|
+
meta_task_status text
|
|
139
|
+
)
|
|
140
|
+
LANGUAGE plpgsql STABLE SECURITY DEFINER
|
|
141
|
+
SET search_path = pg_catalog, public
|
|
142
|
+
AS $fn$
|
|
143
|
+
DECLARE
|
|
144
|
+
t record;
|
|
145
|
+
BEGIN
|
|
146
|
+
FOR t IN SELECT * FROM lex_bitemporal_tables() LOOP
|
|
147
|
+
RETURN QUERY EXECUTE format(
|
|
148
|
+
$q$SELECT %1$L::text,
|
|
149
|
+
h.%2$I::text,
|
|
150
|
+
h.history_id::bigint,
|
|
151
|
+
m.meta_history_id::bigint,
|
|
152
|
+
h.valid_from::timestamptz,
|
|
153
|
+
(h.valid_from <= now()),
|
|
154
|
+
GREATEST(now() - h.valid_from, interval '0'),
|
|
155
|
+
m.meta_task_status::text
|
|
156
|
+
FROM %3$I m
|
|
157
|
+
LEFT JOIN %4$I h ON h.history_id = m.history_object_id
|
|
158
|
+
WHERE m.meta_task_status = 'SCHEDULED'
|
|
159
|
+
ORDER BY h.valid_from NULLS LAST, m.meta_history_id$q$,
|
|
160
|
+
t.main_table, t.pk_column, t.meta_table, t.history_table);
|
|
161
|
+
END LOOP;
|
|
162
|
+
END
|
|
163
|
+
$fn$;
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
-- ---------------------------------------------------------------------------
|
|
167
|
+
-- The applier
|
|
168
|
+
-- ---------------------------------------------------------------------------
|
|
169
|
+
-- Returns the number of records converged in this run. Per record, steps 1-3 run in
|
|
170
|
+
-- their own sub-transaction: one failing record raises a WARNING (visible in
|
|
171
|
+
-- cron.job_run_details) and the loop continues.
|
|
172
|
+
CREATE OR REPLACE FUNCTION lex_apply_due_activations()
|
|
173
|
+
RETURNS integer
|
|
174
|
+
LANGUAGE plpgsql SECURITY DEFINER
|
|
175
|
+
SET search_path = pg_catalog, public
|
|
176
|
+
AS $fn$
|
|
177
|
+
DECLARE
|
|
178
|
+
v_schema constant text := 'public';
|
|
179
|
+
t record;
|
|
180
|
+
d record;
|
|
181
|
+
e record;
|
|
182
|
+
v_cols text;
|
|
183
|
+
v_set text;
|
|
184
|
+
v_applied int := 0;
|
|
185
|
+
v_failed int := 0;
|
|
186
|
+
v_started timestamptz := clock_timestamp();
|
|
187
|
+
v_err text;
|
|
188
|
+
BEGIN
|
|
189
|
+
FOR t IN SELECT * FROM lex_bitemporal_tables() LOOP
|
|
190
|
+
FOR d IN EXECUTE format(
|
|
191
|
+
$q$SELECT DISTINCT h.%1$I AS pk
|
|
192
|
+
FROM %2$I m
|
|
193
|
+
JOIN %3$I h ON h.history_id = m.history_object_id
|
|
194
|
+
WHERE m.meta_task_status = 'SCHEDULED'
|
|
195
|
+
AND h.valid_from <= now()$q$,
|
|
196
|
+
t.pk_column, t.meta_table, t.history_table)
|
|
197
|
+
LOOP
|
|
198
|
+
BEGIN
|
|
199
|
+
-- 1. The history row effective now, locked. Same predicate, same lock
|
|
200
|
+
-- order (history before main) as BitemporalSynchronizer.
|
|
201
|
+
EXECUTE format(
|
|
202
|
+
$q$SELECT history_id, history_type
|
|
203
|
+
FROM %1$I
|
|
204
|
+
WHERE %2$I = $1
|
|
205
|
+
AND valid_from <= now()
|
|
206
|
+
AND (valid_to > now() OR valid_to IS NULL)
|
|
207
|
+
ORDER BY valid_from DESC, history_id DESC
|
|
208
|
+
LIMIT 1
|
|
209
|
+
FOR UPDATE$q$,
|
|
210
|
+
t.history_table, t.pk_column)
|
|
211
|
+
INTO e USING d.pk;
|
|
212
|
+
|
|
213
|
+
IF e.history_id IS NULL OR e.history_type = '-' THEN
|
|
214
|
+
-- 2a. Nothing is valid now, or the effective row is a deletion:
|
|
215
|
+
-- the main row must not exist. Mirrors the Python path.
|
|
216
|
+
EXECUTE format('DELETE FROM %I WHERE %I = $1', t.main_table, t.pk_column)
|
|
217
|
+
USING d.pk;
|
|
218
|
+
ELSE
|
|
219
|
+
-- 2b. columns(main) ∩ columns(history), derived at apply time, so a
|
|
220
|
+
-- migration between save and apply cannot break the copy. The
|
|
221
|
+
-- history table's own columns fall out: main does not have them.
|
|
222
|
+
SELECT string_agg(format('%I', c.column_name), ', ' ORDER BY c.ordinal_position),
|
|
223
|
+
string_agg(format('%1$I = EXCLUDED.%1$I', c.column_name), ', ' ORDER BY c.ordinal_position)
|
|
224
|
+
FILTER (WHERE c.column_name <> t.pk_column)
|
|
225
|
+
INTO v_cols, v_set
|
|
226
|
+
FROM information_schema.columns c
|
|
227
|
+
WHERE c.table_schema = v_schema
|
|
228
|
+
AND c.table_name = t.main_table
|
|
229
|
+
AND EXISTS (SELECT 1
|
|
230
|
+
FROM information_schema.columns h
|
|
231
|
+
WHERE h.table_schema = v_schema
|
|
232
|
+
AND h.table_name = t.history_table
|
|
233
|
+
AND h.column_name = c.column_name);
|
|
234
|
+
IF v_set IS NULL THEN
|
|
235
|
+
EXECUTE format(
|
|
236
|
+
'INSERT INTO %1$I (%2$s) SELECT %2$s FROM %3$I WHERE history_id = $1 '
|
|
237
|
+
'ON CONFLICT (%4$I) DO NOTHING',
|
|
238
|
+
t.main_table, v_cols, t.history_table, t.pk_column)
|
|
239
|
+
USING e.history_id;
|
|
240
|
+
ELSE
|
|
241
|
+
EXECUTE format(
|
|
242
|
+
'INSERT INTO %1$I (%2$s) SELECT %2$s FROM %3$I WHERE history_id = $1 '
|
|
243
|
+
'ON CONFLICT (%4$I) DO UPDATE SET %5$s',
|
|
244
|
+
t.main_table, v_cols, t.history_table, t.pk_column, v_set)
|
|
245
|
+
USING e.history_id;
|
|
246
|
+
END IF;
|
|
247
|
+
END IF;
|
|
248
|
+
|
|
249
|
+
-- 3. Flip every due SCHEDULED meta version for this record, in place:
|
|
250
|
+
-- the same UPDATE the Python task issues. No new meta version.
|
|
251
|
+
EXECUTE format(
|
|
252
|
+
$q$UPDATE %1$I m
|
|
253
|
+
SET meta_task_status = 'DONE'
|
|
254
|
+
FROM %2$I h
|
|
255
|
+
WHERE h.history_id = m.history_object_id
|
|
256
|
+
AND h.%3$I = $1
|
|
257
|
+
AND h.valid_from <= now()
|
|
258
|
+
AND m.meta_task_status = 'SCHEDULED'$q$,
|
|
259
|
+
t.meta_table, t.history_table, t.pk_column)
|
|
260
|
+
USING d.pk;
|
|
261
|
+
|
|
262
|
+
v_applied := v_applied + 1;
|
|
263
|
+
EXCEPTION WHEN OTHERS THEN
|
|
264
|
+
v_failed := v_failed + 1;
|
|
265
|
+
GET STACKED DIAGNOSTICS v_err = MESSAGE_TEXT;
|
|
266
|
+
RAISE WARNING 'lex_apply_due_activations: % pk % failed: %', t.main_table, d.pk, v_err;
|
|
267
|
+
END;
|
|
268
|
+
END LOOP;
|
|
269
|
+
END LOOP;
|
|
270
|
+
|
|
271
|
+
-- Heartbeat. lex-app reads last_run_at at save time to decide whether it still
|
|
272
|
+
-- needs an in-process timer (design §5.8); operators read the rest.
|
|
273
|
+
INSERT INTO lex_activation_applier_state (id, last_run_at, last_run_applied, last_run_failed, last_run_duration_ms)
|
|
274
|
+
VALUES (1, now(), v_applied, v_failed,
|
|
275
|
+
(extract(epoch FROM clock_timestamp() - v_started) * 1000)::int)
|
|
276
|
+
ON CONFLICT (id) DO UPDATE
|
|
277
|
+
SET last_run_at = EXCLUDED.last_run_at,
|
|
278
|
+
last_run_applied = EXCLUDED.last_run_applied,
|
|
279
|
+
last_run_failed = EXCLUDED.last_run_failed,
|
|
280
|
+
last_run_duration_ms = EXCLUDED.last_run_duration_ms;
|
|
281
|
+
|
|
282
|
+
RETURN v_applied;
|
|
283
|
+
END
|
|
284
|
+
$fn$;
|
|
@@ -217,6 +217,7 @@ lex/core/signals/ActiveCalculationStateStore.py
|
|
|
217
217
|
lex/core/signals/CalculationSignals.py
|
|
218
218
|
lex/core/signals/ModelMutationSignal.py
|
|
219
219
|
lex/core/signals/__init__.py
|
|
220
|
+
lex/core/sql/bitemporal_activation.sql
|
|
220
221
|
lex/core/tasks/CeleryTaskDispatcher.py
|
|
221
222
|
lex/core/tasks/__init__.py
|
|
222
223
|
lex/core/tests/__init__.py
|
|
@@ -47,6 +47,12 @@ include = ["lex*", "migrations_logic*"]
|
|
|
47
47
|
# install reads it from the source tree, so the gap only shows up in a built
|
|
48
48
|
# wheel -- where lex_widgets() would fail to find its component frontend.
|
|
49
49
|
"lex.lex_app.streamlit._widget_host_component" = ["frontend/**/*"]
|
|
50
|
+
# The core migration 0001 executes this file to install the in-database
|
|
51
|
+
# activation applier. It was missing here from 2.2.2 to 2.3.1: an editable
|
|
52
|
+
# install reads the source tree, so every test passed, while every built wheel
|
|
53
|
+
# shipped the migration without its SQL -- and `lex init` aborted on the first
|
|
54
|
+
# start of any instance that installed one.
|
|
55
|
+
"lex.core" = ["sql/*.sql"]
|
|
50
56
|
|
|
51
57
|
[tool.setuptools.exclude-package-data]
|
|
52
58
|
# Belt and braces with MANIFEST.in. include-package-data is on by default for
|
lex_app-2.3.0/lex/_version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.3.0"
|
|
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
|
|
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
|
{lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py
RENAMED
|
File without changes
|
{lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py
RENAMED
|
File without changes
|
{lex_app-2.3.0 → lex_app-2.3.2}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.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
|
|
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
|
{lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0004_remove_auditlog_audit_fields.py
RENAMED
|
File without changes
|
|
File without changes
|
{lex_app-2.3.0 → lex_app-2.3.2}/lex/audit_logging/migrations/0006_alter_auditlog_calculation_id.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|