cherrypy-foundation 1.0.0a13__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.
Files changed (154) hide show
  1. {cherrypy_foundation-1.0.0a13/src/cherrypy_foundation.egg-info → cherrypy_foundation-1.0.0a14}/PKG-INFO +1 -1
  2. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/ColorModes.jinja +5 -4
  3. cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/components/LocaleSelection.jinja +13 -0
  4. cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/components/LocaleSelection.js +26 -0
  5. cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tests/__init__.py +72 -0
  6. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_flash.html +2 -1
  7. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_form.html +2 -1
  8. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/templates/test_url.html +1 -1
  9. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/i18n.py +39 -5
  10. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/jinja2.py +14 -1
  11. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/templates/test_jinja2.html +2 -1
  12. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/templates/test_jinjax.html +3 -2
  13. cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools/tests/templates/test_jinjax_i18n.html +22 -0
  14. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_i18n.py +25 -0
  15. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_jinja2.py +33 -3
  16. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/url.py +2 -3
  17. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation.egg-info}/PKG-INFO +1 -1
  18. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/SOURCES.txt +4 -2
  19. cherrypy_foundation-1.0.0a13/src/cherrypy_foundation/tools/tests/__init__.py +0 -0
  20. cherrypy_foundation-1.0.0a13/src/cherrypy_foundation/tools/tests/templates/test_jinja2_i18n.html +0 -11
  21. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/.gitignore +0 -0
  22. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/.gitlab-ci.yml +0 -0
  23. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/LICENSE.md +0 -0
  24. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/README.md +0 -0
  25. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/TODO +0 -0
  26. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/changelog +0 -0
  27. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/control +0 -0
  28. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/copyright +0 -0
  29. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/python3-cherrypy-foundation.docs +0 -0
  30. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/python3-cherrypy-foundation.links +0 -0
  31. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/rules +0 -0
  32. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/source/format +0 -0
  33. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/source/options +0 -0
  34. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/debian/upstream/metadata +0 -0
  35. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/pyproject.toml +0 -0
  36. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/setup.cfg +0 -0
  37. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/sonar-project.properties +0 -0
  38. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/__init__.py +0 -0
  39. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.css +0 -0
  40. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.jinja +0 -0
  41. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Datatable.js +0 -0
  42. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.css +0 -0
  43. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.jinja +0 -0
  44. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Field.js +0 -0
  45. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Fields.jinja +0 -0
  46. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Flash.jinja +0 -0
  47. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Icon.jinja +0 -0
  48. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.css +0 -0
  49. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.jinja +0 -0
  50. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/SideBySideMultiSelect.js +0 -0
  51. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.css +0 -0
  52. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.jinja +0 -0
  53. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/Typeahead.js +0 -0
  54. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/__init__.py +0 -0
  55. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/tests/__init__.py +0 -0
  56. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/tests/test_static.py +0 -0
  57. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  58. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
  59. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  60. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  61. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css +0 -0
  62. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css.map +0 -0
  63. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css +0 -0
  64. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css.map +0 -0
  65. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js +0 -0
  66. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js.map +0 -0
  67. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js +0 -0
  68. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js.map +0 -0
  69. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/bootstrap5/js/color-modes.js +0 -0
  70. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.css +0 -0
  71. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.min.css +0 -0
  72. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc.png +0 -0
  73. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc_disabled.png +0 -0
  74. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_both.png +0 -0
  75. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc.png +0 -0
  76. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc_disabled.png +0 -0
  77. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.js +0 -0
  78. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.min.js +0 -0
  79. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.css +0 -0
  80. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.min.css +0 -0
  81. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.js +0 -0
  82. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.min.js +0 -0
  83. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.js +0 -0
  84. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.min.js +0 -0
  85. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.css +0 -0
  86. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css +0 -0
  87. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.js +0 -0
  88. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js +0 -0
  89. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.js +0 -0
  90. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.min.js +0 -0
  91. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.css +0 -0
  92. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.min.css +0 -0
  93. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.js +0 -0
  94. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.min.js +0 -0
  95. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.js +0 -0
  96. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.min.js +0 -0
  97. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/vfs_fonts.js +0 -0
  98. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.css +0 -0
  99. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.min.css +0 -0
  100. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.js +0 -0
  101. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.min.js +0 -0
  102. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/jquery/jquery.min.js +0 -0
  103. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/LICENSE +0 -0
  104. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/README.md +0 -0
  105. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/multi.css +0 -0
  106. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/multi/multi.js +0 -0
  107. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/popper/popper.js +0 -0
  108. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/popper/popper.min.js +0 -0
  109. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.css +0 -0
  110. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.js +0 -0
  111. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/error_page.py +0 -0
  112. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/flash.py +0 -0
  113. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/form.py +0 -0
  114. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/logging.py +0 -0
  115. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/passwd.py +0 -0
  116. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/__init__.py +0 -0
  117. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/db.py +0 -0
  118. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/ldap.py +0 -0
  119. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/restapi.py +0 -0
  120. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/scheduler.py +0 -0
  121. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/smtp.py +0 -0
  122. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/__init__.py +0 -0
  123. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_db.py +0 -0
  124. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_ldap.py +0 -0
  125. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_scheduler.py +0 -0
  126. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_scheduler_db.py +0 -0
  127. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/plugins/tests/test_smtp.py +0 -0
  128. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_error_page.py +0 -0
  129. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_flash.py +0 -0
  130. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_form.py +0 -0
  131. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_passwd.py +0 -0
  132. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tests/test_url.py +0 -0
  133. {cherrypy_foundation-1.0.0a13/src/cherrypy_foundation/tests → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools}/__init__.py +0 -0
  134. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/auth.py +0 -0
  135. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/auth_mfa.py +0 -0
  136. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/errors.py +0 -0
  137. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/ratelimit.py +0 -0
  138. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/secure_headers.py +0 -0
  139. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/sessions_timeout.py +0 -0
  140. {cherrypy_foundation-1.0.0a13/src/cherrypy_foundation/tools → cherrypy_foundation-1.0.0a14/src/cherrypy_foundation/tools/tests}/__init__.py +0 -0
  141. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/components/Button.jinja +0 -0
  142. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.mo +0 -0
  143. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po +0 -0
  144. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo +0 -0
  145. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.po +0 -0
  146. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/locales/messages.pot +0 -0
  147. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_auth.py +0 -0
  148. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_auth_mfa.py +0 -0
  149. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/tools/tests/test_ratelimit.py +0 -0
  150. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation/widgets.py +0 -0
  151. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/dependency_links.txt +0 -0
  152. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/requires.txt +0 -0
  153. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/src/cherrypy_foundation.egg-info/top_level.txt +0 -0
  154. {cherrypy_foundation-1.0.0a13 → cherrypy_foundation-1.0.0a14}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a13
