django-microsys 2.1.4__tar.gz → 2.1.6__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 (279) hide show
  1. {django_microsys-2.1.4 → django_microsys-2.1.6}/PKG-INFO +2 -2
  2. {django_microsys-2.1.4 → django_microsys-2.1.6}/README.md +1 -1
  3. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/PKG-INFO +2 -2
  4. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/SOURCES.txt +3 -26
  5. django_microsys-2.1.6/microsys/VERSION +1 -0
  6. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/apps.py +6 -3
  7. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/context_processors.py +39 -0
  8. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/forms.py +169 -11
  9. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/management/commands/microsys_check.py +3 -2
  10. django_microsys-2.1.6/microsys/middleware.py +256 -0
  11. django_microsys-2.1.6/microsys/migrations/0003_public_root_split.py +21 -0
  12. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/models.py +7 -0
  13. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/compose.yml.tmpl +1 -0
  14. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/settings.py.tmpl +32 -18
  15. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/dynamic_modal/js/main.js +19 -2
  16. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/options.css +12 -11
  17. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/titlebar.css +13 -5
  18. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/system_setup.js +166 -65
  19. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/dark.css +6 -2
  20. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/gothic.css +6 -2
  21. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/neon.css +6 -2
  22. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/retro.css +6 -2
  23. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/css/login.css +63 -0
  24. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/login.js +26 -0
  25. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/base.html +4 -2
  26. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/dynamic_modal.html +1 -1
  27. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/language_catalog_editor.html +4 -4
  28. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/options.html +25 -24
  29. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/sidebar_builder.html +11 -9
  30. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/system_names_editor.html +2 -0
  31. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/system_setup.html +1 -1
  32. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/translation_matrix_editor.html +2 -0
  33. {django_microsys-2.1.4/microsys/templates/microsys/widgets → django_microsys-2.1.6/microsys/templates/microsys/users}/profile_image_widget.html +1 -1
  34. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/registration/login.html +18 -17
  35. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/translations.py +23 -3
  36. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/utils.py +33 -2
  37. django_microsys-2.1.4/microsys/VERSION +0 -1
  38. django_microsys-2.1.4/microsys/md2docx_v4.py +0 -312
  39. django_microsys-2.1.4/microsys/middleware.py +0 -181
  40. django_microsys-2.1.4/microsys/static/chart.js/chart.umd.min.js +0 -14
  41. django_microsys-2.1.4/microsys/static/flatpickr/flatpickr.min.css +0 -13
  42. django_microsys-2.1.4/microsys/static/flatpickr/flatpickr.min.js +0 -2
  43. django_microsys-2.1.4/microsys/static/flatpickr/locale/ar.d.ts +0 -72
  44. django_microsys-2.1.4/microsys/static/flatpickr/locale/ar.js +0 -62
  45. django_microsys-2.1.4/microsys/static/microsys/main/css/charts.css +0 -51
  46. django_microsys-2.1.4/microsys/static/microsys/main/css/doc_detail.css +0 -101
  47. django_microsys-2.1.4/microsys/static/microsys/main/css/gen_pdf.css +0 -126
  48. django_microsys-2.1.4/microsys/static/microsys/main/css/gen_report.css +0 -74
  49. django_microsys-2.1.4/microsys/static/microsys/main/css/navtabs.css +0 -62
  50. django_microsys-2.1.4/microsys/static/microsys/main/fonts/Amiri-Bold.woff2 +0 -0
  51. django_microsys-2.1.4/microsys/static/microsys/main/fonts/Amiri-BoldItalic.woff2 +0 -0
  52. django_microsys-2.1.4/microsys/static/microsys/main/fonts/Amiri-Italic.woff2 +0 -0
  53. django_microsys-2.1.4/microsys/static/microsys/main/fonts/Amiri-Regular.woff2 +0 -0
  54. django_microsys-2.1.4/microsys/static/microsys/main/js/anime.min.js +0 -8
  55. django_microsys-2.1.4/microsys/static/microsys/main/js/dashboard.js +0 -66
  56. django_microsys-2.1.4/microsys/static/microsys/themes/css/main.css +0 -7
  57. django_microsys-2.1.4/microsys/static/vanillajs-datepicker/ar.js +0 -15
  58. django_microsys-2.1.4/microsys/templates/microsys/forms/checkbox_field.html +0 -12
  59. django_microsys-2.1.4/microsys/templates/microsys/forms/file_field.html +0 -12
  60. django_microsys-2.1.4/microsys/templates/microsys/helpers/global_list.html +0 -56
  61. django_microsys-2.1.4/microsys/templates/microsys/helpers/scan_link.html +0 -3
  62. django_microsys-2.1.4/microsys/templates/microsys/includes/dashboard.html +0 -157
  63. {django_microsys-2.1.4 → django_microsys-2.1.6}/LICENSE +0 -0
  64. {django_microsys-2.1.4 → django_microsys-2.1.6}/MANIFEST.in +0 -0
  65. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/dependency_links.txt +0 -0
  66. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/entry_points.txt +0 -0
  67. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/requires.txt +0 -0
  68. {django_microsys-2.1.4 → django_microsys-2.1.6}/django_microsys.egg-info/top_level.txt +0 -0
  69. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/__init__.py +0 -0
  70. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/__main__.py +0 -0
  71. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/admin.py +0 -0
  72. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/api.py +0 -0
  73. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/cli.py +0 -0
  74. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/constants.py +0 -0
  75. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/discovery.py +0 -0
  76. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/fetcher.py +0 -0
  77. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/filters.py +0 -0
  78. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/formats/__init__.py +0 -0
  79. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/formats/ar/__init__.py +0 -0
  80. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/formats/ar/formats.py +0 -0
  81. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/formats/en/__init__.py +0 -0
  82. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/formats/en/formats.py +0 -0
  83. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/guards.py +0 -0
  84. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/management/commands/__init__.py +0 -0
  85. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/management/commands/microsys_setup.py +0 -0
  86. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/management/commands/migrator.py +0 -0
  87. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/management/commands/seed_activity_log.py +0 -0
  88. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/managers.py +0 -0
  89. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/migrations/0001_initial.py +0 -0
  90. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/migrations/0002_public_registration.py +0 -0
  91. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/migrations/__init__.py +0 -0
  92. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/patches.py +0 -0
  93. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/registration.py +0 -0
  94. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold.py +0 -0
  95. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/README.md.tmpl +0 -0
  96. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/__init__.py.tmpl +0 -0
  97. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/apps.py.tmpl +0 -0
  98. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/filters.py.tmpl +0 -0
  99. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/forms.py.tmpl +0 -0
  100. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/migrations/__init__.py.tmpl +0 -0
  101. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/models.py.tmpl +0 -0
  102. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/tables.py.tmpl +0 -0
  103. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/templates/example_record_confirm_delete.html.tmpl +0 -0
  104. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/templates/example_record_detail.html.tmpl +0 -0
  105. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/templates/example_record_form.html.tmpl +0 -0
  106. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/templates/example_record_list.html.tmpl +0 -0
  107. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/tests/__init__.py.tmpl +0 -0
  108. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/tests/test_app.py.tmpl +0 -0
  109. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/translations.py.tmpl +0 -0
  110. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/urls.py.tmpl +0 -0
  111. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/app/views.py.tmpl +0 -0
  112. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/.nginx/nginx.conf.tmpl +0 -0
  113. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/.secrets/.env.tmpl +0 -0
  114. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/Dockerfile.tmpl +0 -0
  115. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/README.md.tmpl +0 -0
  116. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/compose.dev.yml.tmpl +0 -0
  117. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/dockerignore.tmpl +0 -0
  118. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/docs/README.md.tmpl +0 -0
  119. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/entrypoint.sh.tmpl +0 -0
  120. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/gitattributes.tmpl +0 -0
  121. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/gitignore.tmpl +0 -0
  122. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/gunicorn.py.tmpl +0 -0
  123. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/manage.py.tmpl +0 -0
  124. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/__init__.py.tmpl +0 -0
  125. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/asgi.py.tmpl +0 -0
  126. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/celery.py.tmpl +0 -0
  127. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/urls.py.tmpl +0 -0
  128. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/package/wsgi.py.tmpl +0 -0
  129. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/req.txt.tmpl +0 -0
  130. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/start.ps1.tmpl +0 -0
  131. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/start.sh.tmpl +0 -0
  132. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/tests/__init__.py.tmpl +0 -0
  133. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/tests/test_scaffold.py.tmpl +0 -0
  134. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/scaffold_templates/project/tools/smtp_relay.py.tmpl +0 -0
  135. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/signals.py +0 -0
  136. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap-icons.css +0 -0
  137. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap-icons.woff +0 -0
  138. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap-icons.woff2 +0 -0
  139. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.bundle.min.js +0 -0
  140. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.bundle.min.js.map +0 -0
  141. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.min.css +0 -0
  142. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.min.css.map +0 -0
  143. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.rtl.min.css +0 -0
  144. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/bootstrap/bootstrap.rtl.min.css.map +0 -0
  145. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/favicon.ico +0 -0
  146. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/img/base_logo.webp +0 -0
  147. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/img/default_profile.webp +0 -0
  148. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/img/login_logo.webp +0 -0
  149. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/accessibility/css/main.css +0 -0
  150. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/accessibility/js/main.js +0 -0
  151. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/activitylog/js/main.js +0 -0
  152. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/forms/css/file_field.css +0 -0
  153. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/forms/css/form_actions.css +0 -0
  154. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/forms/css/form_fields.css +0 -0
  155. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/forms/js/file_field.js +0 -0
  156. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/forms/js/filter_form.js +0 -0
  157. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/autofill/js/main.js +0 -0
  158. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/context_menu/css/main.css +0 -0
  159. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/context_menu/js/main.js +0 -0
  160. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/context_menu/js/section_manager.js +0 -0
  161. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/prevent_double_submit.js +0 -0
  162. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/scan_link/js/main.js +0 -0
  163. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/scan_link/js/scan_button.js +0 -0
  164. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/helpers/wizard/js/main.js +0 -0
  165. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/language/css/main.css +0 -0
  166. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/language/fonts/TwemojiCountryFlags.woff2 +0 -0
  167. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/language/js/main.js +0 -0
  168. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/language/js/translations.js +0 -0
  169. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/buttons.css +0 -0
  170. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/dropdowns.css +0 -0
  171. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/index_cards.css +0 -0
  172. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/main.css +0 -0
  173. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/pagination.css +0 -0
  174. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/selectors.css +0 -0
  175. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/system_setup.css +0 -0
  176. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/tables.css +0 -0
  177. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/css/template_cleanup.css +0 -0
  178. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/fonts/Shabwa-Bold.woff2 +0 -0
  179. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/fonts/Shabwa-Medium.woff2 +0 -0
  180. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/fonts/Shabwa.woff2 +0 -0
  181. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/base_head.js +0 -0
  182. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/base_runtime.js +0 -0
  183. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/options.js +0 -0
  184. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/selectors.js +0 -0
  185. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/main/js/tables.js +0 -0
  186. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sections/js/manage_sections.js +0 -0
  187. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/css/main.css +0 -0
  188. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/css/reorder.css +0 -0
  189. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/css/theme_picker.css +0 -0
  190. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/js/main.js +0 -0
  191. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/js/preload.js +0 -0
  192. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/js/reorder.js +0 -0
  193. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/sidebar/js/theme_picker.js +0 -0
  194. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/blue.css +0 -0
  195. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/gold.css +0 -0
  196. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/green.css +0 -0
  197. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/light.css +0 -0
  198. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/mono.css +0 -0
  199. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/css/red.css +0 -0
  200. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/themes/js/main.js +0 -0
  201. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/tutorial/css/main.css +0 -0
  202. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/tutorial/js/driver.js +0 -0
  203. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/tutorial/js/main.js +0 -0
  204. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/css/permissions.css +0 -0
  205. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/css/profile.css +0 -0
  206. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/css/user_hub.css +0 -0
  207. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/manage_users.js +0 -0
  208. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/permissions.js +0 -0
  209. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/profile_2fa.js +0 -0
  210. {django_microsys-2.1.4/microsys/static/microsys/widgets → django_microsys-2.1.6/microsys/static/microsys/users}/js/profile_image_widget.js +0 -0
  211. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/twofa_verify.js +0 -0
  212. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/microsys/users/js/user_hub.js +0 -0
  213. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/vanillajs-datepicker/datepicker-bs5.min.css +0 -0
  214. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/static/vanillajs-datepicker/datepicker.min.js +0 -0
  215. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/tables.py +0 -0
  216. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/bootstrap5/layout/field_file.html +0 -0
  217. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/2fa/verify.html +0 -0
  218. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/activitylog/activity_log.html +0 -0
  219. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/activitylog/activity_log_detail_modal.html +0 -0
  220. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/form_base.html +0 -0
  221. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/assets_head.html +0 -0
  222. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/assets_scripts.html +0 -0
  223. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/crispy_file_field.html +0 -0
  224. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/file_input.html +0 -0
  225. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/filter_assets_head.html +0 -0
  226. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/forms/filter_assets_scripts.html +0 -0
  227. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/dynamic_modal_combined.html +0 -0
  228. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/dynamic_modal_detail.html +0 -0
  229. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/dynamic_modal_form.html +0 -0
  230. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/dynamic_modal_list.html +0 -0
  231. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/helpers/micro_context_menu.html +0 -0
  232. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/language_previews.html +0 -0
  233. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/sidebar_density_previews.html +0 -0
  234. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/sidebar_items.html +0 -0
  235. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/table_density_previews.html +0 -0
  236. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/theme_previews.html +0 -0
  237. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/theme_settings_matrix.html +0 -0
  238. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/titlebar.html +0 -0
  239. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/includes/tutorial.html +0 -0
  240. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/list_base.html +0 -0
  241. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/registration/pending.html +0 -0
  242. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/scopes/scope_actions.html +0 -0
  243. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/scopes/scope_form.html +0 -0
  244. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/scopes/scope_manager.html +0 -0
  245. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sections/manage_sections.html +0 -0
  246. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sections/subsection_select.html +0 -0
  247. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sidebar/auto.html +0 -0
  248. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sidebar/extra_groups.html +0 -0
  249. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sidebar/main.html +0 -0
  250. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/sidebar/tree.html +0 -0
  251. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/tables/table.html +0 -0
  252. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/users/grouped_permissions.html +0 -0
  253. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/users/manage_users.html +0 -0
  254. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/users/profile.html +0 -0
  255. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/users/user_detail_modal.html +0 -0
  256. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/microsys/users/user_hub.html +0 -0
  257. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/registration/email/verify_registration.txt +0 -0
  258. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/registration/register.html +0 -0
  259. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/registration/register_sent.html +0 -0
  260. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templates/registration/register_verify.html +0 -0
  261. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templatetags/__init__.py +0 -0
  262. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templatetags/microsys_tags.py +0 -0
  263. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templatetags/microsys_translation.py +0 -0
  264. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/templatetags/sidebar_tags.py +0 -0
  265. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/themes.py +0 -0
  266. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/urls.py +0 -0
  267. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/__init__.py +0 -0
  268. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/activitylog.py +0 -0
  269. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/general.py +0 -0
  270. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/profile.py +0 -0
  271. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/registration.py +0 -0
  272. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/scopes.py +0 -0
  273. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/sections.py +0 -0
  274. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/sidebar.py +0 -0
  275. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/twofa.py +0 -0
  276. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/views/users.py +0 -0
  277. {django_microsys-2.1.4 → django_microsys-2.1.6}/microsys/widgets.py +0 -0
  278. {django_microsys-2.1.4 → django_microsys-2.1.6}/pyproject.toml +0 -0
  279. {django_microsys-2.1.4 → django_microsys-2.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django_microsys
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Django microSYS (System Integration Service) - Multilingual Django Starter Pack, Packed with Features.
5
5
  Author-email: DeBeski <debeski1@gmail.com>
6
6
  License: NON-COMMERCIAL
@@ -102,7 +102,7 @@ from microsys.utils import microsys_settings
102
102
  microsys_settings(globals())
103
103
  ```
104
104
 
105
- That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.ActivityLogMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
105
+ That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.MicrosysMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
106
106
 
107
107
  __Proceed to [Getting Started](docs/getting-started.md) if you prefer to wire everything manually.__
108
108
 
@@ -68,7 +68,7 @@ from microsys.utils import microsys_settings
68
68
  microsys_settings(globals())
69
69
  ```
70
70
 
71
- That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.ActivityLogMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
71
+ That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.MicrosysMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
72
72
 
73
73
  __Proceed to [Getting Started](docs/getting-started.md) if you prefer to wire everything manually.__
74
74
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-microsys
3
- Version: 2.1.4
3
+ Version: 2.1.6
4
4
  Summary: Django microSYS (System Integration Service) - Multilingual Django Starter Pack, Packed with Features.
5
5
  Author-email: DeBeski <debeski1@gmail.com>
6
6
  License: NON-COMMERCIAL
@@ -102,7 +102,7 @@ from microsys.utils import microsys_settings
102
102
  microsys_settings(globals())
103
103
  ```
104
104
 
105
- That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.ActivityLogMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
105
+ That helper prepends the required apps, inserts `django.middleware.locale.LocaleMiddleware` and `microsys.middleware.MicrosysMiddleware` in the supported order, adds the Microsys context processor, sets the Crispy Bootstrap 5 defaults, adds a Bootstrap-friendly `MESSAGE_TAGS` error mapping, and seeds the standard MicroSys runtime defaults for language, timezone, i18n/tz flags, `FORMAT_MODULE_PATH`, and charset unless your project already defines them.
106
106
 
107
107
  __Proceed to [Getting Started](docs/getting-started.md) if you prefer to wire everything manually.__
108
108
 
@@ -23,7 +23,6 @@ microsys/filters.py
23
23
  microsys/forms.py
24
24
  microsys/guards.py
25
25
  microsys/managers.py
26
- microsys/md2docx_v4.py
27
26
  microsys/middleware.py
28
27
  microsys/models.py
29
28
  microsys/patches.py
@@ -48,6 +47,7 @@ microsys/management/commands/migrator.py
48
47
  microsys/management/commands/seed_activity_log.py
49
48
  microsys/migrations/0001_initial.py
50
49
  microsys/migrations/0002_public_registration.py
50
+ microsys/migrations/0003_public_root_split.py
51
51
  microsys/migrations/__init__.py
52
52
  microsys/scaffold_templates/app/README.md.tmpl
53
53
  microsys/scaffold_templates/app/__init__.py.tmpl
@@ -101,11 +101,6 @@ microsys/static/bootstrap/bootstrap.min.css
101
101
  microsys/static/bootstrap/bootstrap.min.css.map
102
102
  microsys/static/bootstrap/bootstrap.rtl.min.css
103
103
  microsys/static/bootstrap/bootstrap.rtl.min.css.map
104
- microsys/static/chart.js/chart.umd.min.js
105
- microsys/static/flatpickr/flatpickr.min.css
106
- microsys/static/flatpickr/flatpickr.min.js
107
- microsys/static/flatpickr/locale/ar.d.ts
108
- microsys/static/flatpickr/locale/ar.js
109
104
  microsys/static/img/base_logo.webp
110
105
  microsys/static/img/default_profile.webp
111
106
  microsys/static/img/login_logo.webp
@@ -131,14 +126,9 @@ microsys/static/microsys/language/fonts/TwemojiCountryFlags.woff2
131
126
  microsys/static/microsys/language/js/main.js
132
127
  microsys/static/microsys/language/js/translations.js
133
128
  microsys/static/microsys/main/css/buttons.css
134
- microsys/static/microsys/main/css/charts.css
135
- microsys/static/microsys/main/css/doc_detail.css
136
129
  microsys/static/microsys/main/css/dropdowns.css
137
- microsys/static/microsys/main/css/gen_pdf.css
138
- microsys/static/microsys/main/css/gen_report.css
139
130
  microsys/static/microsys/main/css/index_cards.css
140
131
  microsys/static/microsys/main/css/main.css
141
- microsys/static/microsys/main/css/navtabs.css
142
132
  microsys/static/microsys/main/css/options.css
143
133
  microsys/static/microsys/main/css/pagination.css
144
134
  microsys/static/microsys/main/css/selectors.css
@@ -146,17 +136,11 @@ microsys/static/microsys/main/css/system_setup.css
146
136
  microsys/static/microsys/main/css/tables.css
147
137
  microsys/static/microsys/main/css/template_cleanup.css
148
138
  microsys/static/microsys/main/css/titlebar.css
149
- microsys/static/microsys/main/fonts/Amiri-Bold.woff2
150
- microsys/static/microsys/main/fonts/Amiri-BoldItalic.woff2
151
- microsys/static/microsys/main/fonts/Amiri-Italic.woff2
152
- microsys/static/microsys/main/fonts/Amiri-Regular.woff2
153
139
  microsys/static/microsys/main/fonts/Shabwa-Bold.woff2
154
140
  microsys/static/microsys/main/fonts/Shabwa-Medium.woff2
155
141
  microsys/static/microsys/main/fonts/Shabwa.woff2
156
- microsys/static/microsys/main/js/anime.min.js
157
142
  microsys/static/microsys/main/js/base_head.js
158
143
  microsys/static/microsys/main/js/base_runtime.js
159
- microsys/static/microsys/main/js/dashboard.js
160
144
  microsys/static/microsys/main/js/options.js
161
145
  microsys/static/microsys/main/js/selectors.js
162
146
  microsys/static/microsys/main/js/system_setup.js
@@ -175,7 +159,6 @@ microsys/static/microsys/themes/css/gold.css
175
159
  microsys/static/microsys/themes/css/gothic.css
176
160
  microsys/static/microsys/themes/css/green.css
177
161
  microsys/static/microsys/themes/css/light.css
178
- microsys/static/microsys/themes/css/main.css
179
162
  microsys/static/microsys/themes/css/mono.css
180
163
  microsys/static/microsys/themes/css/neon.css
181
164
  microsys/static/microsys/themes/css/red.css
@@ -192,10 +175,9 @@ microsys/static/microsys/users/js/login.js
192
175
  microsys/static/microsys/users/js/manage_users.js
193
176
  microsys/static/microsys/users/js/permissions.js
194
177
  microsys/static/microsys/users/js/profile_2fa.js
178
+ microsys/static/microsys/users/js/profile_image_widget.js
195
179
  microsys/static/microsys/users/js/twofa_verify.js
196
180
  microsys/static/microsys/users/js/user_hub.js
197
- microsys/static/microsys/widgets/js/profile_image_widget.js
198
- microsys/static/vanillajs-datepicker/ar.js
199
181
  microsys/static/vanillajs-datepicker/datepicker-bs5.min.css
200
182
  microsys/static/vanillajs-datepicker/datepicker.min.js
201
183
  microsys/templates/bootstrap5/layout/field_file.html
@@ -207,9 +189,7 @@ microsys/templates/microsys/activitylog/activity_log.html
207
189
  microsys/templates/microsys/activitylog/activity_log_detail_modal.html
208
190
  microsys/templates/microsys/forms/assets_head.html
209
191
  microsys/templates/microsys/forms/assets_scripts.html
210
- microsys/templates/microsys/forms/checkbox_field.html
211
192
  microsys/templates/microsys/forms/crispy_file_field.html
212
- microsys/templates/microsys/forms/file_field.html
213
193
  microsys/templates/microsys/forms/file_input.html
214
194
  microsys/templates/microsys/forms/filter_assets_head.html
215
195
  microsys/templates/microsys/forms/filter_assets_scripts.html
@@ -218,10 +198,7 @@ microsys/templates/microsys/helpers/dynamic_modal_combined.html
218
198
  microsys/templates/microsys/helpers/dynamic_modal_detail.html
219
199
  microsys/templates/microsys/helpers/dynamic_modal_form.html
220
200
  microsys/templates/microsys/helpers/dynamic_modal_list.html
221
- microsys/templates/microsys/helpers/global_list.html
222
201
  microsys/templates/microsys/helpers/micro_context_menu.html
223
- microsys/templates/microsys/helpers/scan_link.html
224
- microsys/templates/microsys/includes/dashboard.html
225
202
  microsys/templates/microsys/includes/language_catalog_editor.html
226
203
  microsys/templates/microsys/includes/language_previews.html
227
204
  microsys/templates/microsys/includes/options.html
@@ -250,9 +227,9 @@ microsys/templates/microsys/tables/table.html
250
227
  microsys/templates/microsys/users/grouped_permissions.html
251
228
  microsys/templates/microsys/users/manage_users.html
252
229
  microsys/templates/microsys/users/profile.html
230
+ microsys/templates/microsys/users/profile_image_widget.html
253
231
  microsys/templates/microsys/users/user_detail_modal.html
254
232
  microsys/templates/microsys/users/user_hub.html
255
- microsys/templates/microsys/widgets/profile_image_widget.html
256
233
  microsys/templates/registration/login.html
257
234
  microsys/templates/registration/register.html
258
235
  microsys/templates/registration/register_sent.html
@@ -0,0 +1 @@
1
+ 2.1.6
@@ -67,10 +67,13 @@ class MicrosysConfig(AppConfig):
67
67
  from django.conf import settings
68
68
 
69
69
  # Check Middleware
70
- middleware_path = 'microsys.middleware.ActivityLogMiddleware'
71
- if middleware_path not in getattr(settings, 'MIDDLEWARE', []):
70
+ new_path = 'microsys.middleware.MicrosysMiddleware'
71
+ old_path = 'microsys.middleware.ActivityLogMiddleware'
72
+ configured_middleware = getattr(settings, 'MIDDLEWARE', [])
73
+
74
+ if new_path not in configured_middleware and old_path not in configured_middleware:
72
75
  warnings.warn(
73
- f"\n⚠️ microsys: '{middleware_path}' not found in MIDDLEWARE.\n"
76
+ f"\n⚠️ microsys: '{new_path}' not found in MIDDLEWARE.\n"
74
77
  " Activity logging will not work. Run 'python manage.py microsys_check' for details.",
75
78
  UserWarning
76
79
  )
@@ -1,3 +1,5 @@
1
+ from urllib.parse import urlsplit
2
+
1
3
  from .constants import DEFAULT_TABLE_DENSITY, TABLE_DENSITY_CHOICES, TABLE_DENSITY_VALUES
2
4
  from .utils import (
3
5
  get_effective_allowed_themes,
@@ -19,6 +21,38 @@ from django.urls import reverse, NoReverseMatch
19
21
  from .discovery import SYSTEM_ROUTE_META, build_sidebar_navigation
20
22
  from .themes import get_theme_names, get_theme_options
21
23
 
24
+
25
+ def _normalize_runtime_path(value):
26
+ raw_value = str(value or '').strip()
27
+ if not raw_value:
28
+ return ''
29
+ parsed = urlsplit(raw_value)
30
+ path = str(parsed.path or raw_value).strip()
31
+ if not path.startswith('/'):
32
+ return ''
33
+ return path if path == '/' else path.rstrip('/')
34
+
35
+
36
+ def _should_hide_titlebar_for_public_index(request, final_config, titlebar_config):
37
+ user = getattr(request, 'user', None)
38
+ if not titlebar_config.get('hide_on_public_unauthenticated_index', False):
39
+ return False
40
+ if not final_config.get('public_root', False):
41
+ return False
42
+ if user and getattr(user, 'is_authenticated', False):
43
+ return False
44
+
45
+ current_path = _normalize_runtime_path(getattr(request, 'path', ''))
46
+ if not current_path:
47
+ return False
48
+
49
+ public_paths = {'/'}
50
+ anonymous_public_path = final_config.get('public_root_url') if final_config.get('public_root_split_enabled', False) else final_config.get('home_url')
51
+ target_path = _normalize_runtime_path(anonymous_public_path)
52
+ if target_path:
53
+ public_paths.add(target_path)
54
+ return current_path in public_paths
55
+
22
56
  # Helper functions for Sidebar - KEPT PRIVATE
23
57
  def _get_config_hash(config):
24
58
  """Generate a hash of the config for cache key."""
@@ -301,6 +335,11 @@ def microsys_context(request):
301
335
  'extra_groups': context['sidebar_extra_groups'],
302
336
  }
303
337
  context['titlebar'] = final_config.get('appearance', {}).get('titlebar', final_config.get('titlebar', {}))
338
+ context['hide_titlebar_for_public_index'] = _should_hide_titlebar_for_public_index(
339
+ request,
340
+ final_config,
341
+ context['titlebar'],
342
+ )
304
343
 
305
344
  return context
306
345
 
@@ -288,7 +288,7 @@ def _build_submit_actions(strings, submit_label, submit_icon, submit_class='btn
288
288
  )
289
289
 
290
290
  class ProfileImageWidget(forms.ClearableFileInput):
291
- template_name = 'microsys/widgets/profile_image_widget.html'
291
+ template_name = 'microsys/users/profile_image_widget.html'
292
292
 
293
293
 
294
294
  def _apply_autocomplete_attrs(form, mapping):
@@ -1283,6 +1283,10 @@ class SystemSettingsForm(forms.ModelForm):
1283
1283
  required=False,
1284
1284
  choices=(),
1285
1285
  )
1286
+ public_root_url_discovered = forms.ChoiceField(
1287
+ required=False,
1288
+ choices=(),
1289
+ )
1286
1290
  settings_import_file = forms.FileField(
1287
1291
  required=False,
1288
1292
  )
@@ -1403,6 +1407,10 @@ class SystemSettingsForm(forms.ModelForm):
1403
1407
  required=False,
1404
1408
  initial=True,
1405
1409
  )
1410
+ titlebar_hide_on_public_unauthenticated_index = forms.BooleanField(
1411
+ required=False,
1412
+ initial=False,
1413
+ )
1406
1414
  titlebar_home_shape = forms.ChoiceField(
1407
1415
  required=False,
1408
1416
  choices=TITLEBAR_HOME_SHAPE_CHOICES,
@@ -1436,6 +1444,14 @@ class SystemSettingsForm(forms.ModelForm):
1436
1444
  required=False,
1437
1445
  initial=False,
1438
1446
  )
1447
+ public_root_split_enabled = forms.BooleanField(
1448
+ required=False,
1449
+ initial=False,
1450
+ )
1451
+ public_root_url = forms.CharField(
1452
+ required=False,
1453
+ max_length=255,
1454
+ )
1439
1455
  public_registration_enabled = forms.BooleanField(
1440
1456
  required=False,
1441
1457
  initial=False,
@@ -1464,6 +1480,8 @@ class SystemSettingsForm(forms.ModelForm):
1464
1480
  'default_table_density',
1465
1481
  'email_2fa',
1466
1482
  'public_root',
1483
+ 'public_root_split_enabled',
1484
+ 'public_root_url',
1467
1485
  'public_registration_enabled',
1468
1486
  'registration_activation_mode',
1469
1487
  'registration_throttle_enabled',
@@ -1525,17 +1543,45 @@ class SystemSettingsForm(forms.ModelForm):
1525
1543
  self.fields['translations_override'].label = s.get('form_sys_translations', "Translation overrides")
1526
1544
  self.fields['home_url'].required = False
1527
1545
  self.fields['home_url'].label = s.get('form_sys_home_url', "Home URL")
1528
- self.fields['home_url'].help_text = s.get('help_sys_home_url', 'You can write a custom path like / or /finance/ or a full URL if desired.')
1546
+ self.fields['home_url'].help_text = s.get(
1547
+ 'help_sys_home_url',
1548
+ 'Choose the main Home URL. It remains the authenticated home destination and login redirect even when anonymous public-root traffic is split elsewhere.',
1549
+ )
1529
1550
  self.fields['home_url'].widget.attrs.update({
1530
1551
  'class': 'form-control glass-input',
1531
1552
  'dir': 'ltr',
1532
1553
  'placeholder': DEFAULT_HOME_URL,
1533
1554
  })
1534
1555
  self.fields['home_url_discovered'].label = s.get('form_sys_home_url_discovered', "Select from discovered pages")
1535
- self.fields['home_url_discovered'].help_text = s.get('help_sys_home_url_discovered', 'Optional: Select a discovered page to auto-fill the home URL, or leave blank and enter a custom URL.')
1556
+ self.fields['home_url_discovered'].help_text = s.get(
1557
+ 'help_sys_home_url_discovered',
1558
+ 'Optional: select a discovered page to auto-fill the Home URL, or leave it blank and enter a custom URL.',
1559
+ )
1536
1560
  self.fields['home_url_discovered'].widget.attrs.update({
1537
1561
  'class': 'form-select glass-input',
1538
1562
  })
1563
+ self.fields['public_root_url'].required = False
1564
+ self.fields['public_root_url'].label = s.get('form_sys_public_root_url', 'Anonymous Public Root URL')
1565
+ self.fields['public_root_url'].help_text = s.get(
1566
+ 'help_sys_public_root_url',
1567
+ 'Optional: when separate public-root mode is enabled, anonymous users landing on `/` are redirected here instead of the main Home URL.',
1568
+ )
1569
+ self.fields['public_root_url'].widget.attrs.update({
1570
+ 'class': 'form-control glass-input',
1571
+ 'dir': 'ltr',
1572
+ 'placeholder': '/',
1573
+ })
1574
+ self.fields['public_root_url_discovered'].label = s.get(
1575
+ 'form_sys_public_root_url_discovered',
1576
+ 'Choose anonymous public root from discovered pages',
1577
+ )
1578
+ self.fields['public_root_url_discovered'].help_text = s.get(
1579
+ 'help_sys_public_root_url_discovered',
1580
+ 'Optional: select a discovered page to auto-fill the anonymous public-root destination, or leave it blank and enter a custom URL.',
1581
+ )
1582
+ self.fields['public_root_url_discovered'].widget.attrs.update({
1583
+ 'class': 'form-select glass-input',
1584
+ })
1539
1585
  self.fields['default_language'].label = s.get('form_sys_default_lang', "Default Language")
1540
1586
  self.fields['default_theme'].label = s.get('form_sys_default_theme', "Default Theme")
1541
1587
  self.fields['allowed_themes'].label = s.get('form_sys_allowed_themes', 'Allowed themes')
@@ -1617,6 +1663,10 @@ class SystemSettingsForm(forms.ModelForm):
1617
1663
  self.fields['titlebar_show_title'].label = s.get('form_sys_titlebar_show_title', 'Show titlebar title')
1618
1664
  self.fields['titlebar_show_logo'].label = s.get('form_sys_titlebar_show_logo', 'Show titlebar logo')
1619
1665
  self.fields['titlebar_show_home_button'].label = s.get('form_sys_titlebar_show_home_button', 'Show titlebar home button')
1666
+ self.fields['titlebar_hide_on_public_unauthenticated_index'].label = s.get(
1667
+ 'form_sys_titlebar_hide_on_public_unauthenticated_index',
1668
+ 'Hide titlebar on anonymous public home/index',
1669
+ )
1620
1670
  self.fields['titlebar_home_shape'].label = s.get('form_sys_titlebar_home_shape', 'Home button shape')
1621
1671
  self.fields['titlebar_title_align'].label = s.get('form_sys_titlebar_title_align', 'Title alignment')
1622
1672
  self.fields['titlebar_title_size'].label = s.get('form_sys_titlebar_title_size', 'Title size')
@@ -1634,6 +1684,10 @@ class SystemSettingsForm(forms.ModelForm):
1634
1684
  'help_sys_titlebar_show_home_button',
1635
1685
  'Show the quick Home button in the titlebar.',
1636
1686
  )
1687
+ self.fields['titlebar_hide_on_public_unauthenticated_index'].help_text = s.get(
1688
+ 'help_sys_titlebar_hide_on_public_unauthenticated_index',
1689
+ 'Hide the titlebar when an anonymous user opens the public root/home page.',
1690
+ )
1637
1691
  self.fields['titlebar_home_shape'].choices = (
1638
1692
  ('circle', s.get('titlebar_home_shape_circle', 'Circle')),
1639
1693
  ('square', s.get('titlebar_home_shape_square', 'Square')),
@@ -1687,6 +1741,14 @@ class SystemSettingsForm(forms.ModelForm):
1687
1741
  'help_sys_public_root',
1688
1742
  'Allow anonymous (non-logged-in) users to access the root URL (/). When enabled, the system will not force-redirect to login.',
1689
1743
  )
1744
+ self.fields['public_root_split_enabled'].label = s.get(
1745
+ 'form_sys_public_root_split_enabled',
1746
+ 'Separate anonymous public root from Home URL',
1747
+ )
1748
+ self.fields['public_root_split_enabled'].help_text = s.get(
1749
+ 'help_sys_public_root_split_enabled',
1750
+ 'When enabled, anonymous users can be redirected to a separate Public Root URL while authenticated users still use the main Home URL.',
1751
+ )
1690
1752
  email_status = get_email_service_status()
1691
1753
  smtp_label = s.get('form_sys_email_status_ready', 'ready') if email_status.get('available') else s.get('form_sys_email_status_not_ready', 'not ready')
1692
1754
  self.fields['public_registration_enabled'].label = s.get('form_sys_public_registration', 'Enable Public Registration')
@@ -1918,6 +1980,13 @@ class SystemSettingsForm(forms.ModelForm):
1918
1980
  or DEFAULT_HOME_URL
1919
1981
  )
1920
1982
  self.initial['home_url'] = current_home_url
1983
+ instance_public_root_url = str(getattr(self.instance, 'public_root_url', '') or '').strip()
1984
+ current_public_root_url = (
1985
+ instance_public_root_url
1986
+ or config.get('public_root_url', '')
1987
+ or project_config.get('public_root_url', '')
1988
+ )
1989
+ self.initial['public_root_url'] = current_public_root_url
1921
1990
 
1922
1991
  if self.instance and self.instance.pk:
1923
1992
  if isinstance(self.instance.languages, dict):
@@ -1956,6 +2025,13 @@ class SystemSettingsForm(forms.ModelForm):
1956
2025
  getattr(self.instance, 'public_root', False)
1957
2026
  or config.get('public_root', False)
1958
2027
  )
2028
+ self.initial['public_root_split_enabled'] = bool(
2029
+ (
2030
+ config.get('public_root_split_enabled', False)
2031
+ if (not getattr(self.instance, 'pk', None) and not getattr(self.instance, 'is_configured', False))
2032
+ else getattr(self.instance, 'public_root_split_enabled', config.get('public_root_split_enabled', False))
2033
+ )
2034
+ )
1959
2035
  self.initial['public_registration_enabled'] = bool(
1960
2036
  getattr(self.instance, 'public_registration_enabled', False)
1961
2037
  or config.get('public_registration_enabled', False)
@@ -2016,6 +2092,9 @@ class SystemSettingsForm(forms.ModelForm):
2016
2092
  self.initial['titlebar_show_title'] = bool(initial_titlebar_config.get('show_title', True))
2017
2093
  self.initial['titlebar_show_logo'] = bool(initial_titlebar_config.get('show_logo', True))
2018
2094
  self.initial['titlebar_show_home_button'] = bool(initial_titlebar_config.get('show_home_button', True))
2095
+ self.initial['titlebar_hide_on_public_unauthenticated_index'] = bool(
2096
+ initial_titlebar_config.get('hide_on_public_unauthenticated_index', False)
2097
+ )
2019
2098
  self.initial['titlebar_home_shape'] = initial_titlebar_config.get('home_shape', 'circle')
2020
2099
  self.initial['titlebar_title_align'] = initial_titlebar_config.get('title_align', 'start')
2021
2100
  self.initial['titlebar_title_size'] = initial_titlebar_config.get('title_size', 'md')
@@ -2054,6 +2133,9 @@ class SystemSettingsForm(forms.ModelForm):
2054
2133
  self.fields['home_url_discovered'].choices = home_url_choices
2055
2134
  self.fields['home_url_discovered'].widget.option_meta = home_url_option_meta
2056
2135
  self.initial['home_url_discovered'] = current_home_url if current_home_url in seen_home_urls else ''
2136
+ self.fields['public_root_url_discovered'].choices = home_url_choices
2137
+ self.fields['public_root_url_discovered'].widget.option_meta = home_url_option_meta
2138
+ self.initial['public_root_url_discovered'] = current_public_root_url if current_public_root_url in seen_home_urls else ''
2057
2139
 
2058
2140
  try:
2059
2141
  initial_languages = json.loads(self.initial.get('languages') or '{}')
@@ -2252,12 +2334,49 @@ class SystemSettingsForm(forms.ModelForm):
2252
2334
  f"</div>"
2253
2335
  ),
2254
2336
  HTML("</div>"),
2255
- HTML(f"<h6 class='fw-bold my-3'>{s.get('access_security_settings_title', 'Access & Security')}</h6>"),
2337
+ HTML(f"<h6 class='fw-bold my-3'>{s.get('access_security_settings_title', s.get('system_settings_security', 'Access & Security'))}</h6>"),
2256
2338
  Row(
2257
2339
  build_settings_toggle_field(self, 'public_root', css_class='col-lg-6'),
2258
2340
  build_settings_toggle_field(self, 'email_2fa', css_class='col-lg-6'),
2259
2341
  css_class='g-3 mb-3',
2260
2342
  ),
2343
+ HTML(f"<h6 class='fw-bold my-3'>{s.get('root_home_settings_title', 'Home & Public Root Destinations')}</h6>"),
2344
+ Row(
2345
+ Div(Field('home_url_discovered'), css_class='col-lg-6'),
2346
+ Div(Field('home_url', dir='ltr'), css_class='col-lg-6'),
2347
+ ),
2348
+ Row(
2349
+ build_settings_toggle_field(
2350
+ self,
2351
+ 'public_root_split_enabled',
2352
+ css_class=f"col-lg-12 ms-public-root-dependent{' d-none' if not self.initial.get('public_root', False) else ''}",
2353
+ attrs={
2354
+ 'data_public_root_dependent': 'true',
2355
+ 'aria_hidden': 'false' if self.initial.get('public_root', False) else 'true',
2356
+ },
2357
+ ),
2358
+ css_class='g-3 mb-3',
2359
+ ),
2360
+ Row(
2361
+ Div(
2362
+ Field('public_root_url_discovered'),
2363
+ css_class=(
2364
+ "col-lg-6 ms-public-root-split-dependent"
2365
+ f"{' d-none' if not (self.initial.get('public_root', False) and self.initial.get('public_root_split_enabled', False)) else ''}"
2366
+ ),
2367
+ data_public_root_split_dependent='true',
2368
+ aria_hidden='false' if (self.initial.get('public_root', False) and self.initial.get('public_root_split_enabled', False)) else 'true',
2369
+ ),
2370
+ Div(
2371
+ Field('public_root_url', dir='ltr'),
2372
+ css_class=(
2373
+ "col-lg-6 ms-public-root-split-dependent"
2374
+ f"{' d-none' if not (self.initial.get('public_root', False) and self.initial.get('public_root_split_enabled', False)) else ''}"
2375
+ ),
2376
+ data_public_root_split_dependent='true',
2377
+ aria_hidden='false' if (self.initial.get('public_root', False) and self.initial.get('public_root_split_enabled', False)) else 'true',
2378
+ ),
2379
+ ),
2261
2380
  Row(
2262
2381
  build_settings_toggle_field(self, 'public_registration_enabled', css_class='col-lg-12'),
2263
2382
  css_class='g-3 mb-3',
@@ -2284,10 +2403,6 @@ class SystemSettingsForm(forms.ModelForm):
2284
2403
  ),
2285
2404
  Div(
2286
2405
  HTML(f"<div class='mb-3'><span class='badge rounded-pill text-bg-primary'>{s.get('system_setup_step4', 'Step 4: Sidebar')}</span></div>"),
2287
- Row(
2288
- Div(Field('home_url_discovered'), css_class='col-lg-6'),
2289
- Div(Field('home_url', dir='ltr'), css_class='col-lg-6'),
2290
- ),
2291
2406
  Row(
2292
2407
  build_settings_toggle_field(self, 'sidebar_enabled', css_class='col-lg-12'),
2293
2408
  css_class='g-3 mb-3',
@@ -2346,9 +2461,10 @@ class SystemSettingsForm(forms.ModelForm):
2346
2461
  ),
2347
2462
  HTML(f"<h6 class='fw-bold my-3'>{s.get('titlebar_settings_title', 'Titlebar Settings')}</h6>"),
2348
2463
  Row(
2349
- build_settings_toggle_field(self, 'titlebar_show_title', css_class='col-lg-4'),
2350
- build_settings_toggle_field(self, 'titlebar_show_logo', css_class='col-lg-4'),
2351
- build_settings_toggle_field(self, 'titlebar_show_home_button', css_class='col-lg-4'),
2464
+ build_settings_toggle_field(self, 'titlebar_show_title', css_class='col-lg-6 col-xl-3'),
2465
+ build_settings_toggle_field(self, 'titlebar_show_logo', css_class='col-lg-6 col-xl-3'),
2466
+ build_settings_toggle_field(self, 'titlebar_show_home_button', css_class='col-lg-6 col-xl-3'),
2467
+ build_settings_toggle_field(self, 'titlebar_hide_on_public_unauthenticated_index', css_class='col-lg-6 col-xl-3'),
2352
2468
  css_class='g-3 mb-3'
2353
2469
  ),
2354
2470
  Row(
@@ -2502,8 +2618,37 @@ class SystemSettingsForm(forms.ModelForm):
2502
2618
  def clean_home_url(self):
2503
2619
  value = str(self.cleaned_data.get('home_url') or '').strip()
2504
2620
  discovered_value = str(self.cleaned_data.get('home_url_discovered') or '').strip()
2621
+ if self.is_bound and 'home_url' not in self.data and 'home_url_discovered' not in self.data:
2622
+ return (
2623
+ str(getattr(self.instance, 'home_url', '') or '').strip()
2624
+ or str(self.initial.get('home_url') or '').strip()
2625
+ or getattr(settings, 'MICROSYS_CONFIG', {}).get('home_url')
2626
+ or DEFAULT_HOME_URL
2627
+ )
2505
2628
  return value or discovered_value or getattr(settings, 'MICROSYS_CONFIG', {}).get('home_url') or DEFAULT_HOME_URL
2506
2629
 
2630
+ def clean_public_root_url(self):
2631
+ value = str(self.cleaned_data.get('public_root_url') or '').strip()
2632
+ discovered_value = str(self.cleaned_data.get('public_root_url_discovered') or '').strip()
2633
+ home_url = str(self.cleaned_data.get('home_url') or '').strip()
2634
+ if self.is_bound and 'public_root_url' not in self.data and 'public_root_url_discovered' not in self.data:
2635
+ return (
2636
+ str(getattr(self.instance, 'public_root_url', '') or '').strip()
2637
+ or str(self.initial.get('public_root_url') or '').strip()
2638
+ or str(getattr(settings, 'MICROSYS_CONFIG', {}).get('public_root_url') or '').strip()
2639
+ or home_url
2640
+ or getattr(settings, 'MICROSYS_CONFIG', {}).get('home_url')
2641
+ or DEFAULT_HOME_URL
2642
+ )
2643
+ return (
2644
+ value
2645
+ or discovered_value
2646
+ or str(getattr(settings, 'MICROSYS_CONFIG', {}).get('public_root_url') or '').strip()
2647
+ or home_url
2648
+ or getattr(settings, 'MICROSYS_CONFIG', {}).get('home_url')
2649
+ or DEFAULT_HOME_URL
2650
+ )
2651
+
2507
2652
  def clean_sidebar_config(self):
2508
2653
  from microsys.discovery import sanitize_sidebar_config
2509
2654
 
@@ -2581,6 +2726,7 @@ class SystemSettingsForm(forms.ModelForm):
2581
2726
  'languages',
2582
2727
  'translations_override',
2583
2728
  'home_url',
2729
+ 'public_root_url',
2584
2730
  'default_language',
2585
2731
  'default_theme',
2586
2732
  'allowed_themes',
@@ -2589,6 +2735,7 @@ class SystemSettingsForm(forms.ModelForm):
2589
2735
  'default_table_density',
2590
2736
  'email_2fa',
2591
2737
  'public_root',
2738
+ 'public_root_split_enabled',
2592
2739
  'public_registration_enabled',
2593
2740
  'registration_activation_mode',
2594
2741
  'registration_throttle_enabled',
@@ -2627,6 +2774,9 @@ class SystemSettingsForm(forms.ModelForm):
2627
2774
  cleaned['titlebar_show_title'] = bool(titlebar.get('show_title', True))
2628
2775
  cleaned['titlebar_show_logo'] = bool(titlebar.get('show_logo', True))
2629
2776
  cleaned['titlebar_show_home_button'] = bool(titlebar.get('show_home_button', True))
2777
+ cleaned['titlebar_hide_on_public_unauthenticated_index'] = bool(
2778
+ titlebar.get('hide_on_public_unauthenticated_index', False)
2779
+ )
2630
2780
  cleaned['titlebar_home_shape'] = titlebar.get('home_shape', 'circle')
2631
2781
  cleaned['titlebar_title_align'] = titlebar.get('title_align', 'start')
2632
2782
  cleaned['titlebar_title_size'] = titlebar.get('title_size', 'md')
@@ -2646,6 +2796,9 @@ class SystemSettingsForm(forms.ModelForm):
2646
2796
  if default_language not in languages:
2647
2797
  fallback_language = 'en' if 'en' in languages else next(iter(languages), 'en')
2648
2798
  cleaned['default_language'] = fallback_language
2799
+ cleaned['public_root_split_enabled'] = bool(cleaned.get('public_root_split_enabled', False))
2800
+ if not cleaned.get('public_root', False):
2801
+ cleaned['public_root_split_enabled'] = False
2649
2802
 
2650
2803
  sidebar = cleaned.get('sidebar_config')
2651
2804
  if isinstance(sidebar, dict):
@@ -2729,6 +2882,9 @@ class SystemSettingsForm(forms.ModelForm):
2729
2882
  'show_title': bool(cleaned.get('titlebar_show_title', True)),
2730
2883
  'show_logo': bool(cleaned.get('titlebar_show_logo', True)),
2731
2884
  'show_home_button': bool(cleaned.get('titlebar_show_home_button', True)),
2885
+ 'hide_on_public_unauthenticated_index': bool(
2886
+ cleaned.get('titlebar_hide_on_public_unauthenticated_index', False)
2887
+ ),
2732
2888
  'home_shape': cleaned.get('titlebar_home_shape', 'circle'),
2733
2889
  'title_align': cleaned.get('titlebar_title_align', 'start'),
2734
2890
  'title_size': cleaned.get('titlebar_title_size', 'md'),
@@ -2764,6 +2920,8 @@ class SystemSettingsForm(forms.ModelForm):
2764
2920
  instance.allow_user_theme_override = bool(self.cleaned_data.get('allow_user_theme_override', True))
2765
2921
  instance.allow_user_language_override = bool(self.cleaned_data.get('allow_user_language_override', True))
2766
2922
  instance.titlebar_config = self.cleaned_data.get('titlebar_config', default_titlebar_config())
2923
+ instance.public_root_split_enabled = bool(self.cleaned_data.get('public_root_split_enabled', False))
2924
+ instance.public_root_url = str(self.cleaned_data.get('public_root_url') or '').strip()
2767
2925
  imported = getattr(self, '_imported_settings', {}) or {}
2768
2926
  if imported.get('logo') and not self.files.get('logo'):
2769
2927
  instance.logo = str(imported.get('logo'))
@@ -71,9 +71,10 @@ microsys_settings(globals())"""
71
71
  # ─────────────────────────────────────────────────
72
72
  # Check MIDDLEWARE
73
73
  # ─────────────────────────────────────────────────
74
- middleware_path = 'microsys.middleware.ActivityLogMiddleware'
74
+ new_path = 'microsys.middleware.MicrosysMiddleware'
75
+ old_path = 'microsys.middleware.ActivityLogMiddleware'
75
76
  self.stdout.write('\n📋 MIDDLEWARE: ', ending='')
76
- if middleware_path in settings.MIDDLEWARE:
77
+ if new_path in settings.MIDDLEWARE or old_path in settings.MIDDLEWARE:
77
78
  self.stdout.write(self.style.SUCCESS('✓ OK'))
78
79
  else:
79
80
  self.stdout.write(self.style.ERROR('✗ MISSING'))