django-microsys 2.2.5__tar.gz → 2.2.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 (295) hide show
  1. django_microsys-2.2.6/LICENSE +105 -0
  2. {django_microsys-2.2.5 → django_microsys-2.2.6}/PKG-INFO +4 -3
  3. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/PKG-INFO +4 -3
  4. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/SOURCES.txt +20 -3
  5. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/requires.txt +1 -0
  6. django_microsys-2.2.6/microsys/VERSION +1 -0
  7. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/constants.py +13 -0
  8. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/context_processors.py +25 -8
  9. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/fonts.py +49 -10
  10. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/forms.py +122 -0
  11. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/middleware.py +12 -41
  12. django_microsys-2.2.6/microsys/migrations/0008_user_device_presence_history.py +85 -0
  13. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/models.py +89 -0
  14. django_microsys-2.2.6/microsys/session_history.py +319 -0
  15. django_microsys-2.2.6/microsys/static/microsys/fonts/Alexandria-Bold.woff2 +0 -0
  16. django_microsys-2.2.6/microsys/static/microsys/fonts/Alexandria-Medium.woff2 +0 -0
  17. django_microsys-2.2.6/microsys/static/microsys/fonts/Alexandria-Regular.woff2 +0 -0
  18. django_microsys-2.2.6/microsys/static/microsys/fonts/Changa-Bold.woff2 +0 -0
  19. django_microsys-2.2.6/microsys/static/microsys/fonts/Changa-Medium.woff2 +0 -0
  20. django_microsys-2.2.6/microsys/static/microsys/fonts/Changa-Regular.woff2 +0 -0
  21. django_microsys-2.2.6/microsys/static/microsys/fonts/MarkaziText-Bold.woff2 +0 -0
  22. django_microsys-2.2.6/microsys/static/microsys/fonts/MarkaziText-Medium.woff2 +0 -0
  23. django_microsys-2.2.6/microsys/static/microsys/fonts/MarkaziText-Regular.woff2 +0 -0
  24. django_microsys-2.2.6/microsys/static/microsys/fonts/ReadexPro-Bold.woff2 +0 -0
  25. django_microsys-2.2.6/microsys/static/microsys/fonts/ReadexPro-Medium.woff2 +0 -0
  26. django_microsys-2.2.6/microsys/static/microsys/fonts/ReadexPro-Regular.woff2 +0 -0
  27. django_microsys-2.2.6/microsys/static/microsys/helpers/tooltip/css/main.css +87 -0
  28. django_microsys-2.2.6/microsys/static/microsys/helpers/tooltip/js/main.js +265 -0
  29. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/buttons.css +40 -0
  30. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/main.css +19 -18
  31. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/options.css +19 -0
  32. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/system_setup.css +20 -5
  33. django_microsys-2.2.6/microsys/static/microsys/main/css/template_cleanup.css +267 -0
  34. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/titlebar.css +37 -0
  35. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/base_head.js +4 -1
  36. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/options.js +4 -2
  37. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/system_setup.js +24 -1
  38. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/css/main.css +0 -8
  39. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/js/main.js +7 -13
  40. django_microsys-2.2.6/microsys/static/microsys/themes/css/aether.css +1310 -0
  41. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/dark.css +33 -9
  42. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/gothic.css +23 -0
  43. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/mono.css +3 -0
  44. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/neon.css +26 -0
  45. django_microsys-2.2.6/microsys/static/microsys/themes/css/prism.css +1195 -0
  46. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/retro.css +18 -0
  47. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/tutorial/css/main.css +3 -3
  48. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/tutorial/js/main.js +3 -3
  49. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/css/permissions.css +5 -2
  50. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/css/user_hub.css +0 -45
  51. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/manage_users.js +75 -0
  52. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/user_hub.js +1 -32
  53. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/tables.py +11 -0
  54. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/base.html +13 -9
  55. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/titlebar.html +2 -0
  56. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sidebar/main.html +2 -2
  57. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/manage_users.html +1 -1
  58. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/user_detail_modal.html +8 -0
  59. django_microsys-2.2.6/microsys/templates/microsys/users/user_report_modal.html +202 -0
  60. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/themes.py +14 -0
  61. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/translations.py +158 -0
  62. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/trust.py +13 -30
  63. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/urls.py +2 -0
  64. django_microsys-2.2.6/microsys/user_reports.py +282 -0
  65. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/utils.py +26 -2
  66. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/__init__.py +2 -0
  67. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/profile.py +30 -22
  68. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/users.py +40 -0
  69. {django_microsys-2.2.5 → django_microsys-2.2.6}/pyproject.toml +3 -2
  70. django_microsys-2.2.5/LICENSE +0 -65
  71. django_microsys-2.2.5/microsys/VERSION +0 -1
  72. django_microsys-2.2.5/microsys/static/microsys/fonts/shabwa-bold.woff2 +0 -0
  73. django_microsys-2.2.5/microsys/static/microsys/fonts/shabwa-medium.woff2 +0 -0
  74. django_microsys-2.2.5/microsys/static/microsys/fonts/shabwa-regular.woff2 +0 -0
  75. django_microsys-2.2.5/microsys/static/microsys/main/css/template_cleanup.css +0 -121
  76. {django_microsys-2.2.5 → django_microsys-2.2.6}/MANIFEST.in +0 -0
  77. {django_microsys-2.2.5 → django_microsys-2.2.6}/README.md +0 -0
  78. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/dependency_links.txt +0 -0
  79. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/entry_points.txt +0 -0
  80. {django_microsys-2.2.5 → django_microsys-2.2.6}/django_microsys.egg-info/top_level.txt +0 -0
  81. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/__init__.py +0 -0
  82. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/__main__.py +0 -0
  83. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/admin.py +0 -0
  84. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/api.py +0 -0
  85. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/apps.py +0 -0
  86. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/cli.py +0 -0
  87. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/discovery.py +0 -0
  88. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/fetcher.py +0 -0
  89. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/filters.py +0 -0
  90. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/formats/__init__.py +0 -0
  91. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/formats/ar/__init__.py +0 -0
  92. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/formats/ar/formats.py +0 -0
  93. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/formats/en/__init__.py +0 -0
  94. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/formats/en/formats.py +0 -0
  95. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/guards.py +0 -0
  96. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/__init__.py +0 -0
  97. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/microsys_check.py +0 -0
  98. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/microsys_settings.py +0 -0
  99. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/microsys_setup.py +0 -0
  100. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/migrator.py +0 -0
  101. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/management/commands/seed_activity_log.py +0 -0
  102. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/managers.py +0 -0
  103. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0001_initial.py +0 -0
  104. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0002_public_registration.py +0 -0
  105. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0003_public_root_split.py +0 -0
  106. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0004_client_ip_and_trusted_devices.py +0 -0
  107. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0005_systemsettings_allow_user_font_override_and_more.py +0 -0
  108. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0006_systemsettings_navbar_config.py +0 -0
  109. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/0007_systemsettings_prevent_multiple_active_sessions.py +0 -0
  110. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/migrations/__init__.py +0 -0
  111. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/navbar.py +0 -0
  112. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/patches.py +0 -0
  113. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/registration.py +0 -0
  114. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold.py +0 -0
  115. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/README.md.tmpl +0 -0
  116. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/__init__.py.tmpl +0 -0
  117. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/apps.py.tmpl +0 -0
  118. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/filters.py.tmpl +0 -0
  119. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/forms.py.tmpl +0 -0
  120. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/migrations/__init__.py.tmpl +0 -0
  121. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/models.py.tmpl +0 -0
  122. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/tables.py.tmpl +0 -0
  123. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/templates/example_record_confirm_delete.html.tmpl +0 -0
  124. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/templates/example_record_detail.html.tmpl +0 -0
  125. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/templates/example_record_form.html.tmpl +0 -0
  126. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/templates/example_record_list.html.tmpl +0 -0
  127. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/tests/__init__.py.tmpl +0 -0
  128. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/tests/test_app.py.tmpl +0 -0
  129. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/translations.py.tmpl +0 -0
  130. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/urls.py.tmpl +0 -0
  131. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/app/views.py.tmpl +0 -0
  132. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/.nginx/nginx.conf.tmpl +0 -0
  133. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/.secrets/.env.tmpl +0 -0
  134. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/Dockerfile.tmpl +0 -0
  135. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/README.md.tmpl +0 -0
  136. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/compose.dev.yml.tmpl +0 -0
  137. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/compose.yml.tmpl +0 -0
  138. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/dockerignore.tmpl +0 -0
  139. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/docs/README.md.tmpl +0 -0
  140. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/entrypoint.sh.tmpl +0 -0
  141. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/gitattributes.tmpl +0 -0
  142. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/gitignore.tmpl +0 -0
  143. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/gunicorn.py.tmpl +0 -0
  144. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/manage.py.tmpl +0 -0
  145. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/__init__.py.tmpl +0 -0
  146. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/asgi.py.tmpl +0 -0
  147. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/celery.py.tmpl +0 -0
  148. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/settings.py.tmpl +0 -0
  149. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/urls.py.tmpl +0 -0
  150. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/package/wsgi.py.tmpl +0 -0
  151. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/req.txt.tmpl +0 -0
  152. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/start.ps1.tmpl +0 -0
  153. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/start.sh.tmpl +0 -0
  154. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/tests/__init__.py.tmpl +0 -0
  155. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/tests/test_scaffold.py.tmpl +0 -0
  156. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/scaffold_templates/project/tools/smtp_relay.py.tmpl +0 -0
  157. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/signals.py +0 -0
  158. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap-icons.css +0 -0
  159. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap-icons.woff +0 -0
  160. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap-icons.woff2 +0 -0
  161. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.bundle.min.js +0 -0
  162. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.bundle.min.js.map +0 -0
  163. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.min.css +0 -0
  164. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.min.css.map +0 -0
  165. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.rtl.min.css +0 -0
  166. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/bootstrap/bootstrap.rtl.min.css.map +0 -0
  167. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/favicon.ico +0 -0
  168. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/img/base_logo.webp +0 -0
  169. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/img/default_profile.webp +0 -0
  170. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/img/login_logo.webp +0 -0
  171. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/accessibility/css/main.css +0 -0
  172. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/accessibility/js/main.js +0 -0
  173. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/activitylog/js/main.js +0 -0
  174. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/fonts/TwemojiCountryFlags.woff2 +0 -0
  175. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/fonts/cairo-bold.woff2 +0 -0
  176. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/fonts/cairo-medium.woff2 +0 -0
  177. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/fonts/cairo-regular.woff2 +0 -0
  178. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/forms/css/file_field.css +0 -0
  179. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/forms/css/form_actions.css +0 -0
  180. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/forms/css/form_fields.css +0 -0
  181. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/forms/js/file_field.js +0 -0
  182. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/forms/js/filter_form.js +0 -0
  183. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/autofill/js/main.js +0 -0
  184. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/context_menu/css/main.css +0 -0
  185. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/context_menu/js/main.js +0 -0
  186. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/context_menu/js/section_manager.js +0 -0
  187. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/dynamic_modal/js/main.js +0 -0
  188. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/prevent_double_submit.js +0 -0
  189. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/scan_link/js/main.js +0 -0
  190. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/scan_link/js/scan_button.js +0 -0
  191. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/helpers/wizard/js/main.js +0 -0
  192. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/language/css/main.css +0 -0
  193. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/language/js/main.js +0 -0
  194. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/language/js/translations.js +0 -0
  195. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/dropdowns.css +0 -0
  196. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/index_cards.css +0 -0
  197. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/navbar.css +0 -0
  198. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/pagination.css +0 -0
  199. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/selectors.css +0 -0
  200. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/css/tables.css +0 -0
  201. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/base_runtime.js +0 -0
  202. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/navbar.js +0 -0
  203. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/selectors.js +0 -0
  204. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/main/js/tables.js +0 -0
  205. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sections/js/manage_sections.js +0 -0
  206. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/css/reorder.css +0 -0
  207. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/css/theme_picker.css +0 -0
  208. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/js/preload.js +0 -0
  209. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/js/reorder.js +0 -0
  210. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/sidebar/js/theme_picker.js +0 -0
  211. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/blue.css +0 -0
  212. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/gold.css +0 -0
  213. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/green.css +0 -0
  214. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/light.css +0 -0
  215. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/css/red.css +0 -0
  216. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/themes/js/main.js +0 -0
  217. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/tutorial/js/driver.js +0 -0
  218. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/css/login.css +0 -0
  219. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/css/profile.css +0 -0
  220. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/login.js +0 -0
  221. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/permissions.js +0 -0
  222. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/profile_2fa.js +0 -0
  223. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/profile_image_widget.js +0 -0
  224. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/microsys/users/js/twofa_verify.js +0 -0
  225. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/vanillajs-datepicker/datepicker-bs5.min.css +0 -0
  226. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/static/vanillajs-datepicker/datepicker.min.js +0 -0
  227. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/bootstrap5/layout/field_file.html +0 -0
  228. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/2fa/verify.html +0 -0
  229. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/activitylog/activity_log.html +0 -0
  230. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/activitylog/activity_log_detail_modal.html +0 -0
  231. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/form_base.html +0 -0
  232. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/assets_head.html +0 -0
  233. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/assets_scripts.html +0 -0
  234. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/crispy_file_field.html +0 -0
  235. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/file_input.html +0 -0
  236. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/filter_assets_head.html +0 -0
  237. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/forms/filter_assets_scripts.html +0 -0
  238. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/dynamic_modal.html +0 -0
  239. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/dynamic_modal_combined.html +0 -0
  240. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/dynamic_modal_detail.html +0 -0
  241. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/dynamic_modal_form.html +0 -0
  242. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/dynamic_modal_list.html +0 -0
  243. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/helpers/micro_context_menu.html +0 -0
  244. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/font_previews.html +0 -0
  245. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/font_settings_matrix.html +0 -0
  246. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/language_catalog_editor.html +0 -0
  247. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/language_fonts_editor.html +0 -0
  248. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/language_previews.html +0 -0
  249. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/navbar.html +0 -0
  250. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/navbar_builder.html +0 -0
  251. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/navbar_mode_previews.html +0 -0
  252. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/options.html +0 -0
  253. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/sidebar_builder.html +0 -0
  254. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/sidebar_density_previews.html +0 -0
  255. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/sidebar_items.html +0 -0
  256. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/system_names_editor.html +0 -0
  257. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/system_setup.html +0 -0
  258. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/table_density_previews.html +0 -0
  259. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/theme_previews.html +0 -0
  260. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/theme_settings_matrix.html +0 -0
  261. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/translation_matrix_editor.html +0 -0
  262. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/includes/tutorial.html +0 -0
  263. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/list_base.html +0 -0
  264. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/registration/pending.html +0 -0
  265. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/scopes/scope_actions.html +0 -0
  266. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/scopes/scope_form.html +0 -0
  267. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/scopes/scope_manager.html +0 -0
  268. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sections/manage_sections.html +0 -0
  269. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sections/subsection_select.html +0 -0
  270. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sidebar/auto.html +0 -0
  271. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sidebar/extra_groups.html +0 -0
  272. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/sidebar/tree.html +0 -0
  273. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/tables/table.html +0 -0
  274. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/grouped_permissions.html +0 -0
  275. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/profile.html +0 -0
  276. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/profile_image_widget.html +0 -0
  277. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/microsys/users/user_hub.html +0 -0
  278. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/registration/email/verify_registration.txt +0 -0
  279. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/registration/login.html +0 -0
  280. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/registration/register.html +0 -0
  281. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/registration/register_sent.html +0 -0
  282. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templates/registration/register_verify.html +0 -0
  283. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templatetags/__init__.py +0 -0
  284. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templatetags/microsys_tags.py +0 -0
  285. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templatetags/microsys_translation.py +0 -0
  286. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/templatetags/sidebar_tags.py +0 -0
  287. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/activitylog.py +0 -0
  288. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/general.py +0 -0
  289. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/registration.py +0 -0
  290. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/scopes.py +0 -0
  291. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/sections.py +0 -0
  292. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/sidebar.py +0 -0
  293. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/views/twofa.py +0 -0
  294. {django_microsys-2.2.5 → django_microsys-2.2.6}/microsys/widgets.py +0 -0
  295. {django_microsys-2.2.5 → django_microsys-2.2.6}/setup.cfg +0 -0
