django-microsys 2.2.1__tar.gz → 2.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {django_microsys-2.2.1 → django_microsys-2.2.2}/PKG-INFO +1 -1
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/PKG-INFO +1 -1
- django_microsys-2.2.2/microsys/VERSION +1 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/context_processors.py +1 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/forms.py +77 -3
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/system_setup.css +10 -21
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/options.js +3 -1
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/system_setup.js +8 -1
- django_microsys-2.2.2/microsys/templates/microsys/includes/font_previews.html +20 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/options.html +1 -1
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/utils.py +24 -6
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/sections.py +7 -1
- django_microsys-2.2.1/microsys/VERSION +0 -1
- django_microsys-2.2.1/microsys/templates/microsys/includes/font_previews.html +0 -12
- {django_microsys-2.2.1 → django_microsys-2.2.2}/LICENSE +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/MANIFEST.in +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/README.md +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/SOURCES.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/dependency_links.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/entry_points.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/requires.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/top_level.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/__main__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/admin.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/api.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/apps.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/cli.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/constants.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/discovery.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/fetcher.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/filters.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/fonts.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/formats/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/formats/ar/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/formats/ar/formats.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/formats/en/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/formats/en/formats.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/guards.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/microsys_check.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/microsys_setup.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/migrator.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/seed_activity_log.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/managers.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/middleware.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0001_initial.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0002_public_registration.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0003_public_root_split.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0004_client_ip_and_trusted_devices.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0005_systemsettings_allow_user_font_override_and_more.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/models.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/patches.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/registration.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/README.md.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/__init__.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/apps.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/filters.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/forms.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/migrations/__init__.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/models.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/tables.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/templates/example_record_confirm_delete.html.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/templates/example_record_detail.html.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/templates/example_record_form.html.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/templates/example_record_list.html.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/tests/__init__.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/tests/test_app.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/translations.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/urls.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/views.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/.nginx/nginx.conf.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/.secrets/.env.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/Dockerfile.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/README.md.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/compose.dev.yml.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/compose.yml.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/dockerignore.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/docs/README.md.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/entrypoint.sh.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/gitattributes.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/gitignore.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/gunicorn.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/manage.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/__init__.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/asgi.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/celery.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/settings.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/urls.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/package/wsgi.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/req.txt.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/start.ps1.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/start.sh.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/tests/__init__.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/tests/test_scaffold.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/tools/smtp_relay.py.tmpl +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/signals.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap-icons.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap-icons.woff +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap-icons.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.bundle.min.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.bundle.min.js.map +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.min.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.min.css.map +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.rtl.min.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap.rtl.min.css.map +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/favicon.ico +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/img/base_logo.webp +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/img/default_profile.webp +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/img/login_logo.webp +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/accessibility/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/accessibility/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/activitylog/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/TwemojiCountryFlags.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/cairo-bold.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/cairo-medium.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/cairo-regular.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/shabwa-bold.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/shabwa-medium.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/fonts/shabwa-regular.woff2 +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/forms/css/file_field.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/forms/css/form_actions.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/forms/css/form_fields.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/forms/js/file_field.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/forms/js/filter_form.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/autofill/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/context_menu/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/context_menu/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/context_menu/js/section_manager.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/dynamic_modal/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/prevent_double_submit.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/scan_link/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/scan_link/js/scan_button.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/helpers/wizard/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/language/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/language/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/language/js/translations.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/buttons.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/dropdowns.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/index_cards.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/options.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/pagination.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/selectors.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/tables.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/template_cleanup.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/titlebar.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/base_head.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/base_runtime.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/selectors.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/tables.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sections/js/manage_sections.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/css/reorder.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/css/theme_picker.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/js/preload.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/js/reorder.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/sidebar/js/theme_picker.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/blue.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/dark.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/gold.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/gothic.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/green.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/light.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/mono.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/neon.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/red.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/css/retro.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/themes/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/tutorial/css/main.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/tutorial/js/driver.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/tutorial/js/main.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/css/login.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/css/permissions.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/css/profile.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/css/user_hub.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/login.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/manage_users.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/permissions.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/profile_2fa.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/profile_image_widget.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/twofa_verify.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/users/js/user_hub.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/vanillajs-datepicker/datepicker-bs5.min.css +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/vanillajs-datepicker/datepicker.min.js +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/tables.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/bootstrap5/layout/field_file.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/2fa/verify.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/activitylog/activity_log.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/activitylog/activity_log_detail_modal.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/base.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/form_base.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/assets_head.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/assets_scripts.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/crispy_file_field.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/file_input.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/filter_assets_head.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/forms/filter_assets_scripts.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/dynamic_modal.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/dynamic_modal_combined.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/dynamic_modal_detail.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/dynamic_modal_form.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/dynamic_modal_list.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/helpers/micro_context_menu.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/font_settings_matrix.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/language_catalog_editor.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/language_fonts_editor.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/language_previews.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/sidebar_builder.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/sidebar_density_previews.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/sidebar_items.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/system_names_editor.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/system_setup.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/table_density_previews.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/theme_previews.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/theme_settings_matrix.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/titlebar.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/translation_matrix_editor.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/tutorial.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/list_base.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/registration/pending.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/scopes/scope_actions.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/scopes/scope_form.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/scopes/scope_manager.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sections/manage_sections.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sections/subsection_select.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sidebar/auto.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sidebar/extra_groups.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sidebar/main.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/sidebar/tree.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/tables/table.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/grouped_permissions.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/manage_users.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/profile.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/profile_image_widget.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/user_detail_modal.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/users/user_hub.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/registration/email/verify_registration.txt +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/registration/login.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/registration/register.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/registration/register_sent.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/registration/register_verify.html +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templatetags/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templatetags/microsys_tags.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templatetags/microsys_translation.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templatetags/sidebar_tags.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/themes.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/translations.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/urls.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/__init__.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/activitylog.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/general.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/profile.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/registration.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/scopes.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/sidebar.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/twofa.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/views/users.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/widgets.py +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/pyproject.toml +0 -0
- {django_microsys-2.2.1 → django_microsys-2.2.2}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.2.2
|
|
@@ -346,6 +346,7 @@ def microsys_context(request):
|
|
|
346
346
|
from .fonts import generate_font_face_css, get_builtin_fonts
|
|
347
347
|
allowed_fonts = normalize_allowed_fonts(final_config.get('allowed_fonts'))
|
|
348
348
|
context['font_face_css'] = generate_font_face_css(allowed_fonts)
|
|
349
|
+
context['option_fonts'] = [font for font in get_builtin_fonts() if font.get('slug') in allowed_fonts]
|
|
349
350
|
|
|
350
351
|
allow_user_font_override = bool(final_config.get('allow_user_font_override', True))
|
|
351
352
|
default_fonts_by_lang = final_config.get('default_fonts', {})
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# Imports of the required python modules and libraries
|
|
2
2
|
######################################################
|
|
3
|
+
import os
|
|
3
4
|
import json
|
|
4
5
|
from types import MethodType, SimpleNamespace
|
|
5
6
|
|
|
@@ -1686,6 +1687,12 @@ class SystemSettingsForm(forms.ModelForm):
|
|
|
1686
1687
|
if parsed_step in (0, 1, 2, 3, 4, 5):
|
|
1687
1688
|
self.single_step_mode = True
|
|
1688
1689
|
self.single_step_index = parsed_step
|
|
1690
|
+
if self.mode != 'setup' and self.single_step_mode:
|
|
1691
|
+
# Single-step modal posts can legitimately omit values owned by another
|
|
1692
|
+
# wizard step; field-level required validation must not fire before the
|
|
1693
|
+
# step-preservation cleaners get a chance to restore them.
|
|
1694
|
+
self.fields['default_theme'].required = False
|
|
1695
|
+
self.fields['default_table_density'].required = False
|
|
1689
1696
|
|
|
1690
1697
|
from microsys.discovery import discover_sidebar_catalog, sanitize_sidebar_config
|
|
1691
1698
|
from microsys.utils import get_system_config
|
|
@@ -2873,12 +2880,27 @@ class SystemSettingsForm(forms.ModelForm):
|
|
|
2873
2880
|
return str(self.cleaned_data.get('default_language') or 'en').strip().lower().replace('_', '-')
|
|
2874
2881
|
|
|
2875
2882
|
def clean_allowed_fonts(self):
|
|
2883
|
+
if self.is_bound and self.mode != 'setup' and self.single_step_mode and 'allowed_fonts' not in self.data:
|
|
2884
|
+
preserved = getattr(self.instance, 'allowed_fonts', None)
|
|
2885
|
+
if preserved in (None, ''):
|
|
2886
|
+
preserved = self.initial.get('allowed_fonts')
|
|
2887
|
+
return list(normalize_allowed_fonts(preserved))
|
|
2876
2888
|
data = self.cleaned_data.get('allowed_fonts')
|
|
2877
2889
|
if not data:
|
|
2878
2890
|
return []
|
|
2879
2891
|
return list(data)
|
|
2880
2892
|
|
|
2881
2893
|
def clean_default_fonts(self):
|
|
2894
|
+
if self.is_bound and self.mode != 'setup' and self.single_step_mode and 'default_fonts' not in self.data:
|
|
2895
|
+
preserved = getattr(self.instance, 'default_fonts', None)
|
|
2896
|
+
if preserved in (None, ''):
|
|
2897
|
+
preserved = self.initial.get('default_fonts')
|
|
2898
|
+
if isinstance(preserved, str):
|
|
2899
|
+
try:
|
|
2900
|
+
preserved = json.loads(preserved)
|
|
2901
|
+
except json.JSONDecodeError:
|
|
2902
|
+
preserved = {}
|
|
2903
|
+
return preserved if isinstance(preserved, dict) else {}
|
|
2882
2904
|
data = self.cleaned_data.get('default_fonts')
|
|
2883
2905
|
if not data:
|
|
2884
2906
|
return {}
|
|
@@ -2891,12 +2913,27 @@ class SystemSettingsForm(forms.ModelForm):
|
|
|
2891
2913
|
return {}
|
|
2892
2914
|
|
|
2893
2915
|
def clean_default_theme(self):
|
|
2894
|
-
|
|
2916
|
+
if self.is_bound and self.mode != 'setup' and self.single_step_mode and 'default_theme' not in self.data:
|
|
2917
|
+
value = (
|
|
2918
|
+
getattr(self.instance, 'default_theme', None)
|
|
2919
|
+
or self.initial.get('default_theme')
|
|
2920
|
+
or 'light'
|
|
2921
|
+
)
|
|
2922
|
+
else:
|
|
2923
|
+
value = self.cleaned_data.get('default_theme') or 'light'
|
|
2895
2924
|
if not is_valid_theme(value):
|
|
2896
2925
|
raise ValidationError("Invalid theme choice.")
|
|
2897
2926
|
return value
|
|
2898
2927
|
|
|
2899
2928
|
def clean_allowed_themes(self):
|
|
2929
|
+
if self.is_bound and self.mode != 'setup' and self.single_step_mode and 'allowed_themes' not in self.data:
|
|
2930
|
+
values = getattr(self.instance, 'allowed_themes', None)
|
|
2931
|
+
if not values:
|
|
2932
|
+
values = self.initial.get('allowed_themes')
|
|
2933
|
+
normalized = list(normalize_allowed_themes(values))
|
|
2934
|
+
if not normalized:
|
|
2935
|
+
raise ValidationError("At least one theme must remain enabled.")
|
|
2936
|
+
return normalized
|
|
2900
2937
|
values = self.cleaned_data.get('allowed_themes') or []
|
|
2901
2938
|
if not values:
|
|
2902
2939
|
raise ValidationError("At least one theme must remain enabled.")
|
|
@@ -2906,7 +2943,14 @@ class SystemSettingsForm(forms.ModelForm):
|
|
|
2906
2943
|
return normalized
|
|
2907
2944
|
|
|
2908
2945
|
def clean_default_table_density(self):
|
|
2909
|
-
|
|
2946
|
+
if self.is_bound and self.mode != 'setup' and self.single_step_mode and 'default_table_density' not in self.data:
|
|
2947
|
+
value = (
|
|
2948
|
+
getattr(self.instance, 'default_table_density', None)
|
|
2949
|
+
or self.initial.get('default_table_density')
|
|
2950
|
+
or DEFAULT_TABLE_DENSITY
|
|
2951
|
+
)
|
|
2952
|
+
else:
|
|
2953
|
+
value = self.cleaned_data.get('default_table_density') or DEFAULT_TABLE_DENSITY
|
|
2910
2954
|
if value not in TABLE_DENSITY_VALUES:
|
|
2911
2955
|
raise ValidationError("Invalid table density choice.")
|
|
2912
2956
|
return value
|
|
@@ -3246,13 +3290,43 @@ class SystemSettingsForm(forms.ModelForm):
|
|
|
3246
3290
|
if cleaned.get('registration_activation_mode') not in REGISTRATION_ACTIVATION_VALUES:
|
|
3247
3291
|
cleaned['registration_activation_mode'] = 'auto_login_after_verify'
|
|
3248
3292
|
email_ready = get_email_service_status().get('available')
|
|
3249
|
-
|
|
3293
|
+
backend = getattr(settings, 'EMAIL_BACKEND', 'django.core.mail.backends.smtp.EmailBackend')
|
|
3294
|
+
local_backends = {
|
|
3295
|
+
'django.core.mail.backends.console.EmailBackend',
|
|
3296
|
+
'django.core.mail.backends.locmem.EmailBackend',
|
|
3297
|
+
'django.core.mail.backends.filebased.EmailBackend',
|
|
3298
|
+
}
|
|
3299
|
+
if backend in local_backends and getattr(settings, 'DEBUG', False):
|
|
3300
|
+
email_ready = True
|
|
3301
|
+
elif email_config.get('transport') == 'relay':
|
|
3302
|
+
relay_host = str(email_config.get('host') or os.getenv('SMTP_RELAY_HOST') or '').strip()
|
|
3303
|
+
relay_port = email_config.get('port')
|
|
3304
|
+
relay_from_email = str(
|
|
3305
|
+
email_config.get('default_from_email')
|
|
3306
|
+
or getattr(settings, 'DEFAULT_FROM_EMAIL', '')
|
|
3307
|
+
or os.getenv('DEFAULT_FROM_EMAIL')
|
|
3308
|
+
or ''
|
|
3309
|
+
).strip()
|
|
3310
|
+
relay_password_ok = True
|
|
3311
|
+
if email_config.get('secret_storage') == 'encrypted_db' and email_config.get('username'):
|
|
3312
|
+
relay_password_ok = bool(email_config.get('encrypted_password'))
|
|
3313
|
+
email_ready = bool(relay_host and relay_port and relay_from_email and relay_password_ok)
|
|
3314
|
+
elif email_config.get('secret_storage') == 'encrypted_db':
|
|
3250
3315
|
email_ready = bool(
|
|
3251
3316
|
email_config.get('host')
|
|
3252
3317
|
and email_config.get('port')
|
|
3253
3318
|
and email_config.get('default_from_email')
|
|
3254
3319
|
and (not email_config.get('username') or email_config.get('encrypted_password'))
|
|
3255
3320
|
)
|
|
3321
|
+
elif backend == 'django.core.mail.backends.smtp.EmailBackend':
|
|
3322
|
+
email_ready = bool(
|
|
3323
|
+
(email_config.get('host') or getattr(settings, 'EMAIL_HOST', ''))
|
|
3324
|
+
and (email_config.get('port') or getattr(settings, 'EMAIL_PORT', None))
|
|
3325
|
+
and (
|
|
3326
|
+
email_config.get('default_from_email')
|
|
3327
|
+
or getattr(settings, 'DEFAULT_FROM_EMAIL', '')
|
|
3328
|
+
)
|
|
3329
|
+
)
|
|
3256
3330
|
if (cleaned.get('public_registration_enabled') or cleaned.get('email_2fa')) and not email_ready:
|
|
3257
3331
|
self.add_error(
|
|
3258
3332
|
'email_config',
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/css/system_setup.css
RENAMED
|
@@ -683,40 +683,29 @@
|
|
|
683
683
|
}
|
|
684
684
|
|
|
685
685
|
/* Font Previews Support */
|
|
686
|
-
.ms-font-
|
|
687
|
-
|
|
688
|
-
flex-wrap: wrap;
|
|
689
|
-
gap: 1rem;
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
.ms-font-preview-card {
|
|
693
|
-
width: 100px;
|
|
694
|
-
cursor: pointer;
|
|
695
|
-
transition: all 0.2s ease-in-out;
|
|
696
|
-
border-width: 2px !important;
|
|
697
|
-
text-align: center;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
.ms-font-preview-card.active {
|
|
701
|
-
border-color: var(--primal) !important;
|
|
702
|
-
background-color: rgba(var(--primal-rgb), 0.05);
|
|
686
|
+
.ms-font-option {
|
|
687
|
+
align-items: center;
|
|
703
688
|
}
|
|
704
689
|
|
|
705
|
-
.ms-font-
|
|
706
|
-
|
|
690
|
+
.ms-font-option__icon {
|
|
691
|
+
width: 3.5rem;
|
|
692
|
+
height: 3.5rem;
|
|
693
|
+
border-radius: 1rem;
|
|
707
694
|
}
|
|
708
695
|
|
|
709
696
|
.font-preview-sample {
|
|
710
697
|
font-weight: 500;
|
|
698
|
+
font-size: 1.5rem;
|
|
699
|
+
line-height: 1;
|
|
711
700
|
}
|
|
712
701
|
|
|
713
702
|
/* Specific Font Mapping Rules for Previews */
|
|
714
|
-
.ms-font-
|
|
703
|
+
.ms-font-option[data-font="shabwa"] .font-preview-sample,
|
|
715
704
|
.ms-font-settings-option[data-font-option="shabwa"] .font-preview-sample {
|
|
716
705
|
font-family: 'Shabwa', sans-serif !important;
|
|
717
706
|
}
|
|
718
707
|
|
|
719
|
-
.ms-font-
|
|
708
|
+
.ms-font-option[data-font="cairo"] .font-preview-sample,
|
|
720
709
|
.ms-font-settings-option[data-font-option="cairo"] .font-preview-sample {
|
|
721
710
|
font-family: 'Cairo', sans-serif !important;
|
|
722
711
|
}
|
|
@@ -103,7 +103,9 @@
|
|
|
103
103
|
element.addEventListener('click', function () {
|
|
104
104
|
const font = this.getAttribute('data-font');
|
|
105
105
|
// Update local UI
|
|
106
|
-
document.querySelectorAll('[data-font]').forEach(
|
|
106
|
+
document.querySelectorAll('[data-font]').forEach((option) => {
|
|
107
|
+
option.classList.toggle('is-active', option === this);
|
|
108
|
+
});
|
|
107
109
|
|
|
108
110
|
// Apply immediately
|
|
109
111
|
const familyName = font.charAt(0).toUpperCase() + font.slice(1);
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/microsys/main/js/system_setup.js
RENAMED
|
@@ -2858,13 +2858,15 @@
|
|
|
2858
2858
|
input.value = activeTheme;
|
|
2859
2859
|
allowedCheckboxes.forEach((checkbox) => {
|
|
2860
2860
|
const theme = checkbox.getAttribute('data-setup-theme-allowed');
|
|
2861
|
-
|
|
2861
|
+
const isLocked = checkbox.checked && resolvedAllowedThemes.length === 1;
|
|
2862
|
+
checkbox.setAttribute('aria-disabled', isLocked ? 'true' : 'false');
|
|
2862
2863
|
const container = checkbox.closest('[data-theme-option]');
|
|
2863
2864
|
if (!container) {
|
|
2864
2865
|
return;
|
|
2865
2866
|
}
|
|
2866
2867
|
const isAllowed = resolvedAllowedThemes.includes(theme);
|
|
2867
2868
|
const isDefault = theme === activeTheme;
|
|
2869
|
+
container.classList.toggle('is-locked', isLocked);
|
|
2868
2870
|
container.classList.toggle('opacity-50', !isAllowed);
|
|
2869
2871
|
container.classList.toggle('is-default', isDefault);
|
|
2870
2872
|
const button = container.querySelector('[data-setup-theme-choice]');
|
|
@@ -2897,6 +2899,11 @@
|
|
|
2897
2899
|
});
|
|
2898
2900
|
|
|
2899
2901
|
allowedCheckboxes.forEach((checkbox) => {
|
|
2902
|
+
checkbox.addEventListener('click', (event) => {
|
|
2903
|
+
if (checkbox.checked && getAllowedThemes().length === 1) {
|
|
2904
|
+
event.preventDefault();
|
|
2905
|
+
}
|
|
2906
|
+
});
|
|
2900
2907
|
checkbox.addEventListener('change', () => {
|
|
2901
2908
|
if (!getAllowedThemes().length) {
|
|
2902
2909
|
checkbox.checked = true;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{% load static %}
|
|
2
|
+
<div class="ms-font-picker" id="msFontPreviews">
|
|
3
|
+
<div class="ms-density-options" role="group" aria-label="{{ MS_TRANS.typography }}">
|
|
4
|
+
{% for font in option_fonts %}
|
|
5
|
+
<button
|
|
6
|
+
type="button"
|
|
7
|
+
class="ms-density-option ms-font-option{% if selected_font == font.slug %} is-active{% endif %}"
|
|
8
|
+
data-font="{{ font.slug }}"
|
|
9
|
+
>
|
|
10
|
+
<span class="ms-density-option__icon ms-font-option__icon" aria-hidden="true">
|
|
11
|
+
<span class="font-preview-sample">Aa</span>
|
|
12
|
+
</span>
|
|
13
|
+
<span class="ms-density-option__copy">
|
|
14
|
+
<strong>{{ font.label }}</strong>
|
|
15
|
+
<small>{{ font.slug }}</small>
|
|
16
|
+
</span>
|
|
17
|
+
</button>
|
|
18
|
+
{% endfor %}
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/templates/microsys/includes/options.html
RENAMED
|
@@ -304,7 +304,7 @@
|
|
|
304
304
|
<h4 class="mb-3"><i class="bi bi-fonts me-2"></i> {{ MS_TRANS.typography }}</h4>
|
|
305
305
|
<p class="text-muted small mb-4">{{ MS_TRANS.typography_desc }}</p>
|
|
306
306
|
|
|
307
|
-
{% include 'microsys/includes/font_previews.html' with selected_font=active_font
|
|
307
|
+
{% include 'microsys/includes/font_previews.html' with selected_font=active_font option_fonts=option_fonts %}
|
|
308
308
|
</div>
|
|
309
309
|
</div>
|
|
310
310
|
{% endif %}
|
|
@@ -446,9 +446,12 @@ def get_email_service_status():
|
|
|
446
446
|
"""
|
|
447
447
|
try:
|
|
448
448
|
SystemSettings = apps.get_model('microsys', 'SystemSettings')
|
|
449
|
-
|
|
449
|
+
raw_stored_email_config = getattr(SystemSettings.load(), 'email_config', {})
|
|
450
|
+
stored_email_config = normalize_email_config(raw_stored_email_config)
|
|
450
451
|
except Exception:
|
|
452
|
+
raw_stored_email_config = {}
|
|
451
453
|
stored_email_config = default_email_config()
|
|
454
|
+
stored_hint_keys = set(raw_stored_email_config.keys()) if isinstance(raw_stored_email_config, dict) else set()
|
|
452
455
|
email_config = get_microsys_email_config(include_secret=False)
|
|
453
456
|
backend = email_config.get('backend') or 'django.core.mail.backends.smtp.EmailBackend'
|
|
454
457
|
from_email = email_config.get('from_email') or ''
|
|
@@ -479,13 +482,28 @@ def get_email_service_status():
|
|
|
479
482
|
if secret_storage == 'encrypted_db' and email_config.get('username'):
|
|
480
483
|
password_ok = bool(email_config.get('password_configured'))
|
|
481
484
|
if transport == 'relay':
|
|
485
|
+
relay_upstream_host = (
|
|
486
|
+
stored_email_config.get('host')
|
|
487
|
+
if 'host' in stored_hint_keys and stored_email_config.get('host')
|
|
488
|
+
else (os.getenv('SMTP_RELAY_HOST', '') or '')
|
|
489
|
+
)
|
|
490
|
+
relay_upstream_port = (
|
|
491
|
+
stored_email_config.get('port')
|
|
492
|
+
if 'port' in stored_hint_keys and stored_email_config.get('port')
|
|
493
|
+
else int(os.getenv('SMTP_RELAY_PORT', '587') or '587')
|
|
494
|
+
)
|
|
495
|
+
relay_from_email = (
|
|
496
|
+
stored_email_config.get('default_from_email')
|
|
497
|
+
if 'default_from_email' in stored_hint_keys and stored_email_config.get('default_from_email')
|
|
498
|
+
else (getattr(settings, 'DEFAULT_FROM_EMAIL', '') or os.getenv('DEFAULT_FROM_EMAIL', '') or '')
|
|
499
|
+
)
|
|
482
500
|
relay_password_ok = True
|
|
483
501
|
if stored_email_config.get('secret_storage') == 'encrypted_db' and stored_email_config.get('username'):
|
|
484
502
|
relay_password_ok = bool(stored_email_config.get('password_configured'))
|
|
485
503
|
configured = bool(
|
|
486
|
-
|
|
487
|
-
and
|
|
488
|
-
and
|
|
504
|
+
relay_upstream_host
|
|
505
|
+
and relay_upstream_port
|
|
506
|
+
and relay_from_email
|
|
489
507
|
and relay_password_ok
|
|
490
508
|
)
|
|
491
509
|
return {
|
|
@@ -495,8 +513,8 @@ def get_email_service_status():
|
|
|
495
513
|
'from_email': from_email,
|
|
496
514
|
'transport': transport,
|
|
497
515
|
'secret_storage': secret_storage,
|
|
498
|
-
'detail': f"{host}:{port} -> {
|
|
499
|
-
if host and port and
|
|
516
|
+
'detail': f"{host}:{port} -> {relay_upstream_host}:{relay_upstream_port}"
|
|
517
|
+
if host and port and relay_upstream_host and relay_upstream_port else '',
|
|
500
518
|
'reason': 'relay_configured' if configured else (
|
|
501
519
|
'relay_missing_password' if not relay_password_ok else 'relay_missing_upstream_host_port_or_from_email'
|
|
502
520
|
),
|
|
@@ -948,7 +948,7 @@ class DynamicModalManagerView(LoginRequiredMixin, View):
|
|
|
948
948
|
except (TypeError, ValueError):
|
|
949
949
|
return None
|
|
950
950
|
|
|
951
|
-
if 0 <= step <=
|
|
951
|
+
if 0 <= step <= 5:
|
|
952
952
|
return step
|
|
953
953
|
return None
|
|
954
954
|
|
|
@@ -1077,6 +1077,12 @@ class DynamicModalManagerView(LoginRequiredMixin, View):
|
|
|
1077
1077
|
'hide_form_buttons': getattr(form, "_auto_helper", False) or has_submit_button(form),
|
|
1078
1078
|
'wizard_initial_step': self._get_wizard_initial_step(model),
|
|
1079
1079
|
}
|
|
1080
|
+
if self._is_system_settings_model(model):
|
|
1081
|
+
logger.warning(
|
|
1082
|
+
"SystemSettings modal validation failed on step %s: %s",
|
|
1083
|
+
request.GET.get('step'),
|
|
1084
|
+
form.errors.get_json_data(),
|
|
1085
|
+
)
|
|
1080
1086
|
# Render combined view for validation failure
|
|
1081
1087
|
html = render_to_string('microsys/helpers/dynamic_modal_combined.html', context, request=request)
|
|
1082
1088
|
return JsonResponse({'success': False, 'html': html})
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.2.1
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{% load static %}
|
|
2
|
-
<div class="d-flex flex-wrap gap-3 ms-font-previews" id="msFontPreviews">
|
|
3
|
-
{% for font_slug in allowed_fonts %}
|
|
4
|
-
<div class="ms-font-preview-card border rounded p-2 text-center cursor-pointer {% if selected_font == font_slug %}active{% endif %}"
|
|
5
|
-
data-font="{{ font_slug }}">
|
|
6
|
-
<div class="font-preview-sample h3 mb-1">
|
|
7
|
-
Aa
|
|
8
|
-
</div>
|
|
9
|
-
<div class="small fw-semibold">{{ font_slug|title }}</div>
|
|
10
|
-
</div>
|
|
11
|
-
{% endfor %}
|
|
12
|
-
</div>
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/django_microsys.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/microsys_check.py
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/microsys_setup.py
RENAMED
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/management/commands/seed_activity_log.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0002_public_registration.py
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/migrations/0003_public_root_split.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/README.md.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/__init__.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/apps.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/filters.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/forms.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/models.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/tables.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/translations.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/urls.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/app/views.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/Dockerfile.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/README.md.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/compose.yml.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/gitignore.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/gunicorn.py.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/manage.py.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/req.txt.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/start.ps1.tmpl
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/scaffold_templates/project/start.sh.tmpl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap-icons.css
RENAMED
|
File without changes
|
{django_microsys-2.2.1 → django_microsys-2.2.2}/microsys/static/bootstrap/bootstrap-icons.woff
RENAMED
|
File without changes
|