3
+ Version: 1.0.0a14
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -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">{% trans %}Toggle theme{% endtrans %}</span>
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
- {% trans %}Light{% endtrans %}
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
- {% trans %}Dark{% endtrans %}
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
- {% trans %}Auto{% endtrans %}
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
@@ -1,4 +1,5 @@
1
- <html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
2
3
  <head>
3
4
  <title>test-flash</title>
4
5
  </head>
@@ -1,4 +1,5 @@
1
- <html>
1
+ <!DOCTYPE html>
2
+ <html >
2
3
  <head>
3
4
  <title>test-form</title>
4
5
  </head>
@@ -1,4 +1,4 @@
1
- <html>
1
+ <html lang="en">
2
2
  <head>
3
3
  <title>test-url</title>
4
4
  </head>
@@ -296,6 +296,11 @@ def list_available_locales():
296
296
  """
297
297
  Return a list of available translations.
298
298
  """
299
+ return_value = []
300
+ # Always return the source code locale.
301
+ sourcecode_lang = _get_config('tools.i18n.sourcecode_lang', 'en')
302
+ return_value.append(Locale.parse(sourcecode_lang))
303
+ # Then scan language directory for more translation.
299
304
  mo_dir = _get_config('tools.i18n.mo_dir')
300
305
  domain = _get_config('tools.i18n.domain', 'messages')