@@ -0,0 +1,105 @@
1
+ # MIT License
2
+
3
+ Software: django-microsys
4
+ Repository: https://github.com/debeski/django-microsys
5
+ Author: DeBeski (micro)
6
+ Website: https://github.com/debeski
7
+ Copyright (c) 2026
8
+
9
+ ---
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+
29
+ ---
30
+
31
+ # THIRD-PARTY NOTICES
32
+
33
+ This Software utilizes the following open-source packages. By using this Software,
34
+ you agree to the terms of their respective licenses:
35
+
36
+ ## Python Runtime Dependencies
37
+ The following Python dependencies are declared by the main `django-microsys`
38
+ package and should retain their upstream license notices.
39
+
40
+ - Python (3.9+) - Python Software Foundation License (PSFL)
41
+ https://docs.python.org/3/license.html
42
+ - Django (5.1+) - BSD-3-Clause License
43
+ https://github.com/django/django/blob/main/LICENSE
44
+ - django-crispy-forms - MIT License
45
+ https://github.com/django-crispy-forms/django-crispy-forms/blob/main/LICENSE.txt
46
+ - crispy-bootstrap5 - MIT License
47
+ https://github.com/django-crispy-forms/crispy-bootstrap5/blob/main/LICENSE
48
+ - django-tables2 - BSD-2-Clause License
49
+ https://github.com/jieter/django-tables2/blob/master/LICENSE
50
+ - django-filter - BSD-3-Clause License
51
+ https://github.com/carltongibson/django-filter/blob/main/LICENSE
52
+ - psutil - BSD-3-Clause License
53
+ https://github.com/giampaolo/psutil/blob/master/LICENSE
54
+ - pyotp - MIT License
55
+ https://github.com/pyauth/pyotp/blob/main/LICENSE
56
+ - qrcode - BSD-3-Clause License
57
+ https://github.com/lincolnloop/python-qrcode/blob/main/LICENSE
58
+ - Pillow - HPND (Pillow License)
59
+ https://github.com/python-pillow/Pillow/blob/main/LICENSE
60
+ - Babel - BSD-3-Clause License
61
+ https://github.com/python-babel/babel/blob/master/LICENSE
62
+ - cryptography - Apache-2.0 OR BSD-3-Clause
63
+ https://github.com/pyca/cryptography/blob/main/LICENSE
64
+ - openpyxl - MIT License
65
+ https://foss.heptapod.net/openpyxl/openpyxl/-/blob/branch/default/LICENCE.rst
66
+
67
+ ## Bundled Frontend Assets
68
+ The following third-party frontend assets are bundled under `microsys/static/`
69
+ and should also retain their upstream license notices.
70
+
71
+ - Bootstrap - MIT License
72
+ https://github.com/twbs/bootstrap/blob/main/LICENSE
73
+ - Bootstrap Icons - MIT License
74
+ https://github.com/twbs/icons/blob/main/LICENSE
75
+ - vanillajs-datepicker - MIT License
76
+ https://github.com/mymth/vanillajs-datepicker/blob/master/LICENSE
77
+ - Driver.js - MIT License
78
+ https://github.com/nilbuild/driver.js/blob/master/license
79
+
80
+ ## Bundled Font Assets
81
+ The following bundled font assets should also retain their upstream license
82
+ notices and attribution where applicable.
83
+
84
+ - Cairo - SIL Open Font License 1.1
85
+ https://github.com/Gue3bara/Cairo/blob/main/OFL.txt
86
+ - Alexandria - SIL Open Font License 1.1
87
+ https://github.com/Gue3bara/Alexandria/blob/master/OFL.txt
88
+ - Changa - SIL Open Font License 1.1
89
+ https://github.com/google/fonts/blob/main/ofl/changa/OFL.txt
90
+ - Markazi Text - SIL Open Font License 1.1
91
+ https://github.com/google/fonts/blob/main/ofl/markazitext/OFL.txt
92
+ - Readex Pro - SIL Open Font License 1.1
93
+ https://github.com/google/fonts/blob/main/ofl/readexpro/OFL.txt
94
+ - Twemoji Country Flags / Twemoji Mozilla derived asset
95
+ Upstream references:
96
+ https://github.com/PasteBar/country-flags-emoji-polyfill-builder
97
+ https://github.com/mozilla/twemoji-colr/blob/master/LICENSE.md
98
+ https://github.com/twitter/twemoji/blob/master/LICENSE-GRAPHICS
99
+
100
+ ## Optional Package Note
101
+ This repository also includes optional packages under `optional_packages/`
102
+ with their own dependency trees, such as `django-microsys-sso` and
103
+ `django-microsys-sso-client`. If you distribute those optional packages, keep
104
+ their dependency notices aligned with their own `pyproject.toml` metadata as
105
+ well.
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django_microsys
3
- Version: 2.2.5
3
+ Version: 2.2.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
- License: NON-COMMERCIAL
6
+ License: MIT
7
7
  Project-URL: Homepage, https://github.com/debeski/django-microsys
