lex-app 2.2.2__tar.gz → 2.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {lex_app-2.2.2/lex_app.egg-info → lex_app-2.3.0}/PKG-INFO +3 -1
- {lex_app-2.2.2 → lex_app-2.3.0}/generate_pycharm_configs.py +5 -0
- lex_app-2.3.0/lex/_version.py +1 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/global_search_for_models/Search.py +1 -1
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/bin/lex.py +195 -19
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/LexModel.py +27 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/apps.py +20 -2
- lex_app-2.3.0/lex/lex_app/reflex/Reflex.py +27 -0
- lex_app-2.3.0/lex/lex_app/reflex/__init__.py +82 -0
- lex_app-2.3.0/lex/lex_app/reflex/app.py +40 -0
- lex_app-2.3.0/lex/lex_app/reflex/auth.py +691 -0
- lex_app-2.3.0/lex/lex_app/reflex/config.py +122 -0
- lex_app-2.3.0/lex/lex_app/reflex/dashboards.py +383 -0
- lex_app-2.3.0/lex/lex_app/reflex/django_orm.py +164 -0
- lex_app-2.3.0/lex/lex_app/reflex/examples/__init__.py +6 -0
- lex_app-2.3.0/lex/lex_app/reflex/examples/_reflex_structure.py +125 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_structure_builder.py +5 -0
- lex_app-2.3.0/lex/reflex_app.py +17 -0
- lex_app-2.3.0/lex/test_project/tests/api_layer/test_10d_reflex_search_exclusion.py +77 -0
- lex_app-2.3.0/lex/test_project/tests/init/test_1ap_reflex_cli.py +476 -0
- lex_app-2.3.0/lex/test_project/tests/init/test_1aq_reflex_dashboards.py +827 -0
- lex_app-2.3.0/lex/test_project/tests/init/test_1ar_reflex_automatic_sign_in.py +411 -0
- lex_app-2.3.0/lex/test_project/tests/init/test_1as_reflex_token_cookie_compression.py +325 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1m_cli_commands.py +2 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1y_ide_run_configs.py +1 -0
- lex_app-2.3.0/lex/test_project/tests/permissions/test_4n_reflex_permissions.py +316 -0
- lex_app-2.3.0/lex/tools/django_bootstrap.py +80 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/project_root.py +29 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/config/generic_app_config.py +29 -4
- {lex_app-2.2.2 → lex_app-2.3.0/lex_app.egg-info}/PKG-INFO +3 -1
- {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/SOURCES.txt +17 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/requires.txt +2 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/requirements.txt +4 -0
- lex_app-2.2.2/lex/_version.py +0 -1
- {lex_app-2.2.2 → lex_app-2.3.0}/LICENSE.txt +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/MANIFEST.in +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/README.md +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/__main__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/BackendHealthConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/CalculationLogConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/CalculationsConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/LogConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/ModelDataUpdateConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/UpdateCalculationStatusConsumer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/FilterTreeNode.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/GenericFilters.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/middleware/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/middleware/keycloak_permissions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/base_serializers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/sensitive_fields.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/Context.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/api_key_requests.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/collection_utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/converters.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/helpers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/temporal.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/LexLoggerView/LexLoggerView.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/LexLoggerView/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/ModelStructureObtainView.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/KeycloakManager.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/UserAPIView.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/ActiveCalculations.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/CleanCalculations.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/DownloadMarkdownPdf.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/InitCalculationLogs.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/FileDownload.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/ModelExport.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/global_search_for_models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/lex_api/LexAPI.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/lex_api/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/CalculationLogTreeView.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/History.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/List.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/Many.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/One.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/filter_backends.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/serializers/CalculationLogTreeSerializer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/serializers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/Fields.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/Widgets.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/pagination.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/ModelPermissions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/UserPermission.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/process_flow/CreateOrUpdate.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/process_flow/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/project_info/ProjectInfo.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/project_info/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/rbac/RBACInfo.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/rbac/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/DeleteUnusedFiles.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointFileDownload.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointPreview.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointShareLink.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/streamlit/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/dark-lex-logo.svg +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-bg.jpg +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-logo.png +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-logo.svg +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/email.html +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/lex-icon.png +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/lex-logo.png +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/pdf.html +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/ConsoleHandler.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/LexLogger.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/WebSocketHandler.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0001_initial.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0002_auditlog_created_at_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0003_alter_auditlog_created_at_alter_auditlog_edited_at_and_more.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0004_remove_auditlog_audit_fields.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0005_calculationlog_calculationid_index.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0006_alter_auditlog_calculation_id.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0007_calculationlog_heading.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/AuditLogMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/BulkAuditLogMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/AuditLog.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/AuditLogStatus.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/CalculationLog.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/AuditLogMixinSerializer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/AuditLogSerializer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/CalculationLogSerializer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/CacheManager.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/ContextResolver.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/DataModels.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/InitialDataAuditLogger.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/ModelContext.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/WebSocketNotifier.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/calculation_audit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/config.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/content_types.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/latest_calculation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/legacy_audit_payload.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/authentication_backends/BearerMiddlewareAuthentication.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/authentication_backends/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/createprofiles.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/delete_keycloak_resources.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_backup.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_init_bak.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_rollback_bak.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/register_keycloak_resources.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/middleware.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/migrations/0001_initial.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models/Profile.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/utils/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/utils/lex_authentication.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/permissions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/token_views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/user_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/backfill_history_sql.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/bin/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/ObjectsToRecalculateStore.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/update_handler.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/cancellation/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/cancellation/cluster_cancel_index.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/config.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/exceptions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/PDF_field.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/XLSX_field.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/commands/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/commands/bootstrap_callback_server.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/embed_token_auth.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/embed_xframe.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/migrations/0001_bitemporal_activation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/CalculatedModelMixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/ModelModificationRestriction.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/CalculationModel.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/HTMLReport.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/Process.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/Bitemporal.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/MetaHistory.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/StandardHistory.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/activation_applier.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/bitemporal_signals.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/signal_registry.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/ActiveCalculationStateStore.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/CalculationSignals.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/ModelMutationSignal.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tasks/CeleryTaskDispatcher.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tasks/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/_bitemporal_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/bitemporal_test_settings.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/check_schema.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/test_calculation_history_transitions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/transactions/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/transactions/transactions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/extract_legacy_logs.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/fix_v1_migration.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/full_migration_workflow.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/helpers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/helpers/cache_tables.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_calculation_id_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_calculation_log_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_log_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_user_change_log_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/read_only_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0001_initial.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0002_alter_legacycalculationid_options_and_more.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0003_legacylog.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_calculation_id.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_calculation_log.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_log.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_user_change_log.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/serializers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/serializers/legacy_data_serializers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/asgi.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/entrypoint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/exceptions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/heartbeat.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/redis_keys.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/registry.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/supervisor.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_tasks.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/design_system/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/design_system/lex_tokens.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/fast_health.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/keycloak_exclusions.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/Init2.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/backfill_audit_logging.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/backfill_bitemporal_history.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/bootstrap_keycloak.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/capture_db_tables.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/capture_migration_state.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/create_db.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/detect_model_changes.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/full_migration_workflow.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/generate_legacy_freeze_manifest.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/init.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/lex_migrate.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/normalize_is_calculated.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/rebase_incident_datetimes.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/rollback_migration_state.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/run_recovery_supervisor.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/sync_keycloak.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_command.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_payload.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_bootstrap_callback_server.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_init_command.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_lex_pytest_report_flags.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_migration_workflow_commands.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/0001_initial.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/0002_delete_asoftestmodel_and_more.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/routing.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/runtime_health.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/settings.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/simple_history_config.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/Streamlit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_lex_view_component/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_lex_view_component/frontend/index.html +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_widget_host_component/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_widget_host_component/frontend/index.html +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/eager_frames.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/embed.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/examples/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/examples/_streamlit_structure.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/quackback.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/sidebar.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/config_writer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/mapping.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/tokens.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/host.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/keys.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/spec.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/ProcessAdminTestCase.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/create_db.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/urls.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/wsgi.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/manage.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/mcp_server/tools/embed.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelCollection.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelContainer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelProcessAdmin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/constants.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/settings/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/settings/process_admin_settings.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/sites/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/sites/process_admin_site.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/django_test_settings.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/urls.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/bitemporal_sync.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/local_scheduler.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_registration.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_structure.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views/model_relation_views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/proxy.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/tests.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/restore_legacy_logs.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/runtime_config.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/sanitize_v2_migrations.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/streamlit_app.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/streamlit_theme.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/lex_config.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/_e2e_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10a_crud_endpoints.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10b_history_endpoint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10c_many_endpoint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10e_schema_introspection.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10f_global_search.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10g_one_endpoint_lifecycle.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10h_lex_api_sdk.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10i_fields_view_and_list_ui.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10j_filter_backends_and_storage.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10k_destroy_with_payload_mixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10l_file_download_view.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10m_calculation_log_tree.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10n_active_calculations_endpoint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/extra_models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6a_api_audit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6b_calculation_audit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6c_actor_resolution.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6d_payload_and_gfk.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6e_bulk_audit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6f_resilience.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6g_immutability.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6h_cache_manager.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6i_calculation_via_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6j_audit_utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6k_model_contracts.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6l_context_and_gfk_resolution.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6m_lexlogger_and_websocket.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6n_audit_log_serializers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6o_bulk_audit_normalize.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6q_root_detection_with_headings.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15a_builder_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15b_child_node_creation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15c_silent_and_mixed.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15d_three_level_chain.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15e_combinatorial_pipeline.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15f_save_boundary.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15g_heading_context.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15h_pdf_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15i_latest_run_on_the_row.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15j_failed_run_keeps_its_log.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7a_atomic.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7b_non_atomic.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7c_hierarchy.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7d_state_guards.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7e_persistence_internals.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7f_combination_engine.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7g_create_pipeline.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7h_celery_dispatch.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7i_atomicity_matrix.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7j_three_level_matrix.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7k_exceptions_restrictions_xlsx.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7l_recalc_queue.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7m_calc_signals.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7n_cancellation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7o_fk_violation_abort.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7p_streaming_expansion.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7q_worker_default_dispatch.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7s_calculation_audit_columns.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8a_sync_fallback.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8aa_postrun_shutdown_guard.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8ab_dispatcher_join_worker_safe.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8ac_sync_fallback_idempotent.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8ad_dispatched_task_cancel_marker.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8b_dispatch_context.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8c_calculation_audit_columns.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8g_task_infrastructure.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8h_eager_end_to_end.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8i_scope_contracts.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8j_task_bodies.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8k_redis_broker_integration.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8l_celery_dispatcher.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8m_undecorated_dispatch.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8u_cancel_revoke.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8v_cluster_cascade_cancel.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8w_recovery_terminal_guard.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8x_startup_reset_recovery_handoff.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8y_beat_recovery_driver.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2a_create.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2b_read.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2c_update.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2d_delete.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2e_bulk.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2f_missing_scenarios.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2f_ordering.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2g_filtering.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2i_cancel_endpoint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2j_instance_api_key.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/design_system/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/design_system/test_lex_tokens.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13a_legacy_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13b_ag_grid_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13c_grouped_selected.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13d_auth_edge.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13e_streaming_fast_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13f_export_timezone.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13g_xlsx_field_timezone.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13h_xlsx_field_binding.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/fixtures/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/gate_selftest/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/gate_selftest/test_gate_selftest.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5_11_fallback_snapshot.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5a_basic_history.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5b_calculation_history.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5c_history_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5g_valid_to_chaining.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5h_suppression_toolkit.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5i_api_contract.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5j_snapshot_actor.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5k_metahistory.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5l_future_valid_from.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5m_asof_edit_time.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5o_activation_applier.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/test_1c_initial_data.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/test_1f_seed_idempotency.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/test_1i_initial_data_journey.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1a_lex_setup.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1aa_embedded_token_renewal.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ab_ignored_role_policy_cleanup.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ac_streamlit_session_survival.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ac_widget_host_manifest.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ad_proxy_assets_and_session_durability.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ad_streamlit_theme_follower.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ae_streamlit_theme.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1af_theme_switch_preserves_brand.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ag_spa_asset_caching.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ah_metadata_cache_headers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ai_eager_component_frames.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1aj_streamlit_sidebar_chrome.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ak_widget_keys_and_flow.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1al_example_dashboard.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1am_quackback_launcher.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1an_proxy_http2_safe_headers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ao_flow_composable_steps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ao_frontend_resolution.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1b_default_authz.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1b_lex_init.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1d_init_helpers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1e_keycloak_sync_manager.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1f_keycloak_drift.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1g_sync_manager_admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1h_bootstrap_flow.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1i_rebase_incident_datetimes.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1j_client_preflight.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1k_client_preflight_integration.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1l_full_pipeline_integration.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1n_init_helper_paths.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1o_lazy_imports_and_helpers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1p_settings_urls_views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1q_migration_files_complete.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1r_fetched_datetime_zone.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1s_log_cleanup_and_lex_debug.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1t_disable_server_side_cursors.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1u_fast_health_asgi.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1v_scheduler_tz_invariant.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1w_recovery_default_deployment_target.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1x_runtime_health_metadata.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1z_proxy_iframe_breakout.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_a_invoice_lifecycle.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_b_portfolio_calculation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_c_role_aware_visibility.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_d_audit_trail.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_e_validation_gate.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4a_field_level.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4b_action_level.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4c_keycloak_fallback.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4d_user_context.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4e_filter_backend.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4f_serializer_mixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4g_user_permissions_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4h_full_deny_matrix.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4i_permission_helpers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4j_filter_backends.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4m_api_key_middleware.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14a_query_params.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14b_ag_post_filter_model.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14c_ag_post_group_pivot.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14e_secondary_branches.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14h_list_query_paths.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12a_history_meta_scopes.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12a_read_contract.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12b_type_roundtrip.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12c_list_and_many.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12d_audit_log_payload.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12e_factory.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12f_write_paths.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12g_datetime_tz_ambiguity.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12h_filefield_clear.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12i_fk_display_names.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12j_datetime_roundtrip_convention.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12k_sensitive_field_denylist.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9_7_suppression_guards.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9a_state_and_broadcast.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9c_cache_cleanup.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9d_active_calculation_state_store.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9e_model_mutation_broadcast.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9f_core_consumers.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/_stress_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11a_seed_baseline.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11b_list.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11c_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11d_period_calc.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11e_bulk_api.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11f_growth_and_scale.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11g_fk_heavy_export.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11h_calc_log_overhead.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11i_save_fingerprint.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3a_pre_validation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3b_post_validation.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3c_hook_ordering.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3d_recursion_guard.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3e_snapshot_lifecycle.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3f_lean_initial_state.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3g_aware_datetime_assignment.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/_authenticated_e2e_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/_e2e_test_case.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/calculation/test_calculated_model_mixin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/calculation/test_calculation_wait_contexts.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_asset_mode_sync.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_update_bootstrap.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_windows_parity.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_celery_recovery.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_mcp_server_sdk_compat.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_worker_self_termination.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_dashboard.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_faq.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_issue_report.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_worktree.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/mcp_mode_invoke.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/setup_with_ai.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/test_groups.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/verify_ai_assets.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/admin.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/apps.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/channel_layer.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/config/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/decorators/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/decorators/singleton.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/import_utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/model_loader.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/module_finder.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/migrations/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/models.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/storage/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/storage/custom_storage.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/utils/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/utils/gcs_utils.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/views.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/dependency_links.txt +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/entry_points.txt +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/top_level.txt +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/migrations_logic/__init__.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/migrations_logic/fix_migrations.py +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/pyproject.toml +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/setup.cfg +0 -0
- {lex_app-2.2.2 → lex_app-2.3.0}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lex-app
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3.0
|
|
4
4
|
Summary: A Python / Django library to create business applications easily with complex logic
|
|
5
5
|
Author-email: Melih Sünbül <m.sunbul@excellence-cloud.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -36,6 +36,8 @@ Requires-Dist: nest_asyncio
|
|
|
36
36
|
Requires-Dist: Office365-REST-Python-Client
|
|
37
37
|
Requires-Dist: streamlit<1.62,>=1.61
|
|
38
38
|
Requires-Dist: streamlit-keycloak-lex
|
|
39
|
+
Requires-Dist: reflex<0.10,>=0.9.12
|
|
40
|
+
Requires-Dist: reflex-enterprise<0.10,>=0.9.6
|
|
39
41
|
Requires-Dist: sqlalchemy
|
|
40
42
|
Requires-Dist: django_redis
|
|
41
43
|
Requires-Dist: django-storages[google]
|
|
@@ -75,6 +75,11 @@ RUN_CONFIGS = (
|
|
|
75
75
|
"name": "Streamlit",
|
|
76
76
|
"args": ("streamlit", "run", "streamlit_app.py"),
|
|
77
77
|
},
|
|
78
|
+
{
|
|
79
|
+
"pycharm_filename": "Reflex.run.xml",
|
|
80
|
+
"name": "Reflex",
|
|
81
|
+
"args": ("reflex", "run"),
|
|
82
|
+
},
|
|
78
83
|
{
|
|
79
84
|
"pycharm_filename": "Create_DB.run.xml",
|
|
80
85
|
"name": "Create DB",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.3.0"
|
|
@@ -7,7 +7,7 @@ from rest_framework.views import APIView
|
|
|
7
7
|
from rest_framework_api_key.permissions import HasAPIKey
|
|
8
8
|
|
|
9
9
|
EXCLUDED_MODELS = {'calculationdashboard', 'user', 'group', 'permission', 'contenttype', 'userchangelog',
|
|
10
|
-
'calculationlog', 'log', 'streamlit'}
|
|
10
|
+
'calculationlog', 'log', 'streamlit', 'reflex'}
|
|
11
11
|
EXCLUDED_TYPES = {'FloatField', 'BooleanField', 'IntegerField', "FileField", "ForeignKey", "XLSXField", "PDFField", "ImageField"}
|
|
12
12
|
|
|
13
13
|
|
|
@@ -14,7 +14,11 @@ import shutil
|
|
|
14
14
|
|
|
15
15
|
import click
|
|
16
16
|
import uvicorn
|
|
17
|
-
from lex.tools.project_root import
|
|
17
|
+
from lex.tools.project_root import (
|
|
18
|
+
find_project_root,
|
|
19
|
+
load_project_env_file,
|
|
20
|
+
resolve_llm_working_directory,
|
|
21
|
+
)
|
|
18
22
|
from lex.tools.setup_with_ai import (
|
|
19
23
|
DEFAULT_LEX_MCP_MODE,
|
|
20
24
|
DEFAULT_REMOTE_MCP_URL,
|
|
@@ -83,23 +87,9 @@ PROJECT_ROOT_DIR = Path(find_project_root(os.getcwd())).resolve()
|
|
|
83
87
|
sys.path.append(LEX_APP_PACKAGE_ROOT)
|
|
84
88
|
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return
|
|
90
|
-
|
|
91
|
-
for raw_line in env_path.read_text(encoding="utf-8").splitlines():
|
|
92
|
-
line = raw_line.strip()
|
|
93
|
-
if not line or line.startswith("#") or "=" not in line:
|
|
94
|
-
continue
|
|
95
|
-
key, value = line.split("=", 1)
|
|
96
|
-
key = key.strip()
|
|
97
|
-
value = value.strip()
|
|
98
|
-
if not key:
|
|
99
|
-
continue
|
|
100
|
-
if len(value) >= 2 and value[0] == value[-1] and value[0] in {"'", '"'}:
|
|
101
|
-
value = value[1:-1]
|
|
102
|
-
os.environ.setdefault(key, value)
|
|
90
|
+
# Lives in lex/tools/project_root.py so that a process not started through this
|
|
91
|
+
# CLI -- the Reflex backend worker -- loads the same file the same way.
|
|
92
|
+
_load_project_env_file = load_project_env_file
|
|
103
93
|
|
|
104
94
|
|
|
105
95
|
_load_project_env_file(PROJECT_ROOT_DIR)
|
|
@@ -706,6 +696,187 @@ def streamlit(ctx):
|
|
|
706
696
|
t.join(timeout=float(os.getenv("LEX_PROXY_SHUTDOWN_TIMEOUT", "5")))
|
|
707
697
|
|
|
708
698
|
|
|
699
|
+
# ---------- Reflex ----------
|
|
700
|
+
|
|
701
|
+
#: What `lex reflex` writes to a project with no ``rxconfig.py`` yet. Reflex reads
|
|
702
|
+
#: its configuration from that file in the directory it runs in, so a project that
|
|
703
|
+
#: serves Reflex dashboards has one; everything lex-app needs is in `lex_config()`.
|
|
704
|
+
REFLEX_CONFIG_TEMPLATE = '''"""Reflex configuration for this Lex App project.
|
|
705
|
+
|
|
706
|
+
`lex reflex` created this file, because Reflex reads its configuration from
|
|
707
|
+
rxconfig.py in the project root. lex_config() is wired for Lex App: the Reflex
|
|
708
|
+
app lex-app serves, and Keycloak sign-in. Pass it any rx.Config / rxe.Config
|
|
709
|
+
option to override a default, e.g.
|
|
710
|
+
|
|
711
|
+
config = lex_config(show_built_with_reflex=False)
|
|
712
|
+
|
|
713
|
+
Leave the ports to `lex reflex`, which gives each run mode the ones it accepts.
|
|
714
|
+
"""
|
|
715
|
+
|
|
716
|
+
from lex.tools.django_bootstrap import prepare_environment
|
|
717
|
+
|
|
718
|
+
# The project's .env, loaded before anything reads Django's settings -- which
|
|
719
|
+
# importing lex_config does. `lex reflex` has loaded it already; this is what
|
|
720
|
+
# lets a bare `reflex run` see the same environment.
|
|
721
|
+
prepare_environment()
|
|
722
|
+
|
|
723
|
+
from lex.lex_app.reflex.config import lex_config # noqa: E402
|
|
724
|
+
|
|
725
|
+
config = lex_config()
|
|
726
|
+
'''
|
|
727
|
+
|
|
728
|
+
#: Reflex subcommands that do not act on a project, and so need no rxconfig.py.
|
|
729
|
+
_REFLEX_PROJECTLESS_ARGS = frozenset({"login", "logout", "--help", "-h", "--version"})
|
|
730
|
+
|
|
731
|
+
# Defaults for the two Reflex ports. Reflex's own, 3000 and 8000, are where the
|
|
732
|
+
# React frontend and the Django server run in development; these sit beside
|
|
733
|
+
# Streamlit's 8501 instead. Fixed rather than auto-incremented, because Keycloak
|
|
734
|
+
# has to know the callback URL in advance: http://localhost:8502/callback.
|
|
735
|
+
_DEFAULT_REFLEX_FRONTEND_PORT = "8502"
|
|
736
|
+
_DEFAULT_REFLEX_BACKEND_PORT = "8503"
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
def _env_flag_set(name: str) -> bool:
|
|
740
|
+
return (os.getenv(name) or "").strip().lower() in ("1", "true", "yes", "y", "on")
|
|
741
|
+
|
|
742
|
+
|
|
743
|
+
def _resolve_reflex_port_flags(reflex_args, configured_frontend=None, configured_backend=None):
|
|
744
|
+
"""The port flags to append to a `lex reflex run`, honouring the caller.
|
|
745
|
+
|
|
746
|
+
A port the caller chose wins, wherever they chose it -- ``--frontend-port`` /
|
|
747
|
+
``--backend-port``, ``REFLEX_FRONTEND_PORT`` / ``REFLEX_BACKEND_PORT``, or
|
|
748
|
+
``rxconfig.py`` (``configured_*``) -- and only the missing ones are supplied,
|
|
749
|
+
the way `lex streamlit` resolves its ports.
|
|
750
|
+
|
|
751
|
+
Which ones a run may take depends on its mode, and Reflex refuses a run
|
|
752
|
+
handed one it cannot use: a frontend port with ``--backend-only``, a backend
|
|
753
|
+
port with ``--frontend-only``, and two different ports in ``--env prod`` or
|
|
754
|
+
``preview``, which serve the frontend and backend on one. So in those modes a
|
|
755
|
+
single port is supplied, and none at all once the caller has chosen one.
|
|
756
|
+
"""
|
|
757
|
+
if not reflex_args or reflex_args[0] != "run":
|
|
758
|
+
return []
|
|
759
|
+
args = reflex_args[1:]
|
|
760
|
+
|
|
761
|
+
env_mode = (_cli_option(args, "env") or "dev").strip().lower()
|
|
762
|
+
backend_only = "--backend-only" in args or _env_flag_set("REFLEX_BACKEND_ONLY")
|
|
763
|
+
frontend_only = "--frontend-only" in args or _env_flag_set("REFLEX_FRONTEND_ONLY")
|
|
764
|
+
given_frontend = (
|
|
765
|
+
_cli_option(args, "frontend-port") or os.getenv("REFLEX_FRONTEND_PORT") or configured_frontend
|
|
766
|
+
)
|
|
767
|
+
given_backend = (
|
|
768
|
+
_cli_option(args, "backend-port") or os.getenv("REFLEX_BACKEND_PORT") or configured_backend
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
if env_mode in ("prod", "preview"):
|
|
772
|
+
if given_frontend or given_backend:
|
|
773
|
+
return []
|
|
774
|
+
if backend_only:
|
|
775
|
+
return ["--backend-port", _DEFAULT_REFLEX_BACKEND_PORT]
|
|
776
|
+
return ["--frontend-port", _DEFAULT_REFLEX_FRONTEND_PORT]
|
|
777
|
+
|
|
778
|
+
flags = []
|
|
779
|
+
if not backend_only and not given_frontend:
|
|
780
|
+
flags += ["--frontend-port", _DEFAULT_REFLEX_FRONTEND_PORT]
|
|
781
|
+
if not frontend_only and not given_backend:
|
|
782
|
+
flags += ["--backend-port", _DEFAULT_REFLEX_BACKEND_PORT]
|
|
783
|
+
return flags
|
|
784
|
+
|
|
785
|
+
#: Top-level entries of a project that Reflex's hot reload must not watch: they
|
|
786
|
+
#: are generated, vendored, or change without the app changing.
|
|
787
|
+
_REFLEX_RELOAD_SKIP = frozenset({
|
|
788
|
+
"build", "dist", "env", "htmlcov", "media", "migrations", "node_modules",
|
|
789
|
+
"reflex.lock", "reports", "static", "uploaded_files", "venv",
|
|
790
|
+
})
|
|
791
|
+
|
|
792
|
+
|
|
793
|
+
def _ensure_reflex_config(project_root: Path) -> tuple[Path, bool]:
|
|
794
|
+
"""Return ``(path, created)`` for the project's ``rxconfig.py``, writing it if absent.
|
|
795
|
+
|
|
796
|
+
An existing file is never touched -- it is the project's to edit.
|
|
797
|
+
"""
|
|
798
|
+
path = project_root / "rxconfig.py"
|
|
799
|
+
if path.exists():
|
|
800
|
+
return path, False
|
|
801
|
+
path.write_text(REFLEX_CONFIG_TEMPLATE, encoding="utf-8")
|
|
802
|
+
return path, True
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
def _reflex_hot_reload_paths(project_root: Path) -> str:
|
|
806
|
+
"""``REFLEX_HOT_RELOAD_OVERRIDE_PATHS`` for the project: what to watch in dev.
|
|
807
|
+
|
|
808
|
+
Reflex watches the tree its *app module* sits in. The app module is
|
|
809
|
+
``lex.reflex_app``, inside the installed lex package, so left alone it would
|
|
810
|
+
watch site-packages -- tens of thousands of files -- and never the project's
|
|
811
|
+
own models and ``_reflex_structure.py``, which are what change.
|
|
812
|
+
|
|
813
|
+
Its top-level entries, then, minus hidden and generated ones: ``.web/`` is
|
|
814
|
+
rewritten by every compile, so watching it would reload the backend in a
|
|
815
|
+
loop. Names are relative, and resolve against the project root Reflex runs
|
|
816
|
+
in, because Reflex splits the variable on ``:`` -- which an absolute Windows
|
|
817
|
+
path contains.
|
|
818
|
+
"""
|
|
819
|
+
names = []
|
|
820
|
+
for entry in sorted(project_root.iterdir(), key=lambda item: item.name):
|
|
821
|
+
name = entry.name
|
|
822
|
+
if name.startswith((".", "__")) or name in _REFLEX_RELOAD_SKIP or ":" in name:
|
|
823
|
+
continue
|
|
824
|
+
if entry.is_dir() and (entry / "pyvenv.cfg").exists():
|
|
825
|
+
continue # a virtualenv under whatever name it was given
|
|
826
|
+
names.append(name)
|
|
827
|
+
return ":".join(names) or "rxconfig.py"
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
@lex.command(
|
|
831
|
+
name="reflex",
|
|
832
|
+
short_help="Run the project's Reflex dashboards.",
|
|
833
|
+
context_settings=dict(ignore_unknown_options=True, allow_extra_args=True),
|
|
834
|
+
add_help_option=False,
|
|
835
|
+
)
|
|
836
|
+
@click.pass_context
|
|
837
|
+
def reflex_cmd(ctx):
|
|
838
|
+
"""Run the project's Reflex dashboards (arguments go to the Reflex CLI).
|
|
839
|
+
|
|
840
|
+
\b
|
|
841
|
+
lex reflex # reflex run: dev server with hot reload
|
|
842
|
+
lex reflex run --env prod # production, as a deployment runs it
|
|
843
|
+
lex reflex login # sign in to Reflex, for reflex-enterprise
|
|
844
|
+
lex reflex --help # Reflex's own help
|
|
845
|
+
"""
|
|
846
|
+
# The Reflex counterpart of `lex streamlit`, with one difference that shapes
|
|
847
|
+
# the rest: Streamlit runs in THIS process, after Django is set up, so this
|
|
848
|
+
# command set Django up for it. Reflex compiles and serves the app from worker
|
|
849
|
+
# processes that never see this one's bootstrap, so the app module they import
|
|
850
|
+
# (`lex.reflex_app`) sets Django up itself -- and this command, which is in
|
|
851
|
+
# `_SKIP_BOOTSTRAP_COMMANDS`, does not do it a second time.
|
|
852
|
+
reflex_args = list(ctx.args) or ["run"]
|
|
853
|
+
|
|
854
|
+
if reflex_args[0] not in _REFLEX_PROJECTLESS_ARGS:
|
|
855
|
+
# Reflex reads rxconfig.py from, and writes .web/ into, the directory it
|
|
856
|
+
# runs in -- the project root, wherever `lex` was invoked from.
|
|
857
|
+
os.chdir(PROJECT_ROOT_DIR.as_posix())
|
|
858
|
+
config_path, created = _ensure_reflex_config(PROJECT_ROOT_DIR)
|
|
859
|
+
if created:
|
|
860
|
+
click.echo(f"rxconfig.py: {config_path} (created)")
|
|
861
|
+
os.environ.setdefault(
|
|
862
|
+
"REFLEX_HOT_RELOAD_OVERRIDE_PATHS", _reflex_hot_reload_paths(PROJECT_ROOT_DIR)
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
if reflex_args[0] == "run":
|
|
866
|
+
# Loaded here only to learn whether rxconfig.py chose the ports. It is
|
|
867
|
+
# the load Reflex would make next anyway, and Reflex reuses it.
|
|
868
|
+
from reflex.config import get_config
|
|
869
|
+
|
|
870
|
+
config = get_config()
|
|
871
|
+
reflex_args += _resolve_reflex_port_flags(
|
|
872
|
+
reflex_args, config.frontend_port, config.backend_port
|
|
873
|
+
)
|
|
874
|
+
|
|
875
|
+
from reflex.reflex import cli as reflex_cli
|
|
876
|
+
|
|
877
|
+
reflex_cli.main(args=reflex_args, prog_name="lex reflex")
|
|
878
|
+
|
|
879
|
+
|
|
709
880
|
@lex.command(name="pytest", context_settings=dict(ignore_unknown_options=True, allow_extra_args=True))
|
|
710
881
|
@click.pass_context
|
|
711
882
|
def pytest_cmd(ctx):
|
|
@@ -1500,8 +1671,13 @@ def _collect_setup_with_ai_credentials(
|
|
|
1500
1671
|
#: It is lex-app's own command and must stay skipped whatever happens to that
|
|
1501
1672
|
#: rule -- it is the recovery path when the installed lex-mcp-local is too old
|
|
1502
1673
|
#: for anything else here to work.
|
|
1674
|
+
#: reflex is here because its server processes are not this one: the app module
|
|
1675
|
+
#: Reflex imports sets Django up where the app actually runs.
|
|
1503
1676
|
_SKIP_BOOTSTRAP_COMMANDS = frozenset(
|
|
1504
|
-
{
|
|
1677
|
+
{
|
|
1678
|
+
"start", "celery", "celery-workers", "flower", "pytest", "pytest-groups",
|
|
1679
|
+
"setup", "setup-with-ai", "ai-update", "reflex",
|
|
1680
|
+
}
|
|
1505
1681
|
)
|
|
1506
1682
|
|
|
1507
1683
|
|
|
@@ -1253,6 +1253,33 @@ class LexModel(LifecycleModel):
|
|
|
1253
1253
|
"""
|
|
1254
1254
|
st.info("No class-level visualization available for this model.")
|
|
1255
1255
|
|
|
1256
|
+
@classmethod
|
|
1257
|
+
def reflex_main(cls):
|
|
1258
|
+
"""
|
|
1259
|
+
Instance-level Reflex dashboard -- the Reflex counterpart of ``streamlit_main``.
|
|
1260
|
+
Override in subclasses to return the component ``lex reflex`` shows for
|
|
1261
|
+
``?model=<name>&pk=<pk>``.
|
|
1262
|
+
|
|
1263
|
+
A classmethod, not an instance method: Reflex compiles the page once,
|
|
1264
|
+
ahead of any request, so there is no record to call it on. The
|
|
1265
|
+
component's own state reads the record in an event handler with
|
|
1266
|
+
``lex.lex_app.reflex.current_record``.
|
|
1267
|
+
"""
|
|
1268
|
+
import reflex as rx
|
|
1269
|
+
|
|
1270
|
+
return rx.callout("No instance-level visualization available for this model.", icon="info")
|
|
1271
|
+
|
|
1272
|
+
@classmethod
|
|
1273
|
+
def reflex_class_main(cls):
|
|
1274
|
+
"""
|
|
1275
|
+
Class-level Reflex dashboard -- the Reflex counterpart of ``streamlit_class_main``.
|
|
1276
|
+
Override in subclasses to return the component ``lex reflex`` shows for
|
|
1277
|
+
``?model=<name>``: aggregate visualizations, statistics, etc.
|
|
1278
|
+
"""
|
|
1279
|
+
import reflex as rx
|
|
1280
|
+
|
|
1281
|
+
return rx.callout("No class-level visualization available for this model.", icon="info")
|
|
1282
|
+
|
|
1256
1283
|
|
|
1257
1284
|
# -- Aware-datetime invariant ---------------------------------------------
|
|
1258
1285
|
# Under USE_TZ=True, Django only normalizes datetimes at the DB boundary:
|
|
@@ -95,6 +95,23 @@ def _create_audit_logger_for_task(audit_logging_enabled=None):
|
|
|
95
95
|
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
def _apply_nest_asyncio():
|
|
99
|
+
"""``nest_asyncio.apply()``, unless this process's event loop cannot be patched.
|
|
100
|
+
|
|
101
|
+
nest_asyncio patches asyncio's own pure-Python loop and refuses any other. A
|
|
102
|
+
server running on uvloop -- granian, which serves `lex reflex`, picks uvloop
|
|
103
|
+
whenever it is installed -- has already installed a uvloop policy when Django
|
|
104
|
+
is set up, so ``apply()`` raises ``ValueError`` inside ``ready()`` and takes
|
|
105
|
+
``django.setup()`` down with it. Such a process does not need the patch: lex's
|
|
106
|
+
synchronous code reaches the database from worker threads there, and a worker
|
|
107
|
+
thread has no running loop to nest into.
|
|
108
|
+
"""
|
|
109
|
+
try:
|
|
110
|
+
nest_asyncio.apply()
|
|
111
|
+
except ValueError as exc:
|
|
112
|
+
logger.info("nest_asyncio not applied (%s); this process's loop runs as it is.", exc)
|
|
113
|
+
|
|
114
|
+
|
|
98
115
|
def should_load_data(auth_settings):
|
|
99
116
|
"""
|
|
100
117
|
Check whether the initial data should be loaded.
|
|
@@ -116,7 +133,7 @@ class LexAppConfig(GenericAppConfig):
|
|
|
116
133
|
generic_app_models = {f"{model.__name__}": model for model in
|
|
117
134
|
set(list(apps.get_app_config(repo_name).models.values())
|
|
118
135
|
+ list(apps.get_app_config(repo_name).models.values())) if model.__name__.count("Historical") != 1}
|
|
119
|
-
|
|
136
|
+
_apply_nest_asyncio()
|
|
120
137
|
|
|
121
138
|
# Run the initial-data check (config load + are_all_models_empty()
|
|
122
139
|
# DB query) OFF the ready() critical path so django.setup() returns
|
|
@@ -143,6 +160,7 @@ class LexAppConfig(GenericAppConfig):
|
|
|
143
160
|
from django.contrib import admin
|
|
144
161
|
from django.contrib.auth import get_user_model
|
|
145
162
|
from lex.process_admin.utils.model_registration import ModelRegistration
|
|
163
|
+
from lex.lex_app.reflex.Reflex import Reflex, reflex_enabled
|
|
146
164
|
from lex.lex_app.streamlit.Streamlit import Streamlit
|
|
147
165
|
|
|
148
166
|
# Models to explicitly exclude (shouldn't show in frontend)
|
|
@@ -198,7 +216,7 @@ class LexAppConfig(GenericAppConfig):
|
|
|
198
216
|
if self.model_structure_builder.widget_structure:
|
|
199
217
|
ModelRegistration.register_widget_structure(self.model_structure_builder.widget_structure)
|
|
200
218
|
ModelRegistration.register_models(
|
|
201
|
-
[Streamlit],
|
|
219
|
+
[Streamlit, Reflex] if reflex_enabled() else [Streamlit],
|
|
202
220
|
self.untracked_models,
|
|
203
221
|
self.model_structure_builder.history_tracking_enabled,
|
|
204
222
|
)
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
from lex.core.models.HTMLReport import HTMLReport
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Reflex(HTMLReport):
|
|
7
|
+
"""The project's Reflex dashboards, as a page of the lex-app frontend.
|
|
8
|
+
|
|
9
|
+
Registered -- and placed in the sidebar -- only when ``IS_REFLEX_ENABLED``
|
|
10
|
+
is ``true``: a project that never runs ``lex reflex`` should not show an
|
|
11
|
+
entry that frames nothing.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
def get_html(self, user):
|
|
15
|
+
# 8502 is `lex reflex`'s default frontend port (lex/bin/lex.py). `lex_embed=1`
|
|
16
|
+
# is how lex-app says it is framing a dashboard in its own chrome: the page
|
|
17
|
+
# then leaves out the signed-in user and sign-out that chrome already shows.
|
|
18
|
+
base = os.getenv("REFLEX_URL", "http://localhost:8502").rstrip("/")
|
|
19
|
+
return f"""<iframe
|
|
20
|
+
src="{base}/?lex_embed=1"
|
|
21
|
+
style="width:100%;border:none;height:100%"
|
|
22
|
+
></iframe>"""
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def reflex_enabled() -> bool:
|
|
26
|
+
"""``IS_REFLEX_ENABLED``, read the way ``IS_STREAMLIT_ENABLED`` is."""
|
|
27
|
+
return os.getenv("IS_REFLEX_ENABLED") == "true"
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""The Reflex surface of lex-app.
|
|
2
|
+
|
|
3
|
+
Everything a dashboard author needs is importable from here::
|
|
4
|
+
|
|
5
|
+
from lex.lex_app.reflex import current_record, run_orm, has_permission
|
|
6
|
+
|
|
7
|
+
======================== ====================================================
|
|
8
|
+
``current_record`` the record ``?model=&pk=`` names, from any state
|
|
9
|
+
``run_orm`` / ``orm`` synchronous Django code, from an async event handler
|
|
10
|
+
``current_permissions`` the user's Keycloak UMA permissions
|
|
11
|
+
``has_permission`` an ``auth=`` check built from one of them
|
|
12
|
+
``current_access_token`` the user's Keycloak access token, for the lex-app API
|
|
13
|
+
``LexUser`` the signed-in user's names, as frontend vars
|
|
14
|
+
``lex_config`` the ``rxe.Config`` a project's ``rxconfig.py`` returns
|
|
15
|
+
======================== ====================================================
|
|
16
|
+
|
|
17
|
+
Nothing is imported until it is used. ``rxconfig.py`` imports
|
|
18
|
+
:mod:`lex.lex_app.reflex.config` through this package before Django or any
|
|
19
|
+
Reflex state exists, and an eager import here would create the states -- the
|
|
20
|
+
auth provider among them -- inside the config that configures them.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import importlib
|
|
26
|
+
from typing import TYPE_CHECKING, Any
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from lex.lex_app.reflex.auth import (
|
|
30
|
+
LexKeycloakAuthState,
|
|
31
|
+
LexUser,
|
|
32
|
+
current_access_token,
|
|
33
|
+
current_permissions,
|
|
34
|
+
has_permission,
|
|
35
|
+
)
|
|
36
|
+
from lex.lex_app.reflex.config import lex_auth_plugin, lex_config
|
|
37
|
+
from lex.lex_app.reflex.dashboards import LexDashboardState, current_record
|
|
38
|
+
from lex.lex_app.reflex.django_orm import orm, run_orm
|
|
39
|
+
|
|
40
|
+
_EXPORTS = {
|
|
41
|
+
"LexKeycloakAuthState": "lex.lex_app.reflex.auth",
|
|
42
|
+
"LexUser": "lex.lex_app.reflex.auth",
|
|
43
|
+
"current_access_token": "lex.lex_app.reflex.auth",
|
|
44
|
+
"current_permissions": "lex.lex_app.reflex.auth",
|
|
45
|
+
"has_permission": "lex.lex_app.reflex.auth",
|
|
46
|
+
"lex_auth_plugin": "lex.lex_app.reflex.config",
|
|
47
|
+
"lex_config": "lex.lex_app.reflex.config",
|
|
48
|
+
"LexDashboardState": "lex.lex_app.reflex.dashboards",
|
|
49
|
+
"current_record": "lex.lex_app.reflex.dashboards",
|
|
50
|
+
"orm": "lex.lex_app.reflex.django_orm",
|
|
51
|
+
"run_orm": "lex.lex_app.reflex.django_orm",
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
#: The same names, spelled out: tools that read the package without importing it
|
|
55
|
+
#: -- the docs gate among them -- see a module ``__getattr__`` plus ``__all__`` as
|
|
56
|
+
#: its exports (PEP 562). 1.357c keeps the two lists equal.
|
|
57
|
+
__all__ = [
|
|
58
|
+
"LexDashboardState",
|
|
59
|
+
"LexKeycloakAuthState",
|
|
60
|
+
"LexUser",
|
|
61
|
+
"current_access_token",
|
|
62
|
+
"current_permissions",
|
|
63
|
+
"current_record",
|
|
64
|
+
"has_permission",
|
|
65
|
+
"lex_auth_plugin",
|
|
66
|
+
"lex_config",
|
|
67
|
+
"orm",
|
|
68
|
+
"run_orm",
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def __getattr__(name: str) -> Any:
|
|
73
|
+
module = _EXPORTS.get(name)
|
|
74
|
+
if module is None:
|
|
75
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
76
|
+
value = getattr(importlib.import_module(module), name)
|
|
77
|
+
globals()[name] = value
|
|
78
|
+
return value
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def __dir__() -> list[str]:
|
|
82
|
+
return sorted({*globals(), *_EXPORTS})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""The Reflex app ``lex reflex`` serves.
|
|
2
|
+
|
|
3
|
+
Built in one place so that the entry module Reflex imports
|
|
4
|
+
(``lex/reflex_app.py``) is nothing but the order things must happen in: Django
|
|
5
|
+
first, then this.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def create_app():
|
|
12
|
+
"""The project's Reflex app: sign-in, Django connections, and its dashboards.
|
|
13
|
+
|
|
14
|
+
* ``rxe.App`` rather than ``rx.App`` -- the auth plugin refuses anything else,
|
|
15
|
+
and it is what puts every page, handler and var behind sign-in.
|
|
16
|
+
* :class:`DjangoConnectionMiddleware`, so each event gets the connection
|
|
17
|
+
handling a Django request gets.
|
|
18
|
+
* ``/``, which shows whichever dashboard the query string asks for.
|
|
19
|
+
|
|
20
|
+
Further pages come from the project itself: any ``@rxe.page`` in
|
|
21
|
+
``_reflex_structure.py``, or in a module it imports, is added when the app
|
|
22
|
+
compiles.
|
|
23
|
+
"""
|
|
24
|
+
import reflex_enterprise as rxe
|
|
25
|
+
|
|
26
|
+
from lex.lex_app.reflex.dashboards import (
|
|
27
|
+
LexDashboardState,
|
|
28
|
+
dashboard_page,
|
|
29
|
+
load_structure,
|
|
30
|
+
)
|
|
31
|
+
from lex.lex_app.reflex.django_orm import DjangoConnectionMiddleware
|
|
32
|
+
|
|
33
|
+
app = rxe.App()
|
|
34
|
+
app.add_middleware(DjangoConnectionMiddleware())
|
|
35
|
+
app.add_page(
|
|
36
|
+
dashboard_page(load_structure()),
|
|
37
|
+
route="/",
|
|
38
|
+
on_load=LexDashboardState.resolve,
|
|
39
|
+
)
|
|
40
|
+
return app
|