301
306
  if not mo_dir:
@@ -303,9 +308,10 @@ def list_available_locales():
303
308
  for lang in os.listdir(mo_dir):
304
309
  if os.path.exists(os.path.join(mo_dir, lang, 'LC_MESSAGES', f'{domain}.mo')):
305
310
  try:
306
- yield Locale.parse(lang)
311
+ return_value.append(Locale.parse(lang))
307
312
  except Exception:
308
313
  continue
314
+ return return_value
309
315
 
310
316
 
311
317
  def list_available_timezones():
@@ -405,8 +411,6 @@ def _load_default(mo_dir, domain, default, **kwargs):
405
411
  # Clear current translation
406
412
  _preferred_lang.set(tuple())
407
413
  _preferred_timezone.set(tuple())
408
- cherrypy.request._i18n_lang_func = kwargs.get('lang', kwargs.get('func', False))
409
- cherrypy.request._i18n_tzinfo_func = kwargs.get('tzinfo', False)
410
414
  # Clear current translation
411
415
  _translation.set(None)
412
416
  # Clear current timezone
@@ -425,11 +429,40 @@ def _load_accept_language(**kwargs):
425
429
  _translation.set(None)
426
430
 
427
431
 
432
+ def _load_cookie_language(**kwargs):
433
+ """
434
+ Load preferred language from a request cookie.
435
+
436
+ Expected cookie value formats:
437
+ - en
438
+ - en_US
439
+ - en-US
440
+ """
441
+ # Skip this step if cookie name is not defined.
442
+ cookie_name = _get_config('tools.i18n.cookie_name')
443
+ if not cookie_name:
444
+ return
445
+
446
+ # Check if value defined in cookie.
447
+ cookie = cherrypy.request.cookie
448
+ if cookie_name not in cookie:
449
+ return
450
+
451
+ try:
452
+ value = cookie[cookie_name].value.replace('-', '_')
453
+ except Exception:
454
+ return
455
+
456
+ # Set preferred language and clear cached translation
457
+ _preferred_lang.set((value,))
458
+ _translation.set(None)
459
+
460
+
428
461
  def _load_func_language(**kwargs):
429
462
  """
430
463
  When running a request where a current user is found, load preferred language from user preferences.
431
464
  """
432
- func = getattr(cherrypy.request, '_i18n_lang_func', False)
465
+ func = _get_config('tools.i18n.lang', default=_get_config('tools.i18n.func'))
433
466
  if not func:
434
467
  return
435
468
  try:
@@ -448,7 +481,7 @@ def _load_func_tzinfo(**kwargs):
448
481
  """
449
482
  When running a request, load the preferred timezone information from user preferences.
450
483
  """
451
- func = getattr(cherrypy.request, '_i18n_tzinfo_func', False)
484
+ func = _get_config('tools.i18n.tzinfo')
452
485
  if not func:
453
486
  return
454
487
  try:
@@ -487,6 +520,7 @@ class I18nTool(cherrypy.Tool):
487
520
  cherrypy.Tool._setup(self)
488
521
  # Attach additional hooks as different priority to update preferred lang with more accurate preferences.
489
522
  cherrypy.request.hooks.attach('before_handler', _load_accept_language, priority=60)
523
+ cherrypy.request.hooks.attach('before_handler', _load_cookie_language, priority=70)
490
524
  cherrypy.request.hooks.attach('before_handler', _load_func_language, priority=75)
491
525
  cherrypy.request.hooks.attach('before_handler', _load_func_tzinfo, priority=75)