8
8
  Keywords: django,microsys,permissions,authentication
9
9
  Classifier: Framework :: Django
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
- Classifier: License :: Other/Proprietary License
17
+ Classifier: License :: OSI Approved :: MIT License
18
18
  Classifier: Operating System :: OS Independent
19
19
  Requires-Python: >=3.11
20
20
  Description-Content-Type: text/markdown
@@ -30,6 +30,7 @@ Requires-Dist: qrcode>=8.2
30
30
  Requires-Dist: pillow>=11.0
31
31
  Requires-Dist: babel>=2.1
32
32
  Requires-Dist: cryptography>=42.0
33
+ Requires-Dist: openpyxl>=3.1
33
34
  Provides-Extra: sso
34
35
  Requires-Dist: django-microsys-sso>=0.1.0; extra == "sso"
35
36
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-microsys
3
- Version: 2.2.5
3
+ Version: 2.2.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
- License: NON-COMMERCIAL
6
+ License: MIT
7
7
  Project-URL: Homepage, https://github.com/debeski/django-microsys
8
8
  Keywords: django,microsys,permissions,authentication
9
9
  Classifier: Framework :: Django
@@ -14,7 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
- Classifier: License :: Other/Proprietary License
17
+ Classifier: License :: OSI Approved :: MIT License
18
18
  Classifier: Operating System :: OS Independent
