cherrypy-foundation 1.0.0a12__tar.gz → 1.0.0a14__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.
- {cherrypy_foundation-1.0.0a12/src/cherrypy_foundation.egg-info → cherrypy_foundation-1.0.0a14}/PKG-INFO +1 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/ColorModes.jinja +5 -4
- cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/components/LocaleSelection.jinja +13 -0
- cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/components/LocaleSelection.js +26 -0
- cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tests/__init__.py +72 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_flash.html +2 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_form.html +2 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_url.html +1 -1
- cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools/i18n.py +529 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/jinja2.py +14 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/templates/test_jinja2.html +2 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/templates/test_jinjax.html +3 -2
- cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools/tests/templates/test_jinjax_i18n.html +22 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_i18n.py +34 -2
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_jinja2.py +33 -3
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/url.py +2 -3
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation.egg-info}/PKG-INFO +1 -1
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/SOURCES.txt +4 -4
- cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools/i18n.py +0 -454
- cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools/tests/__init__.py +0 -0
- cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.mo +0 -0
- cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.po +0 -15
- cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools/tests/templates/test_jinja2_i18n.html +0 -11
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/.gitignore +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/.gitlab-ci.yml +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/LICENSE.md +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/README.md +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/TODO +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/changelog +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/control +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/copyright +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/python3-cherrypy-foundation.docs +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/python3-cherrypy-foundation.links +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/rules +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/source/format +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/source/options +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/debian/upstream/metadata +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/pyproject.toml +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/setup.cfg +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/sonar-project.properties +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Fields.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Flash.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Icon.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/tests/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/tests/test_static.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css.map +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css.map +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js.map +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js.map +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/color-modes.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc.png +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc_disabled.png +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_both.png +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc.png +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc_disabled.png +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/vfs_fonts.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/jquery/jquery.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/LICENSE +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/README.md +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/multi.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/multi.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/popper/popper.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/popper/popper.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.css +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.js +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/error_page.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/flash.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/form.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/logging.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/passwd.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/db.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/ldap.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/restapi.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/scheduler.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/smtp.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_db.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_ldap.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_scheduler.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_scheduler_db.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_smtp.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_error_page.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_flash.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_form.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_passwd.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_url.py +0 -0
- {cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tests → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools}/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/auth.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/auth_mfa.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/errors.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/ratelimit.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/secure_headers.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/sessions_timeout.py +0 -0
- {cherrypy_foundation-1.0.0a12/src/cherrypy_foundation/tools → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools/tests}/__init__.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/components/Button.jinja +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.mo +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.po +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/messages.pot +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_auth.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_auth_mfa.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_ratelimit.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/widgets.py +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/dependency_links.txt +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/requires.txt +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/top_level.txt +0 -0
- {cherrypy_foundation-1.0.0a12 → cherrypy_foundation-1.0.0a14}/tox.ini +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
{# def header="Toggle theme", light_label="Light", dark_label="Dark", auto_label="Auto" #}
|
|
1
2
|
{#css vendor/bootstrap5/css/bootstrap.min.css #}
|
|
2
3
|
{#js vendor/popper/popper.min.js, vendor/bootstrap5/js/bootstrap.min.js, vendor/bootstrap5/js/color-modes.js #}
|
|
3
4
|
<svg class="d-none" xmlns="http://www.w3.org/2000/svg">
|
|
@@ -21,7 +22,7 @@
|
|
|
21
22
|
</svg>
|
|
22
23
|
<li>
|
|
23
24
|
<span id="bd-theme" class="dropdown-item disabled">
|
|
24
|
-
<span id="bd-theme-text">{
|
|
25
|
+
<span id="bd-theme-text">{{ header }}</span>
|
|
25
26
|
<svg aria-hidden="true"
|
|
26
27
|
class="theme-icon-active visually-hidden"
|
|
27
28
|
width="16"
|
|
@@ -40,7 +41,7 @@
|
|
|
40
41
|
<use href="#sun-fill">
|
|
41
42
|
</use>
|
|
42
43
|
</svg>
|
|
43
|
-
{
|
|
44
|
+
{{ light_label }}
|
|
44
45
|
</button>
|
|
45
46
|
</li>
|
|
46
47
|
<li>
|
|
@@ -52,7 +53,7 @@
|
|
|
52
53
|
<use href="#moon-stars-fill">
|
|
53
54
|
</use>
|
|
54
55
|
</svg>
|
|
55
|
-
{
|
|
56
|
+
{{ dark_label }}
|
|
56
57
|
</button>
|
|
57
58
|
</li>
|
|
58
59
|
<li>
|
|
@@ -64,6 +65,6 @@
|
|
|
64
65
|
<use href="#circle-half">
|
|
65
66
|
</use>
|
|
66
67
|
</svg>
|
|
67
|
-
{
|
|
68
|
+
{{ auto_label }}
|
|
68
69
|
</button>
|
|
69
70
|
</li>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{# def header="Language selection" #}
|
|
2
|
+
<li>
|
|
3
|
+
<h6 class="dropdown-header">{{ header }}</h6>
|
|
4
|
+
</li>
|
|
5
|
+
{% set cur_locale = get_translation().locale %}
|
|
6
|
+
{% for locale in list_available_locales() %}
|
|
7
|
+
<li>
|
|
8
|
+
<button aria-pressed="{{ 'true' if cur_locale == locale else 'false' }}"
|
|
9
|
+
class="dropdown-item btn-locale{{ ' active' if cur_locale == locale else '' }}"
|
|
10
|
+
data-locale="{{ locale.language }}"
|
|
11
|
+
type="button">{{ locale.display_name.capitalize() }}</button>
|
|
12
|
+
</li>
|
|
13
|
+
{% endfor %}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Handle locale selection.
|
|
3
|
+
*/
|
|
4
|
+
document.addEventListener('DOMContentLoaded', function () {
|
|
5
|
+
const LOCALE_COOKIE_NAME = 'locale';
|
|
6
|
+
const ONE_YEAR = 60 * 60 * 24 * 365;
|
|
7
|
+
|
|
8
|
+
function setLocaleCookie(locale) {
|
|
9
|
+
document.cookie = `${LOCALE_COOKIE_NAME}=${locale}; path=/; max-age=${ONE_YEAR}; SameSite=Lax`;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function onLanguageClick(event) {
|
|
13
|
+
const locale = event.target.dataset.locale;
|
|
14
|
+
if (!locale) return;
|
|
15
|
+
|
|
16
|
+
setLocaleCookie(locale);
|
|
17
|
+
|
|
18
|
+
// Reload page so backend can use the new language
|
|
19
|
+
window.location.reload();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
document.querySelectorAll('.btn-locale').forEach(btn => {
|
|
23
|
+
btn.addEventListener('click', onLanguageClick);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# CherryPy foundation
|
|
2
|
+
# Copyright (C) 2026 IKUS Software
|
|
3
|
+
#
|
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
import tempfile
|
|
19
|
+
import unittest
|
|
20
|
+
from contextlib import contextmanager
|
|
21
|
+
|
|
22
|
+
from selenium import webdriver
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class SeleniumUnitTest:
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def _session_id(self):
|
|
29
|
+
if hasattr(self, 'cookies') and self.cookies:
|
|
30
|
+
for unused, value in self.cookies:
|
|
31
|
+
for part in value.split(';'):
|
|
32
|
+
key, unused, value = part.partition('=')
|
|
33
|
+
if key == 'session_id':
|
|
34
|
+
return value
|
|
35
|
+
|
|
36
|
+
@contextmanager
|
|
37
|
+
def selenium(self, headless=True, implicitly_wait=3):
|
|
38
|
+
"""
|
|
39
|
+
Decorator to load selenium for a test.
|
|
40
|
+
"""
|
|
41
|
+
# Skip selenium test is display is not available.
|
|
42
|
+
if not os.environ.get('DISPLAY', False):
|
|
43
|
+
raise unittest.SkipTest("selenium require a display")
|
|
44
|
+
# Start selenium driver
|
|
45
|
+
options = webdriver.ChromeOptions()
|
|
46
|
+
if headless:
|
|
47
|
+
options.add_argument('--headless')
|
|
48
|
+
options.add_argument('--disable-gpu')
|
|
49
|
+
options.add_argument('--window-size=1280,800')
|
|
50
|
+
options.add_argument('--no-sandbox')
|
|
51
|
+
options.add_argument('--disable-dev-shm-usage')
|
|
52
|
+
options.add_argument('--lang=en-US')
|
|
53
|
+
driver = webdriver.Chrome(options=options)
|
|
54
|
+
try:
|
|
55
|
+
# If logged in, reuse the same session id.
|
|
56
|
+
if self._session_id:
|
|
57
|
+
driver.get(f'{self.baseurl}/login/')
|
|
58
|
+
driver.add_cookie({"name": "session_id", "value": self.session_id})
|
|
59
|
+
# Configure download folder
|
|
60
|
+
download = os.path.join(os.path.expanduser('~'), 'Downloads')
|
|
61
|
+
os.makedirs(download, exist_ok=True)
|
|
62
|
+
self._selenium_download_dir = tempfile.mkdtemp(dir=download, prefix='selenium-download-')
|
|
63
|
+
driver.execute_cdp_cmd(
|
|
64
|
+
'Page.setDownloadBehavior', {'behavior': 'allow', 'downloadPath': self._selenium_download_dir}
|
|
65
|
+
)
|
|
66
|
+
# Set default wait.
|
|
67
|
+
driver.implicitly_wait(implicitly_wait)
|
|
68
|
+
yield driver
|
|
69
|
+
finally:
|
|
70
|
+
# Code to release resource, e.g.:
|
|
71
|
+
driver.close()
|
|
72
|
+
driver = None
|