492
526
  cherrypy.request.hooks.attach('before_finalize', _set_content_language)
@@ -80,7 +80,17 @@ class Jinja2Tool(cherrypy.Tool):
80
80
 
81
81
  # Enable translation if available
82
82
  if hasattr(cherrypy.tools, 'i18n'):
83
- from .i18n import format_date, format_datetime, get_language_name, get_translation, ugettext, ungettext
83
+ from .i18n import (
84
+ format_date,
85
+ format_datetime,
86
+ get_language_name,
87
+ get_timezone_name,
88
+ get_translation,
89
+ list_available_locales,
90
+ list_available_timezones,
91
+ ugettext,
92
+ ungettext,
93
+ )
84
94
 
85
95
  env.add_extension('jinja2.ext.i18n')
86
96
  env.install_gettext_callables(ugettext, ungettext, newstyle=True)
@@ -88,6 +98,9 @@ class Jinja2Tool(cherrypy.Tool):
88
98
  env.filters['format_datetime'] = format_datetime
89
99
  env.globals['get_language_name'] = get_language_name
90
100
  env.globals['get_translation'] = get_translation
101
+ env.globals['list_available_locales'] = list_available_locales
102
+ env.globals['list_available_timezones'] = list_available_timezones
103
+ env.globals['get_timezone_name'] = get_timezone_name
91
104
 
92
105
  # Update globals, filters and tests
93
106
  env.globals.update(globals)
@@ -1,4 +1,5 @@
1
- <html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
2
3
  <head>
3
4
  <title>test-jinja2</title>
4
5
  </head>
@@ -1,6 +1,7 @@
1
- <html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
2
3
  <head>
3
- <title>test-jinja2</title>
4
+ <title>test-jinjax</title>
4
5
  </head>
5
6
  <body>
6
7
  <Button link="http://example.com" label="foo" />
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE html>
2
+ <html lang="{{ get_translation().locale }}">
3
+ <head>
4
+ <title>test-jinja2</title>
5
+ {{ catalog.render_assets() }}
6
+ </head>
7
+ <body>
8
+ <!-- Selector -->
9
+ <div class="dropdown">
10
+ <button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
11
+ Dropdown button
12
+ </button>
13
+ <ul class="dropdown-menu">
14
+ <LocaleSelection />
15
+ </ul>
16
+ </div>
17
+ {{ get_language_name(get_translation().locale) }}<br/>
18
+ {% trans %}Some text to translate{% endtrans %}<br/>
19
+ {{ my_datetime | format_datetime(format='full') }}<br/>
20
+ {{ my_date | format_date(format='full') }}
21
+ </body>
22
+ </html>
@@ -76,6 +76,7 @@ class AbstractI18nTest(helper.CPWebCase):
76
76
  'tools.i18n.default': cls.default_lang,
77
77
  'tools.i18n.mo_dir': importlib.resources.files(__package__) / 'locales',
78
78
  'tools.i18n.domain': 'messages',
79
+ 'tools.i18n.cookie_name': 'locale',
79
80
  }
80
81
  )
81
82
  cherrypy.tree.mount(Root(), '/')
@@ -124,6 +125,13 @@ class TestI18nWebCase(AbstractI18nTest):
124
125
  # Tehn page return en-US
125
126
  self.assertHeaderItemValue("Content-Language", "en-US")
126
127
 
128
+ def test_cookie_fr(self):
129
+ # When calling with locale variant
130
+ self.getPage("/", headers=[("Accept-Language", "en-US"), ("Cookie", "locale=fr")])
131
+ self.assertStatus('200 OK')
132
+ # Tehn page return en-US
133
+ self.assertHeaderItemValue("Content-Language", "fr")
134
+
127
135
  def test_with_preferred_lang(self):
128
136
  # Given a default lang 'en'
129
137
  date = datetime.fromtimestamp(1680111611, timezone.utc)