19
19
  Requires-Python: >=3.11
20
20
  Description-Content-Type: text/markdown
@@ -30,6 +30,7 @@ Requires-Dist: qrcode>=8.2
30
30
  Requires-Dist: pillow>=11.0
31
31
  Requires-Dist: babel>=2.1
32
32
  Requires-Dist: cryptography>=42.0
33
+ Requires-Dist: openpyxl>=3.1
33
34
  Provides-Extra: sso
34
35
  Requires-Dist: django-microsys-sso>=0.1.0; extra == "sso"
35
36
 
@@ -30,12 +30,14 @@ microsys/navbar.py
30
30
  microsys/patches.py
31
31
  microsys/registration.py
32
32
  microsys/scaffold.py
33
+ microsys/session_history.py
33
34
  microsys/signals.py
34
35
  microsys/tables.py
35
36
  microsys/themes.py
36
37
  microsys/translations.py
37
38
  microsys/trust.py
38
39
  microsys/urls.py
40
+ microsys/user_reports.py
39
41
  microsys/utils.py
40
42
  microsys/widgets.py
41
43
  microsys/formats/__init__.py
@@ -56,6 +58,7 @@ microsys/migrations/0004_client_ip_and_trusted_devices.py
56
58
  microsys/migrations/0005_systemsettings_allow_user_font_override_and_more.py
57
59
  microsys/migrations/0006_systemsettings_navbar_config.py
58
60
  microsys/migrations/0007_systemsettings_prevent_multiple_active_sessions.py
61
+ microsys/migrations/0008_user_device_presence_history.py
59
62
  microsys/migrations/__init__.py
60
63
  microsys/scaffold_templates/app/README.md.tmpl
61
64
  microsys/scaffold_templates/app/__init__.py.tmpl
@@ -115,13 +118,22 @@ microsys/static/img/login_logo.webp
115
118
  microsys/static/microsys/accessibility/css/main.css
