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.
Files changed (682) hide show
  1. {lex_app-2.2.2/lex_app.egg-info → lex_app-2.3.0}/PKG-INFO +3 -1
  2. {lex_app-2.2.2 → lex_app-2.3.0}/generate_pycharm_configs.py +5 -0
  3. lex_app-2.3.0/lex/_version.py +1 -0
  4. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/global_search_for_models/Search.py +1 -1
  5. {lex_app-2.2.2 → lex_app-2.3.0}/lex/bin/lex.py +195 -19
  6. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/LexModel.py +27 -0
  7. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/apps.py +20 -2
  8. lex_app-2.3.0/lex/lex_app/reflex/Reflex.py +27 -0
  9. lex_app-2.3.0/lex/lex_app/reflex/__init__.py +82 -0
  10. lex_app-2.3.0/lex/lex_app/reflex/app.py +40 -0
  11. lex_app-2.3.0/lex/lex_app/reflex/auth.py +691 -0
  12. lex_app-2.3.0/lex/lex_app/reflex/config.py +122 -0
  13. lex_app-2.3.0/lex/lex_app/reflex/dashboards.py +383 -0
  14. lex_app-2.3.0/lex/lex_app/reflex/django_orm.py +164 -0
  15. lex_app-2.3.0/lex/lex_app/reflex/examples/__init__.py +6 -0
  16. lex_app-2.3.0/lex/lex_app/reflex/examples/_reflex_structure.py +125 -0
  17. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_structure_builder.py +5 -0
  18. lex_app-2.3.0/lex/reflex_app.py +17 -0
  19. lex_app-2.3.0/lex/test_project/tests/api_layer/test_10d_reflex_search_exclusion.py +77 -0
  20. lex_app-2.3.0/lex/test_project/tests/init/test_1ap_reflex_cli.py +476 -0
  21. lex_app-2.3.0/lex/test_project/tests/init/test_1aq_reflex_dashboards.py +827 -0
  22. lex_app-2.3.0/lex/test_project/tests/init/test_1ar_reflex_automatic_sign_in.py +411 -0
  23. lex_app-2.3.0/lex/test_project/tests/init/test_1as_reflex_token_cookie_compression.py +325 -0
  24. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1m_cli_commands.py +2 -0
  25. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1y_ide_run_configs.py +1 -0
  26. lex_app-2.3.0/lex/test_project/tests/permissions/test_4n_reflex_permissions.py +316 -0
  27. lex_app-2.3.0/lex/tools/django_bootstrap.py +80 -0
  28. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/project_root.py +29 -0
  29. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/config/generic_app_config.py +29 -4
  30. {lex_app-2.2.2 → lex_app-2.3.0/lex_app.egg-info}/PKG-INFO +3 -1
  31. {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/SOURCES.txt +17 -0
  32. {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/requires.txt +2 -0
  33. {lex_app-2.2.2 → lex_app-2.3.0}/requirements.txt +4 -0
  34. lex_app-2.2.2/lex/_version.py +0 -1
  35. {lex_app-2.2.2 → lex_app-2.3.0}/LICENSE.txt +0 -0
  36. {lex_app-2.2.2 → lex_app-2.3.0}/MANIFEST.in +0 -0
  37. {lex_app-2.2.2 → lex_app-2.3.0}/README.md +0 -0
  38. {lex_app-2.2.2 → lex_app-2.3.0}/lex/__init__.py +0 -0
  39. {lex_app-2.2.2 → lex_app-2.3.0}/lex/__main__.py +0 -0
  40. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/__init__.py +0 -0
  41. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/admin.py +0 -0
  42. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/apps.py +0 -0
  43. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/BackendHealthConsumer.py +0 -0
  44. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/CalculationLogConsumer.py +0 -0
  45. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/CalculationsConsumer.py +0 -0
  46. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/LogConsumer.py +0 -0
  47. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/ModelDataUpdateConsumer.py +0 -0
  48. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/UpdateCalculationStatusConsumer.py +0 -0
  49. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/consumers/__init__.py +0 -0
  50. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/FilterTreeNode.py +0 -0
  51. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/GenericFilters.py +0 -0
  52. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/filters/__init__.py +0 -0
  53. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/middleware/__init__.py +0 -0
  54. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/middleware/keycloak_permissions.py +0 -0
  55. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/migrations/__init__.py +0 -0
  56. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/models.py +0 -0
  57. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/__init__.py +0 -0
  58. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/base_serializers.py +0 -0
  59. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/serializers/sensitive_fields.py +0 -0
  60. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/Context.py +0 -0
  61. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/__init__.py +0 -0
  62. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/api_key_requests.py +0 -0
  63. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/collection_utils.py +0 -0
  64. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/converters.py +0 -0
  65. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/helpers.py +0 -0
  66. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/utils/temporal.py +0 -0
  67. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/LexLoggerView/LexLoggerView.py +0 -0
  68. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/LexLoggerView/__init__.py +0 -0
  69. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/ModelStructureObtainView.py +0 -0
  70. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/__init__.py +0 -0
  71. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/KeycloakManager.py +0 -0
  72. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/UserAPIView.py +0 -0
  73. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/authentication/__init__.py +0 -0
  74. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/ActiveCalculations.py +0 -0
  75. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/CleanCalculations.py +0 -0
  76. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/DownloadMarkdownPdf.py +0 -0
  77. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/InitCalculationLogs.py +0 -0
  78. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/calculations/__init__.py +0 -0
  79. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/FileDownload.py +0 -0
  80. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/ModelExport.py +0 -0
  81. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/file_operations/__init__.py +0 -0
  82. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/global_search_for_models/__init__.py +0 -0
  83. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/lex_api/LexAPI.py +0 -0
  84. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/lex_api/__init__.py +0 -0
  85. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/CalculationLogTreeView.py +0 -0
  86. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/History.py +0 -0
  87. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/List.py +0 -0
  88. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/Many.py +0 -0
  89. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/One.py +0 -0
  90. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/__init__.py +0 -0
  91. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/filter_backends.py +0 -0
  92. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/DestroyOneWithPayloadMixin.py +0 -0
  93. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/ModelEntryProviderMixin.py +0 -0
  94. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/PermissionAwareSerializerMixin.py +0 -0
  95. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/mixins/__init__.py +0 -0
  96. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/serializers/CalculationLogTreeSerializer.py +0 -0
  97. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_entries/serializers/__init__.py +0 -0
  98. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/Fields.py +0 -0
  99. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/Widgets.py +0 -0
  100. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/model_info/__init__.py +0 -0
  101. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/pagination.py +0 -0
  102. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/ModelPermissions.py +0 -0
  103. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/UserPermission.py +0 -0
  104. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/permissions/__init__.py +0 -0
  105. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/process_flow/CreateOrUpdate.py +0 -0
  106. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/process_flow/__init__.py +0 -0
  107. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/project_info/ProjectInfo.py +0 -0
  108. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/project_info/__init__.py +0 -0
  109. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/rbac/RBACInfo.py +0 -0
  110. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/rbac/__init__.py +0 -0
  111. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/DeleteUnusedFiles.py +0 -0
  112. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointFileDownload.py +0 -0
  113. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointPreview.py +0 -0
  114. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/SharePointShareLink.py +0 -0
  115. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/sharepoint/__init__.py +0 -0
  116. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views/streamlit/__init__.py +0 -0
  117. {lex_app-2.2.2 → lex_app-2.3.0}/lex/api/views.py +0 -0
  118. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/dark-lex-logo.svg +0 -0
  119. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-bg.jpg +0 -0
  120. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-logo.png +0 -0
  121. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-logo.svg +0 -0
  122. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/email.html +0 -0
  123. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/lex-icon.png +0 -0
  124. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/lex-logo.png +0 -0
  125. {lex_app-2.2.2 → lex_app-2.3.0}/lex/assets/lex-test-report/pdf.html +0 -0
  126. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/__init__.py +0 -0
  127. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/admin.py +0 -0
  128. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/apps.py +0 -0
  129. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/ConsoleHandler.py +0 -0
  130. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/LexLogger.py +0 -0
  131. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/WebSocketHandler.py +0 -0
  132. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/handlers/__init__.py +0 -0
  133. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0001_initial.py +0 -0
  134. {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
  135. {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
  136. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0004_remove_auditlog_audit_fields.py +0 -0
  137. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0005_calculationlog_calculationid_index.py +0 -0
  138. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0006_alter_auditlog_calculation_id.py +0 -0
  139. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/0007_calculationlog_heading.py +0 -0
  140. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/migrations/__init__.py +0 -0
  141. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/AuditLogMixin.py +0 -0
  142. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/BulkAuditLogMixin.py +0 -0
  143. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/mixins/__init__.py +0 -0
  144. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/AuditLog.py +0 -0
  145. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/AuditLogStatus.py +0 -0
  146. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/CalculationLog.py +0 -0
  147. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models/__init__.py +0 -0
  148. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/models.py +0 -0
  149. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/AuditLogMixinSerializer.py +0 -0
  150. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/AuditLogSerializer.py +0 -0
  151. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/CalculationLogSerializer.py +0 -0
  152. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/serializers/__init__.py +0 -0
  153. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/tests/__init__.py +0 -0
  154. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/CacheManager.py +0 -0
  155. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/ContextResolver.py +0 -0
  156. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/DataModels.py +0 -0
  157. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/InitialDataAuditLogger.py +0 -0
  158. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/ModelContext.py +0 -0
  159. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/WebSocketNotifier.py +0 -0
  160. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/__init__.py +0 -0
  161. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/calculation_audit.py +0 -0
  162. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/config.py +0 -0
  163. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/content_types.py +0 -0
  164. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/latest_calculation.py +0 -0
  165. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/utils/legacy_audit_payload.py +0 -0
  166. {lex_app-2.2.2 → lex_app-2.3.0}/lex/audit_logging/views.py +0 -0
  167. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/__init__.py +0 -0
  168. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/admin.py +0 -0
  169. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/apps.py +0 -0
  170. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/authentication_backends/BearerMiddlewareAuthentication.py +0 -0
  171. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/authentication_backends/__init__.py +0 -0
  172. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/__init__.py +0 -0
  173. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/__init__.py +0 -0
  174. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/createprofiles.py +0 -0
  175. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/delete_keycloak_resources.py +0 -0
  176. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_backup.py +0 -0
  177. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_init_bak.py +0 -0
  178. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/keycloak_rollback_bak.py +0 -0
  179. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/management/commands/register_keycloak_resources.py +0 -0
  180. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/middleware.py +0 -0
  181. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/migrations/0001_initial.py +0 -0
  182. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/migrations/__init__.py +0 -0
  183. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models/Profile.py +0 -0
  184. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models/__init__.py +0 -0
  185. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/models.py +0 -0
  186. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/utils/__init__.py +0 -0
  187. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/utils/lex_authentication.py +0 -0
  188. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/__init__.py +0 -0
  189. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/permissions.py +0 -0
  190. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/token_views.py +0 -0
  191. {lex_app-2.2.2 → lex_app-2.3.0}/lex/authentication/views/user_api.py +0 -0
  192. {lex_app-2.2.2 → lex_app-2.3.0}/lex/backfill_history_sql.py +0 -0
  193. {lex_app-2.2.2 → lex_app-2.3.0}/lex/bin/__init__.py +0 -0
  194. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/__init__.py +0 -0
  195. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/admin.py +0 -0
  196. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/apps.py +0 -0
  197. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/ObjectsToRecalculateStore.py +0 -0
  198. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/__init__.py +0 -0
  199. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/calculated_updates/update_handler.py +0 -0
  200. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/cancellation/__init__.py +0 -0
  201. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/cancellation/cluster_cancel_index.py +0 -0
  202. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/config.py +0 -0
  203. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/exceptions.py +0 -0
  204. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/PDF_field.py +0 -0
  205. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/XLSX_field.py +0 -0
  206. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/fields/__init__.py +0 -0
  207. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/__init__.py +0 -0
  208. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/commands/__init__.py +0 -0
  209. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/management/commands/bootstrap_callback_server.py +0 -0
  210. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/__init__.py +0 -0
  211. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/embed_token_auth.py +0 -0
  212. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/middleware/embed_xframe.py +0 -0
  213. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/migrations/0001_bitemporal_activation.py +0 -0
  214. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/migrations/__init__.py +0 -0
  215. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/CalculatedModelMixin.py +0 -0
  216. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/ModelModificationRestriction.py +0 -0
  217. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/mixins/__init__.py +0 -0
  218. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/CalculationModel.py +0 -0
  219. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/HTMLReport.py +0 -0
  220. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/Process.py +0 -0
  221. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models/__init__.py +0 -0
  222. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/models.py +0 -0
  223. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/Bitemporal.py +0 -0
  224. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/MetaHistory.py +0 -0
  225. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/StandardHistory.py +0 -0
  226. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/__init__.py +0 -0
  227. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/activation_applier.py +0 -0
  228. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/bitemporal_signals.py +0 -0
  229. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/services/signal_registry.py +0 -0
  230. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/ActiveCalculationStateStore.py +0 -0
  231. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/CalculationSignals.py +0 -0
  232. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/ModelMutationSignal.py +0 -0
  233. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/signals/__init__.py +0 -0
  234. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tasks/CeleryTaskDispatcher.py +0 -0
  235. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tasks/__init__.py +0 -0
  236. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/__init__.py +0 -0
  237. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/_bitemporal_test_case.py +0 -0
  238. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/bitemporal_test_settings.py +0 -0
  239. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/check_schema.py +0 -0
  240. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/tests/test_calculation_history_transitions.py +0 -0
  241. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/transactions/__init__.py +0 -0
  242. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/transactions/transactions.py +0 -0
  243. {lex_app-2.2.2 → lex_app-2.3.0}/lex/core/views.py +0 -0
  244. {lex_app-2.2.2 → lex_app-2.3.0}/lex/extract_legacy_logs.py +0 -0
  245. {lex_app-2.2.2 → lex_app-2.3.0}/lex/fix_v1_migration.py +0 -0
  246. {lex_app-2.2.2 → lex_app-2.3.0}/lex/full_migration_workflow.py +0 -0
  247. {lex_app-2.2.2 → lex_app-2.3.0}/lex/helpers/__init__.py +0 -0
  248. {lex_app-2.2.2 → lex_app-2.3.0}/lex/helpers/cache_tables.py +0 -0
  249. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/__init__.py +0 -0
  250. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/__init__.py +0 -0
  251. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_calculation_id_admin.py +0 -0
  252. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_calculation_log_admin.py +0 -0
  253. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_log_admin.py +0 -0
  254. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/legacy_user_change_log_admin.py +0 -0
  255. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/admin/read_only_admin.py +0 -0
  256. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/apps.py +0 -0
  257. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0001_initial.py +0 -0
  258. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0002_alter_legacycalculationid_options_and_more.py +0 -0
  259. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/0003_legacylog.py +0 -0
  260. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/migrations/__init__.py +0 -0
  261. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/__init__.py +0 -0
  262. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_calculation_id.py +0 -0
  263. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_calculation_log.py +0 -0
  264. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_log.py +0 -0
  265. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/models/legacy_user_change_log.py +0 -0
  266. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/serializers/__init__.py +0 -0
  267. {lex_app-2.2.2 → lex_app-2.3.0}/lex/legacy_data/serializers/legacy_data_serializers.py +0 -0
  268. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/__init__.py +0 -0
  269. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/admin.py +0 -0
  270. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/asgi.py +0 -0
  271. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery.py +0 -0
  272. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/__init__.py +0 -0
  273. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/entrypoint.py +0 -0
  274. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/exceptions.py +0 -0
  275. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/heartbeat.py +0 -0
  276. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/redis_keys.py +0 -0
  277. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/registry.py +0 -0
  278. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_recovery/supervisor.py +0 -0
  279. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/celery_tasks.py +0 -0
  280. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/design_system/__init__.py +0 -0
  281. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/design_system/lex_tokens.py +0 -0
  282. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/fast_health.py +0 -0
  283. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/keycloak_exclusions.py +0 -0
  284. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/__init__.py +0 -0
  285. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/Init2.py +0 -0
  286. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/__init__.py +0 -0
  287. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/backfill_audit_logging.py +0 -0
  288. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/backfill_bitemporal_history.py +0 -0
  289. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/bootstrap_keycloak.py +0 -0
  290. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/capture_db_tables.py +0 -0
  291. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/capture_migration_state.py +0 -0
  292. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/create_db.py +0 -0
  293. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/detect_model_changes.py +0 -0
  294. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/full_migration_workflow.py +0 -0
  295. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/generate_legacy_freeze_manifest.py +0 -0
  296. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/init.py +0 -0
  297. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/lex_migrate.py +0 -0
  298. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/normalize_is_calculated.py +0 -0
  299. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/rebase_incident_datetimes.py +0 -0
  300. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/rollback_migration_state.py +0 -0
  301. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/run_recovery_supervisor.py +0 -0
  302. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/sync_keycloak.py +0 -0
  303. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/__init__.py +0 -0
  304. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_command.py +0 -0
  305. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_backfill_audit_logging_payload.py +0 -0
  306. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_bootstrap_callback_server.py +0 -0
  307. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_init_command.py +0 -0
  308. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_lex_pytest_report_flags.py +0 -0
  309. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/management/commands/tests/test_migration_workflow_commands.py +0 -0
  310. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/0001_initial.py +0 -0
  311. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/0002_delete_asoftestmodel_and_more.py +0 -0
  312. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/migrations/__init__.py +0 -0
  313. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/models.py +0 -0
  314. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/routing.py +0 -0
  315. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/runtime_health.py +0 -0
  316. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/settings.py +0 -0
  317. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/simple_history_config.py +0 -0
  318. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/Streamlit.py +0 -0
  319. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/__init__.py +0 -0
  320. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_lex_view_component/__init__.py +0 -0
  321. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_lex_view_component/frontend/index.html +0 -0
  322. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_widget_host_component/__init__.py +0 -0
  323. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/_widget_host_component/frontend/index.html +0 -0
  324. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/eager_frames.py +0 -0
  325. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/embed.py +0 -0
  326. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/examples/__init__.py +0 -0
  327. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/examples/_streamlit_structure.py +0 -0
  328. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/quackback.py +0 -0
  329. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/sidebar.py +0 -0
  330. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/__init__.py +0 -0
  331. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/config_writer.py +0 -0
  332. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/mapping.py +0 -0
  333. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/theme/tokens.py +0 -0
  334. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/__init__.py +0 -0
  335. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/host.py +0 -0
  336. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/keys.py +0 -0
  337. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/streamlit/widgets/spec.py +0 -0
  338. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/ProcessAdminTestCase.py +0 -0
  339. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/__init__.py +0 -0
  340. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/tests/create_db.py +0 -0
  341. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/urls.py +0 -0
  342. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/utils.py +0 -0
  343. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/views.py +0 -0
  344. {lex_app-2.2.2 → lex_app-2.3.0}/lex/lex_app/wsgi.py +0 -0
  345. {lex_app-2.2.2 → lex_app-2.3.0}/lex/manage.py +0 -0
  346. {lex_app-2.2.2 → lex_app-2.3.0}/lex/mcp_server/tools/embed.py +0 -0
  347. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/__init__.py +0 -0
  348. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/admin.py +0 -0
  349. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/apps.py +0 -0
  350. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/migrations/__init__.py +0 -0
  351. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelCollection.py +0 -0
  352. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelContainer.py +0 -0
  353. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/ModelProcessAdmin.py +0 -0
  354. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/__init__.py +0 -0
  355. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/constants.py +0 -0
  356. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models/utils.py +0 -0
  357. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/models.py +0 -0
  358. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/settings/__init__.py +0 -0
  359. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/settings/process_admin_settings.py +0 -0
  360. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/sites/__init__.py +0 -0
  361. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/sites/process_admin_site.py +0 -0
  362. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/__init__.py +0 -0
  363. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/django_test_settings.py +0 -0
  364. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/tests/urls.py +0 -0
  365. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/__init__.py +0 -0
  366. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/bitemporal_sync.py +0 -0
  367. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/local_scheduler.py +0 -0
  368. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_registration.py +0 -0
  369. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/utils/model_structure.py +0 -0
  370. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views/__init__.py +0 -0
  371. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views/model_relation_views.py +0 -0
  372. {lex_app-2.2.2 → lex_app-2.3.0}/lex/process_admin/views.py +0 -0
  373. {lex_app-2.2.2 → lex_app-2.3.0}/lex/proxy.py +0 -0
  374. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/admin.py +0 -0
  375. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/apps.py +0 -0
  376. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/migrations/__init__.py +0 -0
  377. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/models.py +0 -0
  378. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/tests.py +0 -0
  379. {lex_app-2.2.2 → lex_app-2.3.0}/lex/react/views.py +0 -0
  380. {lex_app-2.2.2 → lex_app-2.3.0}/lex/restore_legacy_logs.py +0 -0
  381. {lex_app-2.2.2 → lex_app-2.3.0}/lex/runtime_config.py +0 -0
  382. {lex_app-2.2.2 → lex_app-2.3.0}/lex/sanitize_v2_migrations.py +0 -0
  383. {lex_app-2.2.2 → lex_app-2.3.0}/lex/streamlit_app.py +0 -0
  384. {lex_app-2.2.2 → lex_app-2.3.0}/lex/streamlit_theme.py +0 -0
  385. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/__init__.py +0 -0
  386. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/apps.py +0 -0
  387. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/lex_config.py +0 -0
  388. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/__init__.py +0 -0
  389. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/_authenticated_e2e_test_case.py +0 -0
  390. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/_e2e_test_case.py +0 -0
  391. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/__init__.py +0 -0
  392. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/models.py +0 -0
  393. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10a_crud_endpoints.py +0 -0
  394. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10b_history_endpoint.py +0 -0
  395. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10c_many_endpoint.py +0 -0
  396. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10e_schema_introspection.py +0 -0
  397. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10f_global_search.py +0 -0
  398. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10g_one_endpoint_lifecycle.py +0 -0
  399. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10h_lex_api_sdk.py +0 -0
  400. {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
  401. {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
  402. {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
  403. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10l_file_download_view.py +0 -0
  404. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10m_calculation_log_tree.py +0 -0
  405. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/api_layer/test_10n_active_calculations_endpoint.py +0 -0
  406. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/__init__.py +0 -0
  407. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/extra_models.py +0 -0
  408. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/models.py +0 -0
  409. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6a_api_audit.py +0 -0
  410. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6b_calculation_audit.py +0 -0
  411. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6c_actor_resolution.py +0 -0
  412. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6d_payload_and_gfk.py +0 -0
  413. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6e_bulk_audit.py +0 -0
  414. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6f_resilience.py +0 -0
  415. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6g_immutability.py +0 -0
  416. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6h_cache_manager.py +0 -0
  417. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6i_calculation_via_api.py +0 -0
  418. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6j_audit_utils.py +0 -0
  419. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6k_model_contracts.py +0 -0
  420. {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
  421. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6m_lexlogger_and_websocket.py +0 -0
  422. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6n_audit_log_serializers.py +0 -0
  423. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/audit_logging/test_6o_bulk_audit_normalize.py +0 -0
  424. {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
  425. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/__init__.py +0 -0
  426. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/models.py +0 -0
  427. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15a_builder_api.py +0 -0
  428. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15b_child_node_creation.py +0 -0
  429. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15c_silent_and_mixed.py +0 -0
  430. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15d_three_level_chain.py +0 -0
  431. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15e_combinatorial_pipeline.py +0 -0
  432. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15f_save_boundary.py +0 -0
  433. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15g_heading_context.py +0 -0
  434. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculation_logging/test_15h_pdf_export.py +0 -0
  435. {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
  436. {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
  437. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/__init__.py +0 -0
  438. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/models.py +0 -0
  439. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7a_atomic.py +0 -0
  440. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7b_non_atomic.py +0 -0
  441. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7c_hierarchy.py +0 -0
  442. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7d_state_guards.py +0 -0
  443. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7e_persistence_internals.py +0 -0
  444. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7f_combination_engine.py +0 -0
  445. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7g_create_pipeline.py +0 -0
  446. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7h_celery_dispatch.py +0 -0
  447. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7i_atomicity_matrix.py +0 -0
  448. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7j_three_level_matrix.py +0 -0
  449. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7k_exceptions_restrictions_xlsx.py +0 -0
  450. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7l_recalc_queue.py +0 -0
  451. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7m_calc_signals.py +0 -0
  452. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7n_cancellation.py +0 -0
  453. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7o_fk_violation_abort.py +0 -0
  454. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7p_streaming_expansion.py +0 -0
  455. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7q_worker_default_dispatch.py +0 -0
  456. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/calculations/test_7s_calculation_audit_columns.py +0 -0
  457. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/__init__.py +0 -0
  458. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/models.py +0 -0
  459. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8a_sync_fallback.py +0 -0
  460. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8aa_postrun_shutdown_guard.py +0 -0
  461. {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
  462. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8ac_sync_fallback_idempotent.py +0 -0
  463. {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
  464. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8b_dispatch_context.py +0 -0
  465. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8c_calculation_audit_columns.py +0 -0
  466. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8g_task_infrastructure.py +0 -0
  467. {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
  468. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8i_scope_contracts.py +0 -0
  469. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8j_task_bodies.py +0 -0
  470. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8k_redis_broker_integration.py +0 -0
  471. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8l_celery_dispatcher.py +0 -0
  472. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8m_undecorated_dispatch.py +0 -0
  473. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8u_cancel_revoke.py +0 -0
  474. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8v_cluster_cascade_cancel.py +0 -0
  475. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8w_recovery_terminal_guard.py +0 -0
  476. {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
  477. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/celery_async/test_8y_beat_recovery_driver.py +0 -0
  478. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/__init__.py +0 -0
  479. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/models.py +0 -0
  480. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2a_create.py +0 -0
  481. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2b_read.py +0 -0
  482. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2c_update.py +0 -0
  483. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2d_delete.py +0 -0
  484. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2e_bulk.py +0 -0
  485. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2f_missing_scenarios.py +0 -0
  486. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2f_ordering.py +0 -0
  487. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2g_filtering.py +0 -0
  488. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2i_cancel_endpoint.py +0 -0
  489. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/crud_api/test_2j_instance_api_key.py +0 -0
  490. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/design_system/__init__.py +0 -0
  491. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/design_system/test_lex_tokens.py +0 -0
  492. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/__init__.py +0 -0
  493. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/models.py +0 -0
  494. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13a_legacy_export.py +0 -0
  495. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13b_ag_grid_export.py +0 -0
  496. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13c_grouped_selected.py +0 -0
  497. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13d_auth_edge.py +0 -0
  498. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13e_streaming_fast_export.py +0 -0
  499. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13f_export_timezone.py +0 -0
  500. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13g_xlsx_field_timezone.py +0 -0
  501. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/exports/test_13h_xlsx_field_binding.py +0 -0
  502. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/fixtures/__init__.py +0 -0
  503. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/gate_selftest/__init__.py +0 -0
  504. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/gate_selftest/test_gate_selftest.py +0 -0
  505. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/__init__.py +0 -0
  506. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/models.py +0 -0
  507. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5_11_fallback_snapshot.py +0 -0
  508. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5a_basic_history.py +0 -0
  509. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5b_calculation_history.py +0 -0
  510. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5c_history_api.py +0 -0
  511. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5g_valid_to_chaining.py +0 -0
  512. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5h_suppression_toolkit.py +0 -0
  513. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5i_api_contract.py +0 -0
  514. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5j_snapshot_actor.py +0 -0
  515. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5k_metahistory.py +0 -0
  516. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5l_future_valid_from.py +0 -0
  517. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5m_asof_edit_time.py +0 -0
  518. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/history/test_5o_activation_applier.py +0 -0
  519. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/__init__.py +0 -0
  520. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/__init__.py +0 -0
  521. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/test_1c_initial_data.py +0 -0
  522. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/initial_data/test_1f_seed_idempotency.py +0 -0
  523. {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
  524. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/models.py +0 -0
  525. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1a_lex_setup.py +0 -0
  526. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1aa_embedded_token_renewal.py +0 -0
  527. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ab_ignored_role_policy_cleanup.py +0 -0
  528. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ac_streamlit_session_survival.py +0 -0
  529. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ac_widget_host_manifest.py +0 -0
  530. {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
  531. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ad_streamlit_theme_follower.py +0 -0
  532. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ae_streamlit_theme.py +0 -0
  533. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1af_theme_switch_preserves_brand.py +0 -0
  534. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ag_spa_asset_caching.py +0 -0
  535. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ah_metadata_cache_headers.py +0 -0
  536. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ai_eager_component_frames.py +0 -0
  537. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1aj_streamlit_sidebar_chrome.py +0 -0
  538. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ak_widget_keys_and_flow.py +0 -0
  539. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1al_example_dashboard.py +0 -0
  540. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1am_quackback_launcher.py +0 -0
  541. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1an_proxy_http2_safe_headers.py +0 -0
  542. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ao_flow_composable_steps.py +0 -0
  543. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1ao_frontend_resolution.py +0 -0
  544. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1b_default_authz.py +0 -0
  545. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1b_lex_init.py +0 -0
  546. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1d_init_helpers.py +0 -0
  547. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1e_keycloak_sync_manager.py +0 -0
  548. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1f_keycloak_drift.py +0 -0
  549. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1g_sync_manager_admin.py +0 -0
  550. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1h_bootstrap_flow.py +0 -0
  551. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1i_rebase_incident_datetimes.py +0 -0
  552. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1j_client_preflight.py +0 -0
  553. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1k_client_preflight_integration.py +0 -0
  554. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1l_full_pipeline_integration.py +0 -0
  555. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1n_init_helper_paths.py +0 -0
  556. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1o_lazy_imports_and_helpers.py +0 -0
  557. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1p_settings_urls_views.py +0 -0
  558. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1q_migration_files_complete.py +0 -0
  559. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1r_fetched_datetime_zone.py +0 -0
  560. {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
  561. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1t_disable_server_side_cursors.py +0 -0
  562. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1u_fast_health_asgi.py +0 -0
  563. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1v_scheduler_tz_invariant.py +0 -0
  564. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1w_recovery_default_deployment_target.py +0 -0
  565. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1x_runtime_health_metadata.py +0 -0
  566. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/init/test_1z_proxy_iframe_breakout.py +0 -0
  567. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/__init__.py +0 -0
  568. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/models.py +0 -0
  569. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_a_invoice_lifecycle.py +0 -0
  570. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_b_portfolio_calculation.py +0 -0
  571. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_c_role_aware_visibility.py +0 -0
  572. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_d_audit_trail.py +0 -0
  573. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/journeys/test_journey_e_validation_gate.py +0 -0
  574. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/__init__.py +0 -0
  575. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/models.py +0 -0
  576. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4a_field_level.py +0 -0
  577. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4b_action_level.py +0 -0
  578. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4c_keycloak_fallback.py +0 -0
  579. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4d_user_context.py +0 -0
  580. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4e_filter_backend.py +0 -0
  581. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4f_serializer_mixin.py +0 -0
  582. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4g_user_permissions_api.py +0 -0
  583. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4h_full_deny_matrix.py +0 -0
  584. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4i_permission_helpers.py +0 -0
  585. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4j_filter_backends.py +0 -0
  586. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/permissions/test_4m_api_key_middleware.py +0 -0
  587. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/__init__.py +0 -0
  588. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/models.py +0 -0
  589. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14a_query_params.py +0 -0
  590. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14b_ag_post_filter_model.py +0 -0
  591. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14c_ag_post_group_pivot.py +0 -0
  592. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14e_secondary_branches.py +0 -0
  593. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/queries/test_14h_list_query_paths.py +0 -0
  594. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/__init__.py +0 -0
  595. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/models.py +0 -0
  596. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12a_history_meta_scopes.py +0 -0
  597. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12a_read_contract.py +0 -0
  598. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12b_type_roundtrip.py +0 -0
  599. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12c_list_and_many.py +0 -0
  600. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12d_audit_log_payload.py +0 -0
  601. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12e_factory.py +0 -0
  602. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12f_write_paths.py +0 -0
  603. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12g_datetime_tz_ambiguity.py +0 -0
  604. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12h_filefield_clear.py +0 -0
  605. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12i_fk_display_names.py +0 -0
  606. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12j_datetime_roundtrip_convention.py +0 -0
  607. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/serializers/test_12k_sensitive_field_denylist.py +0 -0
  608. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/__init__.py +0 -0
  609. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/models.py +0 -0
  610. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9_7_suppression_guards.py +0 -0
  611. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9a_state_and_broadcast.py +0 -0
  612. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9c_cache_cleanup.py +0 -0
  613. {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
  614. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9e_model_mutation_broadcast.py +0 -0
  615. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/signals_ws/test_9f_core_consumers.py +0 -0
  616. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/__init__.py +0 -0
  617. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/_stress_test_case.py +0 -0
  618. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/models.py +0 -0
  619. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11a_seed_baseline.py +0 -0
  620. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11b_list.py +0 -0
  621. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11c_export.py +0 -0
  622. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11d_period_calc.py +0 -0
  623. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11e_bulk_api.py +0 -0
  624. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11f_growth_and_scale.py +0 -0
  625. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11g_fk_heavy_export.py +0 -0
  626. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11h_calc_log_overhead.py +0 -0
  627. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/stress/test_11i_save_fingerprint.py +0 -0
  628. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/__init__.py +0 -0
  629. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/models.py +0 -0
  630. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3a_pre_validation.py +0 -0
  631. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3b_post_validation.py +0 -0
  632. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3c_hook_ordering.py +0 -0
  633. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3d_recursion_guard.py +0 -0
  634. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3e_snapshot_lifecycle.py +0 -0
  635. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3f_lean_initial_state.py +0 -0
  636. {lex_app-2.2.2 → lex_app-2.3.0}/lex/test_project/tests/validation_hooks/test_3g_aware_datetime_assignment.py +0 -0
  637. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/__init__.py +0 -0
  638. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/_authenticated_e2e_test_case.py +0 -0
  639. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/e2e/_e2e_test_case.py +0 -0
  640. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/calculation/test_calculated_model_mixin.py +0 -0
  641. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/calculation/test_calculation_wait_contexts.py +0 -0
  642. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_asset_mode_sync.py +0 -0
  643. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_update_bootstrap.py +0 -0
  644. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_ai_windows_parity.py +0 -0
  645. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_celery_recovery.py +0 -0
  646. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_mcp_server_sdk_compat.py +0 -0
  647. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tests/unit/infra/test_worker_self_termination.py +0 -0
  648. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/__init__.py +0 -0
  649. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_dashboard.py +0 -0
  650. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_faq.py +0 -0
  651. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_issue_report.py +0 -0
  652. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/ai_worktree.py +0 -0
  653. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/mcp_mode_invoke.py +0 -0
  654. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/setup_with_ai.py +0 -0
  655. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/test_groups.py +0 -0
  656. {lex_app-2.2.2 → lex_app-2.3.0}/lex/tools/verify_ai_assets.py +0 -0
  657. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/__init__.py +0 -0
  658. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/admin.py +0 -0
  659. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/apps.py +0 -0
  660. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/channel_layer.py +0 -0
  661. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/config/__init__.py +0 -0
  662. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/decorators/__init__.py +0 -0
  663. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/decorators/singleton.py +0 -0
  664. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/__init__.py +0 -0
  665. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/import_utils.py +0 -0
  666. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/model_loader.py +0 -0
  667. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/import_system/module_finder.py +0 -0
  668. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/migrations/__init__.py +0 -0
  669. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/models.py +0 -0
  670. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/storage/__init__.py +0 -0
  671. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/storage/custom_storage.py +0 -0
  672. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/utils/__init__.py +0 -0
  673. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/utils/gcs_utils.py +0 -0
  674. {lex_app-2.2.2 → lex_app-2.3.0}/lex/utilities/views.py +0 -0
  675. {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/dependency_links.txt +0 -0
  676. {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/entry_points.txt +0 -0
  677. {lex_app-2.2.2 → lex_app-2.3.0}/lex_app.egg-info/top_level.txt +0 -0
  678. {lex_app-2.2.2 → lex_app-2.3.0}/migrations_logic/__init__.py +0 -0
  679. {lex_app-2.2.2 → lex_app-2.3.0}/migrations_logic/fix_migrations.py +0 -0
  680. {lex_app-2.2.2 → lex_app-2.3.0}/pyproject.toml +0 -0
  681. {lex_app-2.2.2 → lex_app-2.3.0}/setup.cfg +0 -0
  682. {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.2.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 find_project_root, resolve_llm_working_directory
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
- def _load_project_env_file(project_root: Path) -> None:
87
- env_path = project_root / ".env"
88
- if not env_path.exists():
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
- {"start", "celery", "celery-workers", "flower", "pytest", "pytest-groups", "setup", "setup-with-ai", "ai-update"}
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
- nest_asyncio.apply()
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