@@ -175,6 +183,23 @@ class TestI18nWebCase(AbstractI18nTest):
175
183
  with i18n.preferred_lang('de_CH'):
176
184
  self.assertEqual('29. März 2023, 19:40:11 MESZ', i18n.format_datetime(date, format='long'))
177
185
 
186
+ def test_list_available_locales(self):
187
+ self.assertEqual(['de', 'en', 'fr'], sorted([str(l) for l in i18n.list_available_locales()]))
188
+
189
+ def test_list_available_timezones(self):
190
+ timezones = i18n.list_available_timezones()
191
+ self.assertIn('America/Toronto', timezones)
192
+
193
+ def test_get_timezone_name(self):
194
+ with i18n.preferred_lang('en'):
195
+ self.assertEqual('Eastern Time', i18n.get_timezone_name('America/Toronto'))
196
+ self.assertEqual('ET', i18n.get_timezone_name('America/Toronto', width='short'))
197
+ self.assertEqual('Eastern Time', i18n.get_timezone_name('America/Toronto', width='long'))
198
+ with i18n.preferred_lang('fr'):
199
+ self.assertEqual('heure de l’Est nord-américain', i18n.get_timezone_name('America/Toronto'))
200
+ self.assertEqual('HE', i18n.get_timezone_name('America/Toronto', width='short'))
201
+ self.assertEqual('heure de l’Est nord-américain', i18n.get_timezone_name('America/Toronto', width='long'))
202
+
178
203
 
179
204
  class TestI18nDefaultLangWebCase(AbstractI18nTest):
180
205
  default_lang = 'FR'
@@ -21,6 +21,10 @@ import cherrypy
21
21
  from cherrypy.test import helper
22
22
  from parameterized import parameterized
23
23
 
24
+ from cherrypy_foundation.components import StaticMiddleware
25
+ from cherrypy_foundation.tests import SeleniumUnitTest
26
+ from cherrypy_foundation.url import url_for
27
+
24
28
  from .. import i18n # noqa
25
29
  from .. import jinja2 # noqa
26
30
 
@@ -38,9 +42,18 @@ def extra_processor():
38
42
  return {'var2': 'bar'}
39
43
 
40
44
 
41
- @cherrypy.tools.jinja2(env=env, extra_processor=extra_processor)
45
+ @cherrypy.tools.i18n(on=False)
46
+ @cherrypy.tools.sessions(on=False)
47
+ class Static:
48
+
49
+ components = StaticMiddleware()
50
+
51
+
52
+ @cherrypy.tools.jinja2(on=False, env=env, extra_processor=extra_processor)
42
53
  class Root:
43
54
 
55
+ static = Static()
56
+
44
57
  @cherrypy.expose
45
58
  @cherrypy.tools.jinja2(template='test_jinja2.html')
46
59
  def index(self):
@@ -52,12 +65,13 @@ class Root:
52
65
  return {'var1': 'test-jinjax'}
53
66
 
54
67
  @cherrypy.expose
55
- @cherrypy.tools.jinja2(template='test_jinja2_i18n.html')
68
+ @cherrypy.tools.jinja2(template='test_jinjax_i18n.html')
56
69
  @cherrypy.tools.i18n(
57
70
  default='fr',
58
71
  default_timezone='America/Toronto',
59
72
  mo_dir=importlib.resources.files(__package__) / 'locales',
60
73
  domain='messages',
74
+ cookie_name='locale', # For LocaleSelection
61
75
  )
62
76
  def localized(self):
63
77
  return {
@@ -66,7 +80,7 @@ class Root:
66
80
  }
67
81
 
68
82
 
69
- class Jinja2Test(helper.CPWebCase):
83
+ class Jinja2Test(helper.CPWebCase, SeleniumUnitTest):
70
84
  default_lang = None
71
85
  interactive = False
72
86
 
@@ -95,6 +109,7 @@ class Jinja2Test(helper.CPWebCase):
95
109
  # Then the page is render dynamically using page context