116
119
  microsys/static/microsys/accessibility/js/main.js
117
120
  microsys/static/microsys/activitylog/js/main.js
121
+ microsys/static/microsys/fonts/Alexandria-Bold.woff2
122
+ microsys/static/microsys/fonts/Alexandria-Medium.woff2
123
+ microsys/static/microsys/fonts/Alexandria-Regular.woff2
124
+ microsys/static/microsys/fonts/Changa-Bold.woff2
125
+ microsys/static/microsys/fonts/Changa-Medium.woff2
126
+ microsys/static/microsys/fonts/Changa-Regular.woff2
127
+ microsys/static/microsys/fonts/MarkaziText-Bold.woff2
128
+ microsys/static/microsys/fonts/MarkaziText-Medium.woff2
129
+ microsys/static/microsys/fonts/MarkaziText-Regular.woff2
130
+ microsys/static/microsys/fonts/ReadexPro-Bold.woff2
131
+ microsys/static/microsys/fonts/ReadexPro-Medium.woff2
132
+ microsys/static/microsys/fonts/ReadexPro-Regular.woff2
118
133
  microsys/static/microsys/fonts/TwemojiCountryFlags.woff2
119
134
  microsys/static/microsys/fonts/cairo-bold.woff2
120
135
  microsys/static/microsys/fonts/cairo-medium.woff2
121
136
  microsys/static/microsys/fonts/cairo-regular.woff2
122
- microsys/static/microsys/fonts/shabwa-bold.woff2
123
- microsys/static/microsys/fonts/shabwa-medium.woff2
124
- microsys/static/microsys/fonts/shabwa-regular.woff2
125
137
  microsys/static/microsys/forms/css/file_field.css
126
138
  microsys/static/microsys/forms/css/form_actions.css
127
139
  microsys/static/microsys/forms/css/form_fields.css
@@ -135,6 +147,8 @@ microsys/static/microsys/helpers/context_menu/js/section_manager.js
135
147
  microsys/static/microsys/helpers/dynamic_modal/js/main.js
136
148
  microsys/static/microsys/helpers/scan_link/js/main.js
137
149
  microsys/static/microsys/helpers/scan_link/js/scan_button.js
150
+ microsys/static/microsys/helpers/tooltip/css/main.css
151
+ microsys/static/microsys/helpers/tooltip/js/main.js
138
152
  microsys/static/microsys/helpers/wizard/js/main.js
139
153
  microsys/static/microsys/language/css/main.css
140
154
  microsys/static/microsys/language/js/main.js
@@ -166,6 +180,7 @@ microsys/static/microsys/sidebar/js/main.js
166
180
  microsys/static/microsys/sidebar/js/preload.js
167
181
  microsys/static/microsys/sidebar/js/reorder.js
168
182
  microsys/static/microsys/sidebar/js/theme_picker.js
183
+ microsys/static/microsys/themes/css/aether.css
169
184
  microsys/static/microsys/themes/css/blue.css
170
185
  microsys/static/microsys/themes/css/dark.css
171
186
  microsys/static/microsys/themes/css/gold.css
@@ -174,6 +189,7 @@ microsys/static/microsys/themes/css/green.css
174
189
  microsys/static/microsys/themes/css/light.css
175
190
  microsys/static/microsys/themes/css/mono.css
176
191
  microsys/static/microsys/themes/css/neon.css
192
+ microsys/static/microsys/themes/css/prism.css
177
193
  microsys/static/microsys/themes/css/red.css
178
194
  microsys/static/microsys/themes/css/retro.css
179
195
  microsys/static/microsys/themes/js/main.js
@@ -249,6 +265,7 @@ microsys/templates/microsys/users/profile.html
249
265
  microsys/templates/microsys/users/profile_image_widget.html
250
266
  microsys/templates/microsys/users/user_detail_modal.html
251
267
  microsys/templates/microsys/users/user_hub.html
268
+ microsys/templates/microsys/users/user_report_modal.html
252
269
  microsys/templates/registration/login.html
253
270
  microsys/templates/registration/register.html
254
271
  microsys/templates/registration/register_sent.html
@@ -9,6 +9,7 @@ qrcode>=8.2
9
9
  pillow>=11.0
10
10
  babel>=2.1
11
11
  cryptography>=42.0
12
+ openpyxl>=3.1
12
13
 
13
14
  [sso]
14
15
  django-microsys-sso>=0.1.0
@@ -0,0 +1 @@
1
+ 2.2.6
@@ -56,6 +56,19 @@ TITLEBAR_SURFACE_CHOICES = (
56
56
  ('glass', 'Glass'),
57
57
  )
58
58
  TITLEBAR_SURFACE_VALUES = {value for value, _label in TITLEBAR_SURFACE_CHOICES}
59
+ TITLEBAR_LOGO_TREATMENT_CHOICES = (
60
+ ('none', 'None'),
61
+ ('plate', 'Plate'),
62
+ ('halo', 'Halo'),
63
+ ('contrast', 'Contrast'),
64
+ )
65
+ TITLEBAR_LOGO_TREATMENT_VALUES = {value for value, _label in TITLEBAR_LOGO_TREATMENT_CHOICES}
66
+ TITLEBAR_LOGO_TREATMENT_SHAPE_CHOICES = (
67
+ ('soft', 'Soft'),
68
+ ('pill', 'Pill'),
69
+ ('square', 'Square'),
70
+ )
71
+ TITLEBAR_LOGO_TREATMENT_SHAPE_VALUES = {value for value, _label in TITLEBAR_LOGO_TREATMENT_SHAPE_CHOICES}
59
72
 
60
73
  REGISTRATION_ACTIVATION_AUTO_LOGIN = 'auto_login_after_verify'
61
74
  REGISTRATION_ACTIVATION_PENDING_APPROVAL = 'verified_pending_approval'
@@ -356,10 +356,22 @@ def microsys_context(request):
356
356
  context['titlebar'],
357
357
  )
358
358
  # 8. Font Resolution
359
- from .fonts import generate_font_face_css, get_builtin_fonts
359
+ from .fonts import (
360
+ DEFAULT_FONT_SLUG,
361
+ generate_font_face_css,
362
+ get_builtin_fonts,
363
+ get_default_font_family,
364
+ get_font_by_slug,
365
+ )
366
+ builtin_fonts = get_builtin_fonts()
360
367
  allowed_fonts = normalize_allowed_fonts(final_config.get('allowed_fonts'))
361
368
  context['font_face_css'] = generate_font_face_css(allowed_fonts)
362
- context['option_fonts'] = [font for font in get_builtin_fonts() if font.get('slug') in allowed_fonts]
369
+ context['default_font_family'] = get_default_font_family()
370
+ context['font_families'] = {
371
+ font['slug']: font['family']
372
+ for font in builtin_fonts
373
+ }
374
+ context['option_fonts'] = [font for font in builtin_fonts if font.get('slug') in allowed_fonts]
363
375
 
364
376
  allow_user_font_override = bool(final_config.get('allow_user_font_override', True))
365
377
  default_fonts_by_lang = final_config.get('default_fonts', {})
@@ -372,16 +384,21 @@ def microsys_context(request):
372
384
  active_font = default_fonts_by_lang.get(current_lang)
373
385
 
374
386
  if not active_font or active_font not in allowed_fonts:
375
- # Global fallback based on current language
376
- active_font = 'shabwa' if current_lang == 'ar' else 'cairo'
377
-
378
- # Ensure active_font is valid, else hard fallback to shabwa
387
+ active_font = DEFAULT_FONT_SLUG
388
+
389
+ # Ensure active_font is valid, else hard fallback to cairo
379
390
  if active_font not in allowed_fonts and allowed_fonts:
380
391
  active_font = allowed_fonts[0]
381
392
  elif not active_font:
382
- active_font = 'shabwa'
383
-
393
+ active_font = DEFAULT_FONT_SLUG
394
+
395
+ active_font_config = get_font_by_slug(active_font) if active_font else None
384
396
  context['active_font'] = active_font
397
+ context['active_font_family'] = (
398
+ active_font_config.get('family')
399
+ if active_font_config
400
+ else get_default_font_family()
401
+ )
385
402
  context['font_picker_enabled'] = bool(allow_user_font_override and len(allowed_fonts) > 1)
386
403
 
387
404
  return context
@@ -2,18 +2,11 @@ from functools import lru_cache
2
2
  from django.conf import settings
3
3
  from django.templatetags.static import static
4
4
 
5
+ DEFAULT_FONT_SLUG = 'cairo'
6
+ DEFAULT_FONT_FAMILY = 'Cairo'
7
+
5
8
  # Registry for built-in fonts provided by the package
6
9
  _FONT_REGISTRY = (
7
- {
8
- 'slug': 'shabwa',
9
- 'family': 'Shabwa',
10
- 'label': 'Shabwa',
11
- 'variants': [
12
- {'weight': 400, 'path': 'microsys/fonts/shabwa-regular.woff2'},
13
- {'weight': 600, 'path': 'microsys/fonts/shabwa-medium.woff2'},
14
- {'weight': 800, 'path': 'microsys/fonts/shabwa-bold.woff2'},
15
- ]
16
- },
17
10
  {
18
11
  'slug': 'cairo',
19
12
  'family': 'Cairo',
@@ -24,6 +17,46 @@ _FONT_REGISTRY = (
24
17
  {'weight': 800, 'path': 'microsys/fonts/cairo-bold.woff2'},
25
18
  ]
26
19
  },
20
+ {
21
+ 'slug': 'changa',
22
+ 'family': 'Changa',
23
+ 'label': 'Changa',
24
+ 'variants': [
25
+ {'weight': 400, 'path': 'microsys/fonts/Changa-Regular.woff2'},
26
+ {'weight': 600, 'path': 'microsys/fonts/Changa-Medium.woff2'},
27
+ {'weight': 800, 'path': 'microsys/fonts/Changa-Bold.woff2'},
28
+ ]
29
+ },
30
+ # {
31
+ # 'slug': 'markazi_text',
32
+ # 'family': 'Markazi Text',
33
+ # 'label': 'Markazi Text',
34
+ # 'variants': [
35
+ # {'weight': 400, 'path': 'microsys/fonts/MarkaziText-Regular.woff2'},
36
+ # {'weight': 600, 'path': 'microsys/fonts/MarkaziText-Medium.woff2'},
37
+ # {'weight': 800, 'path': 'microsys/fonts/MarkaziText-Bold.woff2'},
38
+ # ]
39
+ # },
40
+ {
41
+ 'slug': 'readex_pro',
42
+ 'family': 'Readex Pro',
43
+ 'label': 'Readex Pro',
44
+ 'variants': [
45
+ {'weight': 400, 'path': 'microsys/fonts/ReadexPro-Regular.woff2'},
46
+ {'weight': 600, 'path': 'microsys/fonts/ReadexPro-Medium.woff2'},
47
+ {'weight': 800, 'path': 'microsys/fonts/ReadexPro-Bold.woff2'},
48
+ ]
49
+ },
50
+ {
51
+ 'slug': 'alexandria',
52
+ 'family': 'Alexandria',
53
+ 'label': 'Alexandria',
54
+ 'variants': [
55
+ {'weight': 400, 'path': 'microsys/fonts/Alexandria-Regular.woff2'},
56
+ {'weight': 600, 'path': 'microsys/fonts/Alexandria-Medium.woff2'},
57
+ {'weight': 800, 'path': 'microsys/fonts/Alexandria-Bold.woff2'},
58
+ ]
59
+ },
27
60
  )
28
61
 
29
62
  @lru_cache(maxsize=1)
@@ -42,6 +75,12 @@ def get_font_by_slug(slug):
42
75
  return font
43
76
  return None
44
77
 
78
+ def get_default_font_family():
79
+ default_font = get_font_by_slug(DEFAULT_FONT_SLUG)
80
+ if default_font:
81
+ return default_font['family']
82
+ return DEFAULT_FONT_FAMILY
83
+
45
84
  def generate_font_face_css(allowed_fonts=None):