96
110
  self.assertInBody('<a class="btn btn-primary" href="http://example.com">foo</a>')
97
111
 
112
+ @skipUnless(HAS_JINJAX, reason='Required jinjax')
98
113
  @parameterized.expand(
99
114
  [
100
115
  ('server_default', {}, 'fr'),
@@ -121,3 +136,18 @@ class Jinja2Test(helper.CPWebCase):
121
136
  self.assertInBody('Some text to translate')
122
137
  self.assertInBody('Wednesday, November 26, 2025, 6:16:00\u202fAM Eastern Standard Time')
123
138
  self.assertInBody('Monday, December 22, 2025')
139
+
140
+ @skipUnless(HAS_JINJAX, reason='Required jinjax')
141
+ def test_get_page_i18n_selenium(self):
142
+ # Given a localized page render with jinja2
143
+ with self.selenium() as driver:
144
+ # When querying the page
145
+ driver.get(url_for('localized'))
146
+ # Then page load without error in english (enforced chronium lang)
147
+ self.assertFalse(driver.get_log('browser'))
148
+ self.assertEqual('en_US', driver.find_element('css selector', 'html').get_attribute('lang'))
149
+ # When user select a language
150
+ btn = driver.find_element('css selector', 'button[data-locale=fr]')
151
+ btn.click()
152
+ # Then page is reloaded with in French.
153
+ self.assertEqual('fr', driver.find_element('css selector', 'html').get_attribute('lang'))
@@ -60,8 +60,7 @@ def url_for(*args, _relative=None, _base=None, **kwargs):
60
60
  elif not path.startswith('.'):
61
61
  path = urljoin('/', path)
62
62
  # Outside a request, use cherrypy.tools.proxy config
63
- if not cherrypy.request.app:
64
- if _base is None:
65
- _base = cherrypy.config.get('tools.proxy.base', None)
63
+ if not cherrypy.request.app and _base is None:
64
+ _base = cherrypy.config.get('tools.proxy.base', None)
66
65
  # Use cherrypy to build the URL
67
66
  return cherrypy.url(path=path, qs=qs, relative=_relative, base=_base)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a13
3
+ Version: 1.0.0a14
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -38,6 +38,8 @@ src/cherrypy_foundation/components/Field.js
38
38
  src/cherrypy_foundation/components/Fields.jinja
39
39
  src/cherrypy_foundation/components/Flash.jinja
40
40
  src/cherrypy_foundation/components/Icon.jinja
41
+ src/cherrypy_foundation/components/LocaleSelection.jinja
42
+ src/cherrypy_foundation/components/LocaleSelection.js
41
43
  src/cherrypy_foundation/components/SideBySideMultiSelect.css
42
44
  src/cherrypy_foundation/components/SideBySideMultiSelect.jinja
43
45
  src/cherrypy_foundation/components/SideBySideMultiSelect.js
@@ -144,5 +146,5 @@ src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po
144
146
  src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo
145
147
  src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.po
146
148
  src/cherrypy_foundation/tools/tests/templates/test_jinja2.html
147
- src/cherrypy_foundation/tools/tests/templates/test_jinja2_i18n.html
148
- src/cherrypy_foundation/tools/tests/templates/test_jinjax.html
149
+ src/cherrypy_foundation/tools/tests/templates/test_jinjax.html
150
+ src/cherrypy_foundation/tools/tests/templates/test_jinjax_i18n.html
@@ -1,11 +0,0 @@
1
- <html lang="{{ get_translation().locale }}">
2
- <head>
3
- <title>test-jinja2</title>
4
- </head>
5
- <body>
6
- {{ get_language_name(get_translation().locale) }}<br/>
7
- {% trans %}Some text to translate{% endtrans %}<br/>
8
- {{ my_datetime | format_datetime(format='full') }}<br/>
9
- {{ my_date | format_date(format='full') }}
10
- </body>
11
- </html>