46
85
  """
47
86
  Generates the @font-face CSS block for all allowed fonts.
@@ -47,6 +47,10 @@ from .constants import (
47
47
  TITLEBAR_HEIGHT_VALUES,
48
48
  TITLEBAR_HOME_SHAPE_CHOICES,
49
49
  TITLEBAR_HOME_SHAPE_VALUES,
50
+ TITLEBAR_LOGO_TREATMENT_CHOICES,
51
+ TITLEBAR_LOGO_TREATMENT_SHAPE_CHOICES,
52
+ TITLEBAR_LOGO_TREATMENT_SHAPE_VALUES,
53
+ TITLEBAR_LOGO_TREATMENT_VALUES,
50
54
  TITLEBAR_SIZE_CHOICES,
51
55
  TITLEBAR_SIZE_VALUES,
52
56
  TITLEBAR_SURFACE_CHOICES,
@@ -1612,6 +1616,16 @@ class SystemSettingsForm(forms.ModelForm):
1612
1616
  choices=TITLEBAR_SURFACE_CHOICES,
1613
1617
  initial='default',
1614
1618
  )
1619
+ titlebar_logo_treatment = forms.ChoiceField(
1620
+ required=False,
1621
+ choices=TITLEBAR_LOGO_TREATMENT_CHOICES,
1622
+ initial='none',
1623
+ )
1624
+ titlebar_logo_treatment_shape = forms.ChoiceField(
1625
+ required=False,
1626
+ choices=TITLEBAR_LOGO_TREATMENT_SHAPE_CHOICES,
1627
+ initial='soft',
1628
+ )
1615
1629
  email_2fa = forms.BooleanField(
1616
1630
  required=False,
1617
1631
  initial=False,
@@ -1914,6 +1928,11 @@ class SystemSettingsForm(forms.ModelForm):
1914
1928
  self.fields['titlebar_title_size'].label = s.get('form_sys_titlebar_title_size', 'Title size')
1915
1929
  self.fields['titlebar_height'].label = s.get('form_sys_titlebar_height', 'Titlebar height')
1916
1930
  self.fields['titlebar_surface'].label = s.get('form_sys_titlebar_surface', 'Titlebar surface')
1931
+ self.fields['titlebar_logo_treatment'].label = s.get('form_sys_titlebar_logo_treatment', 'Logo treatment')
1932
+ self.fields['titlebar_logo_treatment_shape'].label = s.get(
1933
+ 'form_sys_titlebar_logo_treatment_shape',
1934
+ 'Logo treatment shape',
1935
+ )
1917
1936
  self.fields['titlebar_show_title'].help_text = s.get(
1918
1937
  'help_sys_titlebar_show_title',
1919
1938
  'Show the system title in the titlebar.',
@@ -1930,6 +1949,14 @@ class SystemSettingsForm(forms.ModelForm):
1930
1949
  'help_sys_titlebar_hide_on_public_unauthenticated_index',
1931
1950
  'Hide the titlebar when an anonymous user opens the public root/home page.',
1932
1951
  )
1952
+ self.fields['titlebar_logo_treatment'].help_text = s.get(
1953
+ 'help_sys_titlebar_logo_treatment',
1954
+ 'Choose how Microsys visually assists the logo on mixed theme surfaces.',
1955
+ )
1956
+ self.fields['titlebar_logo_treatment_shape'].help_text = s.get(
1957
+ 'help_sys_titlebar_logo_treatment_shape',
1958
+ 'Choose the plate silhouette when the Plate treatment is active.',
1959
+ )
1933
1960
  self.fields['titlebar_home_shape'].choices = (
1934
1961
  ('circle', s.get('titlebar_home_shape_circle', 'Circle')),
1935
1962
  ('square', s.get('titlebar_home_shape_square', 'Square')),
@@ -1955,6 +1982,17 @@ class SystemSettingsForm(forms.ModelForm):
1955
1982
  ('muted', s.get('titlebar_surface_muted', 'Muted')),
1956
1983
  ('glass', s.get('titlebar_surface_glass', 'Glass')),
1957
1984
  )
1985
+ self.fields['titlebar_logo_treatment'].choices = (
1986
+ ('none', s.get('titlebar_logo_treatment_none', 'None')),
1987
+ ('plate', s.get('titlebar_logo_treatment_plate', 'Plate')),
1988
+ ('halo', s.get('titlebar_logo_treatment_halo', 'Halo')),
1989
+ ('contrast', s.get('titlebar_logo_treatment_contrast', 'Contrast')),
1990
+ )
1991
+ self.fields['titlebar_logo_treatment_shape'].choices = (
1992
+ ('soft', s.get('titlebar_logo_treatment_shape_soft', 'Soft')),
1993
+ ('pill', s.get('titlebar_logo_treatment_shape_pill', 'Pill')),
1994
+ ('square', s.get('titlebar_logo_treatment_shape_square', 'Square')),
1995
+ )
1958
1996
  self.fields['email_2fa'].label = s.get('form_sys_email_2fa', 'Enable Email 2FA')
1959
1997
  self.fields['email_2fa'].help_text = s.get(
1960
1998
  'help_sys_email_2fa',
@@ -2198,6 +2236,50 @@ class SystemSettingsForm(forms.ModelForm):
2198
2236
  },
2199
2237
  ),
2200
2238
  )
2239
+ _bind_choice_selector_widget(
2240
+ self.fields['titlebar_logo_treatment'],
2241
+ MicrosysChoiceSelectorWidget(
2242
+ variant='toggle',
2243
+ option_meta={
2244
+ 'none': {
2245
+ 'icon': 'bi-slash-circle',
2246
+ 'description': s.get('titlebar_logo_treatment_none_desc', 'Leave the logo as uploaded.'),
2247
+ },
2248
+ 'plate': {
2249
+ 'icon': 'bi-badge-ad',
2250
+ 'description': s.get('titlebar_logo_treatment_plate_desc', 'Place the logo on an adaptive material plate.'),
2251
+ },
2252
+ 'halo': {
2253
+ 'icon': 'bi-brightness-high',
2254
+ 'description': s.get('titlebar_logo_treatment_halo_desc', 'Add a subtle adaptive glow behind the logo.'),
2255
+ },
2256
+ 'contrast': {
2257
+ 'icon': 'bi-circle-half',
2258
+ 'description': s.get('titlebar_logo_treatment_contrast_desc', 'Apply contrast and shadow assistance for simple logos.'),
2259
+ },
2260
+ },
2261
+ ),
2262
+ )
2263
+ _bind_choice_selector_widget(
2264
+ self.fields['titlebar_logo_treatment_shape'],
2265
+ MicrosysChoiceSelectorWidget(
2266
+ variant='toggle',
2267
+ option_meta={
2268
+ 'soft': {
2269
+ 'icon': 'bi-app',
2270
+ 'description': s.get('titlebar_logo_treatment_shape_soft_desc', 'A modern rounded plate.'),
2271
+ },
2272
+ 'pill': {
2273
+ 'icon': 'bi-capsule',
2274
+ 'description': s.get('titlebar_logo_treatment_shape_pill_desc', 'A fully rounded capsule plate.'),
2275
+ },
2276
+ 'square': {
2277
+ 'icon': 'bi-square',
2278
+ 'description': s.get('titlebar_logo_treatment_shape_square_desc', 'A sharper compact plate.'),
2279
+ },
2280
+ },
2281
+ ),
2282
+ )
2201
2283
  _bind_choice_selector_widget(
2202
2284
  self.fields['navbar_default_mode'],
2203
2285
  MicrosysChoiceSelectorWidget(
@@ -2439,6 +2521,8 @@ class SystemSettingsForm(forms.ModelForm):
2439
2521
  self.initial['titlebar_title_size'] = initial_titlebar_config.get('title_size', 'md')
2440
2522
  self.initial['titlebar_height'] = initial_titlebar_config.get('height', 'balanced')
2441
2523
  self.initial['titlebar_surface'] = initial_titlebar_config.get('surface', 'default')
2524
+ self.initial['titlebar_logo_treatment'] = initial_titlebar_config.get('logo_treatment', 'none')
2525
+ self.initial['titlebar_logo_treatment_shape'] = initial_titlebar_config.get('logo_treatment_shape', 'soft')
2442
2526
 
2443
2527
  catalog_lang = self.initial.get('default_language') or self.instance.default_language or config.get('default_language', 'en')
2444
2528
  public_sidebar_catalog = discover_sidebar_catalog(lang_code=catalog_lang, include_system_items=False)
@@ -2908,6 +2992,28 @@ class SystemSettingsForm(forms.ModelForm):
2908
2992
  Row(
2909
2993
  Div(Field('titlebar_surface'), css_class='col-lg-12'),
2910
2994
  ),
2995
+ Row(
2996
+ Div(
2997
+ Field('titlebar_logo_treatment'),
2998
+ css_class=(
2999
+ "col-lg-8 ms-titlebar-logo-dependent"
3000
+ f"{' d-none' if not self.initial.get('titlebar_show_logo', True) else ''}"
3001
+ ),
3002
+ aria_hidden='false' if self.initial.get('titlebar_show_logo', True) else 'true',
3003
+ ),
3004
+ Div(
3005
+ Field('titlebar_logo_treatment_shape'),
3006
+ css_class=(
3007
+ "col-lg-4 ms-titlebar-logo-plate-dependent"
3008
+ f"{' d-none' if not (self.initial.get('titlebar_show_logo', True) and self.initial.get('titlebar_logo_treatment', 'none') == 'plate') else ''}"
3009
+ ),
3010
+ aria_hidden='false' if (
3011
+ self.initial.get('titlebar_show_logo', True)
3012
+ and self.initial.get('titlebar_logo_treatment', 'none') == 'plate'
3013
+ ) else 'true',
3014
+ ),
3015
+ css_class='g-3 mb-3',
3016
+ ),
2911
3017
  css_class=_step_css_class(5),
2912
3018
  ),
2913
3019
  Div(
@@ -3136,6 +3242,18 @@ class SystemSettingsForm(forms.ModelForm):
3136
3242
  raise ValidationError("Invalid titlebar surface.")
3137
3243
  return value
3138
3244
 
3245
+ def clean_titlebar_logo_treatment(self):
3246
+ value = self.cleaned_data.get('titlebar_logo_treatment') or 'none'
3247
+ if value not in TITLEBAR_LOGO_TREATMENT_VALUES:
3248
+ raise ValidationError("Invalid titlebar logo treatment.")
3249
+ return value
3250
+
3251
+ def clean_titlebar_logo_treatment_shape(self):
3252
+ value = self.cleaned_data.get('titlebar_logo_treatment_shape') or 'soft'
3253
+ if value not in TITLEBAR_LOGO_TREATMENT_SHAPE_VALUES:
3254
+ raise ValidationError("Invalid titlebar logo treatment shape.")
3255
+ return value
3256
+
3139
3257
  def clean_home_url(self):
3140
3258
  value = str(self.cleaned_data.get('home_url') or '').strip()
3141
3259
  discovered_value = str(self.cleaned_data.get('home_url_discovered') or '').strip()
@@ -3336,6 +3454,8 @@ class SystemSettingsForm(forms.ModelForm):
3336
3454
  cleaned['titlebar_title_size'] = titlebar.get('title_size', 'md')
3337
3455
  cleaned['titlebar_height'] = titlebar.get('height', 'balanced')
3338
3456
  cleaned['titlebar_surface'] = titlebar.get('surface', 'default')
3457
+ cleaned['titlebar_logo_treatment'] = titlebar.get('logo_treatment', 'none')
3458
+ cleaned['titlebar_logo_treatment_shape'] = titlebar.get('logo_treatment_shape', 'soft')
3339
3459
 
3340
3460
  def clean(self):
3341
3461
  cleaned = super().clean()
@@ -3453,6 +3573,8 @@ class SystemSettingsForm(forms.ModelForm):
3453
3573
  'title_size': cleaned.get('titlebar_title_size', 'md'),
3454
3574
  'height': cleaned.get('titlebar_height', 'balanced'),
3455
3575
  'surface': cleaned.get('titlebar_surface', 'default'),
3576
+ 'logo_treatment': cleaned.get('titlebar_logo_treatment', 'none'),
3577
+ 'logo_treatment_shape': cleaned.get('titlebar_logo_treatment_shape', 'soft'),
3456
3578
  })
3457
3579
  if cleaned.get('registration_activation_mode') not in REGISTRATION_ACTIVATION_VALUES:
3458
3580
  cleaned['registration_activation_mode'] = 'auto_login_after_verify'