cherrypy-foundation 1.0.0a9__tar.gz → 1.0.0a11__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 (152) hide show
  1. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/.gitlab-ci.yml +26 -0
  2. {cherrypy_foundation-1.0.0a9/src/cherrypy_foundation.egg-info → cherrypy_foundation-1.0.0a11}/PKG-INFO +1 -1
  3. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Field.jinja +2 -2
  4. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/ldap.py +4 -2
  5. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/scheduler.py +13 -2
  6. cherrypy_foundation-1.0.0a11/src/cherrypy_foundation/plugins/tests/test_scheduler_db.py +107 -0
  7. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/i18n.py +7 -4
  8. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/test_i18n.py +1 -1
  9. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11/src/cherrypy_foundation.egg-info}/PKG-INFO +1 -1
  10. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation.egg-info/SOURCES.txt +1 -0
  11. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/.gitignore +0 -0
  12. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/LICENSE.md +0 -0
  13. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/README.md +0 -0
  14. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/TODO +0 -0
  15. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/changelog +0 -0
  16. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/control +0 -0
  17. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/copyright +0 -0
  18. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/python3-cherrypy-foundation.docs +0 -0
  19. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/python3-cherrypy-foundation.links +0 -0
  20. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/rules +0 -0
  21. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/source/format +0 -0
  22. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/source/options +0 -0
  23. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/debian/upstream/metadata +0 -0
  24. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/pyproject.toml +0 -0
  25. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/setup.cfg +0 -0
  26. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/sonar-project.properties +0 -0
  27. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/__init__.py +0 -0
  28. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/ColorModes.jinja +0 -0
  29. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Datatable.css +0 -0
  30. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Datatable.jinja +0 -0
  31. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Datatable.js +0 -0
  32. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Field.css +0 -0
  33. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Field.js +0 -0
  34. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Fields.jinja +0 -0
  35. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Flash.jinja +0 -0
  36. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Icon.jinja +0 -0
  37. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/SideBySideMultiSelect.css +0 -0
  38. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/SideBySideMultiSelect.jinja +0 -0
  39. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/SideBySideMultiSelect.js +0 -0
  40. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Typeahead.css +0 -0
  41. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Typeahead.jinja +0 -0
  42. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/Typeahead.js +0 -0
  43. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/__init__.py +0 -0
  44. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/tests/__init__.py +0 -0
  45. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/tests/test_static.py +0 -0
  46. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.css +0 -0
  47. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap-icons/bootstrap-icons.min.css +0 -0
  48. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff +0 -0
  49. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap-icons/fonts/bootstrap-icons.woff2 +0 -0
  50. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css +0 -0
  51. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.css.map +0 -0
  52. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css +0 -0
  53. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/css/bootstrap.min.css.map +0 -0
  54. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js +0 -0
  55. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.js.map +0 -0
  56. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js +0 -0
  57. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/js/bootstrap.min.js.map +0 -0
  58. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/bootstrap5/js/color-modes.js +0 -0
  59. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.css +0 -0
  60. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/css/dataTables.dataTables.min.css +0 -0
  61. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc.png +0 -0
  62. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/images/sort_asc_disabled.png +0 -0
  63. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/images/sort_both.png +0 -0
  64. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc.png +0 -0
  65. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/images/sort_desc_disabled.png +0 -0
  66. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.js +0 -0
  67. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables/js/dataTables.min.js +0 -0
  68. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.css +0 -0
  69. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/css/buttons.dataTables.min.css +0 -0
  70. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.js +0 -0
  71. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/buttons.html5.min.js +0 -0
  72. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.js +0 -0
  73. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Buttons/js/dataTables.buttons.min.js +0 -0
  74. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.css +0 -0
  75. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/css/fixedHeader.dataTables.min.css +0 -0
  76. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.js +0 -0
  77. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/FixedHeader/js/dataTables.fixedHeader.min.js +0 -0
  78. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.js +0 -0
  79. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/JSZip/jszip.min.js +0 -0
  80. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.css +0 -0
  81. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/css/responsive.dataTables.min.css +0 -0
  82. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.js +0 -0
  83. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/Responsive/js/dataTables.responsive.min.js +0 -0
  84. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.js +0 -0
  85. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/pdfmake.min.js +0 -0
  86. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/pdfmake/build/vfs_fonts.js +0 -0
  87. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.css +0 -0
  88. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/css/rowGroup.dataTables.min.css +0 -0
  89. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.js +0 -0
  90. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/datatables-extensions/rowgroup/js/dataTables.rowGroup.min.js +0 -0
  91. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/jquery/jquery.min.js +0 -0
  92. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/multi/LICENSE +0 -0
  93. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/multi/README.md +0 -0
  94. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/multi/multi.css +0 -0
  95. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/multi/multi.js +0 -0
  96. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/popper/popper.js +0 -0
  97. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/popper/popper.min.js +0 -0
  98. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.css +0 -0
  99. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/components/vendor/typeahead/jquery.typeahead.min.js +0 -0
  100. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/error_page.py +0 -0
  101. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/flash.py +0 -0
  102. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/form.py +0 -0
  103. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/logging.py +0 -0
  104. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/passwd.py +0 -0
  105. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/__init__.py +0 -0
  106. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/db.py +0 -0
  107. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/restapi.py +0 -0
  108. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/smtp.py +0 -0
  109. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/tests/__init__.py +0 -0
  110. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/tests/test_db.py +0 -0
  111. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/tests/test_ldap.py +0 -0
  112. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/tests/test_scheduler.py +0 -0
  113. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/plugins/tests/test_smtp.py +0 -0
  114. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/__init__.py +0 -0
  115. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/templates/test_flash.html +0 -0
  116. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/templates/test_form.html +0 -0
  117. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/templates/test_url.html +0 -0
  118. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/test_error_page.py +0 -0
  119. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/test_flash.py +0 -0
  120. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/test_form.py +0 -0
  121. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/test_passwd.py +0 -0
  122. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tests/test_url.py +0 -0
  123. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/__init__.py +0 -0
  124. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/auth.py +0 -0
  125. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/auth_mfa.py +0 -0
  126. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/errors.py +0 -0
  127. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/jinja2.py +0 -0
  128. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/ratelimit.py +0 -0
  129. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/secure_headers.py +0 -0
  130. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/sessions_timeout.py +0 -0
  131. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/__init__.py +0 -0
  132. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/components/Button.jinja +0 -0
  133. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.mo +0 -0
  134. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/de/LC_MESSAGES/messages.po +0 -0
  135. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.mo +0 -0
  136. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/en/LC_MESSAGES/messages.po +0 -0
  137. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.mo +0 -0
  138. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/fr/LC_MESSAGES/messages.po +0 -0
  139. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/locales/messages.pot +0 -0
  140. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/templates/test_jinja2.html +0 -0
  141. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/templates/test_jinja2_i18n.html +0 -0
  142. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/templates/test_jinjax.html +0 -0
  143. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/test_auth.py +0 -0
  144. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/test_auth_mfa.py +0 -0
  145. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/test_jinja2.py +0 -0
  146. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/tools/tests/test_ratelimit.py +0 -0
  147. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/url.py +0 -0
  148. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation/widgets.py +0 -0
  149. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation.egg-info/dependency_links.txt +0 -0
  150. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation.egg-info/requires.txt +0 -0
  151. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/src/cherrypy_foundation.egg-info/top_level.txt +0 -0
  152. {cherrypy_foundation-1.0.0a9 → cherrypy_foundation-1.0.0a11}/tox.ini +0 -0
@@ -111,3 +111,29 @@ publish:wheel:
111
111
  if [ ! -z "$CI_COMMIT_TAG" ]; then
112
112
  twine upload dist/*.whl dist/*.tar.gz -u $PYPI_USR -p $PYPI_PWD
113
113
  fi
114
+
115
+ publish:deb:
116
+ needs:
117
+ - package:deb
118
+ only:
119
+ variables:
120
+ - $NEXUS_USR
121
+ - $NEXUS_PWD
122
+ parallel:
123
+ matrix:
124
+ - DIST: trixie
125
+ script: |
126
+ set -e
127
+ set -x
128
+ if [[ "$CI_COMMIT_TAG" == *.+([0-9]) ]]; then
129
+ APT_URL="$NEXUS_URL/repository/apt-release-${DIST}/"
130
+ APT_COMPONENT=${DIST}
131
+ else
132
+ APT_URL="$NEXUS_URL/repository/apt-dev-${DIST}/"
133
+ APT_COMPONENT=${DIST}-dev
134
+ fi
135
+ export FILE=$(ls -1 ./dist/$DIST/python3-cherrypy-foundation*.deb)
136
+ curl --fail -u "$NEXUS_USR:$NEXUS_PWD" -H "Content-Type: multipart/form-data" --data-binary "@$FILE" "$APT_URL"
137
+ sleep 2
138
+ curl --fail ${APT_URL}dists/$APT_COMPONENT/main/binary-all/Packages | grep "$(basename $FILE)"
139
+ stage: publish
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a9
3
+ Version: 1.0.0a11
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -40,10 +40,10 @@
40
40
  {% set label_attrs = attrs.__class__({'class': label_class}) %}
41
41
  {% for key, value in attrs.as_dict.items() %}
42
42
  {% if key.startswith('container-') or key.startswith('container_') %}
43
- {% do container_attrs.set(**{key[10:]: value}) %}
43
+ {% do container_attrs.set(**{key[10:]: value|string}) %}
44
44
  {% endif %}
45
45
  {% if key.startswith('label-') or key.startswith('label_') %}
46
- {% do label_attrs.set(**{key[6:]: value}) %}
46
+ {% do label_attrs.set(**{key[6:]: value|string}) %}
47
47
  {% endif %}
48
48
  {% endfor %}
49
49
  <div {{ container_attrs.as_dict | xmlattr }}>
@@ -26,7 +26,7 @@ _safe = ldap3.utils.conv.escape_filter_chars
26
26
 
27
27
  def all_attribute(attributes, keys, default=None):
28
28
  """
29
- Extract the all value from LDAP attributes.
29
+ Extract all values from LDAP attributes.
30
30
  """
31
31
  # Skip loopkup if key is not defined.
32
32
  if not keys:
@@ -61,7 +61,9 @@ def first_attribute(attributes, keys, default=None):
61
61
  for attr in keys:
62
62
  try:
63
63
  value = attributes[attr]
64
- if isinstance(value, list) and len(value) > 0:
64
+ if isinstance(value, list):
65
+ if len(value) == 0:
66
+ pass
65
67
  return value[0]
66
68
  else:
67
69
  return value
@@ -35,7 +35,6 @@ def clear_db_sessions(func):
35
35
 
36
36
  @wraps(func)
37
37
  def func_wrapper(*args, **kwargs):
38
- cherrypy.db.clear_sessions()
39
38
  try:
40
39
  result = func(*args, **kwargs)
41
40
  finally:
@@ -206,6 +205,7 @@ class Scheduler(SimplePlugin):
206
205
  """
207
206
  hour, minute = execution_time.split(':', 2)
208
207
  return self.add_job(
208
+ id=getattr(func, '__name__', str(func)),
209
209
  func=func,
210
210
  name=getattr(func, '__name__', str(func)),
211
211
  args=args,
@@ -214,6 +214,8 @@ class Scheduler(SimplePlugin):
214
214
  hour=hour,
215
215
  minute=minute,
216
216
  misfire_grace_time=None,
217
+ coalesce=True,
218
+ replace_existing=True,
217
219
  )
218
220
 
219
221
  def add_job_now(self, func, *args, **kwargs):
@@ -243,20 +245,29 @@ class Scheduler(SimplePlugin):
243
245
  Remove the given job from scheduler.
244
246
  """
245
247
  # Search for a matching job
248
+ return_value = False
249
+ if self._scheduler is None:
250
+ return return_value
246
251
  for j in self._scheduler.get_jobs(jobstore=jobstore):
247
- if j.func == job:
252
+ if j.func == job or j.name == job:
248
253
  self._scheduler.remove_job(job_id=j.id, jobstore=jobstore)
254
+ return_value = True
255
+ return return_value
249
256
 
250
257
  def remove_all_jobs(self, jobstore=None):
251
258
  """
252
259
  Remove all jobs from scheduler.
253
260
  """
261
+ if self._scheduler is None:
262
+ return
254
263
  self._scheduler.remove_all_jobs(jobstore=jobstore)
255
264
 
256
265
  def wait_for_jobs(self, jobstore=None):
257
266
  """
258
267
  Used to wait for all running jobs to complete.
259
268
  """
269
+ if self._scheduler is None:
270
+ return
260
271
  # Wait until the queue is empty.
261
272
  while any(
262
273
  job for job in self._scheduler.get_jobs(jobstore=jobstore) if job.next_run_time < datetime.now(timezone.utc)
@@ -0,0 +1,107 @@
1
+ # Scheduler plugins for Cherrypy
2
+ # Copyright (C) 2025 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
+ import importlib
17
+ import tempfile
18
+ from threading import Event
19
+
20
+ import cherrypy
21
+ from cherrypy.test import helper
22
+
23
+ from .. import scheduler # noqa
24
+
25
+ done = Event()
26
+
27
+ HAS_SQLALCHEMY = importlib.util.find_spec("sqlalchemy") is not None
28
+ if not HAS_SQLALCHEMY:
29
+ pass
30
+ else:
31
+ from sqlalchemy import Column, Integer, String
32
+ from sqlalchemy.exc import IntegrityError
33
+
34
+ from .. import db # noqa
35
+
36
+ Base = cherrypy.db.get_base()
37
+
38
+ class User2(Base):
39
+ __tablename__ = 'users2'
40
+ id = Column(Integer, primary_key=True)
41
+ username = Column(String)
42
+
43
+ def __repr__(self):
44
+ return f"User2(id={self.id}, username='{self.username}')"
45
+
46
+ class Root:
47
+
48
+ @cherrypy.expose
49
+ def index(self):
50
+ return str(User2.query.all())
51
+
52
+ @cherrypy.expose
53
+ def add(self, username):
54
+ try:
55
+ User2(username=username).add().commit()
56
+ return "OK"
57
+ except IntegrityError as e:
58
+ return str(e)
59
+
60
+ def create_user(*args, **kwargs):
61
+ user = User2(*args, **kwargs).add()
62
+ user.commit()
63
+ done.set()
64
+
65
+
66
+ class DbSchedulerPluginTest(helper.CPWebCase):
67
+ interactive = False
68
+
69
+ @classmethod
70
+ def setup_class(cls):
71
+ cls.tempdir = tempfile.TemporaryDirectory(prefix='cherrypy-foundation-', suffix='-db-test')
72
+ super().setup_class()
73
+
74
+ @classmethod
75
+ def teardown_class(cls):
76
+ cls.tempdir.cleanup()
77
+ super().teardown_class()
78
+
79
+ @classmethod
80
+ def setup_server(cls):
81
+ cherrypy.config.update(
82
+ {
83
+ 'db.uri': f"sqlite:///{cls.tempdir.name}/data.db",
84
+ }
85
+ )
86
+ cherrypy.tree.mount(Root(), '/')
87
+
88
+ def setUp(self) -> None:
89
+ done.clear()
90
+ cherrypy.db.create_all()
91
+ return super().setUp()
92
+
93
+ def tearDown(self):
94
+ cherrypy.db.drop_all()
95
+ return super().tearDown()
96
+
97
+ def test_add_job_now(self):
98
+ # Given a task
99
+ # When scheduling that task
100
+ scheduled = cherrypy.engine.publish('scheduler:add_job_now', create_user, username='myuser')
101
+ self.assertTrue(scheduled)
102
+ # When waiting for all tasks
103
+ cherrypy.scheduler.wait_for_jobs()
104
+ # Then the task get called
105
+ self.assertTrue(done.is_set())
106
+ # Then database was updated
107
+ User2.query.filter(User2.username == 'myuser').one()
@@ -186,10 +186,13 @@ def _search_translation(dirname, domain, *locales):
186
186
  # Assign prefered local to this translation to know the current locale.
187
187
  trans_locale = Locale.parse(t.files[0].split('/')[-3])
188
188
  for locale in locales:
189
- locale = Locale.parse(locale)
190
- if trans_locale == locale or trans_locale.language == locale.language:
191
- t.locale = locale
192
- break
189
+ try:
190
+ locale = Locale.parse(locale)
191
+ if trans_locale == locale or trans_locale.language == locale.language:
192
+ t.locale = locale
193
+ break
194
+ except ValueError:
195
+ continue # Invalid locale identifier
193
196
  return t
194
197
 
195
198
 
@@ -150,7 +150,7 @@ class TestI18nWebCase(AbstractI18nTest):
150
150
  with i18n.preferred_lang('de_CH'):
151
151
  self.assertEqual('29. März 2023, 17:40:11 UTC', i18n.format_datetime(date, format='long'))
152
152
 
153
- with i18n.preferred_timezone('CET'):
153
+ with i18n.preferred_timezone('Europe/Paris'):
154
154
  with i18n.preferred_lang('fr'):
155
155
  self.assertEqual('29 mars 2023, 19:40:11 +0200', i18n.format_datetime(date, format='long'))
156
156
  with i18n.preferred_lang('fr_CH'):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cherrypy-foundation
3
- Version: 1.0.0a9
3
+ Version: 1.0.0a11
4
4
  Summary: CherryPy Foundation
5
5
  Author-email: Patrik Dufresne <patrik@ikus-soft.com>
6
6
  License: GPLv3
@@ -111,6 +111,7 @@ src/cherrypy_foundation/plugins/tests/__init__.py
111
111
  src/cherrypy_foundation/plugins/tests/test_db.py
112
112
  src/cherrypy_foundation/plugins/tests/test_ldap.py
113
113
  src/cherrypy_foundation/plugins/tests/test_scheduler.py
114
+ src/cherrypy_foundation/plugins/tests/test_scheduler_db.py
114
115
  src/cherrypy_foundation/plugins/tests/test_smtp.py
115
116
  src/cherrypy_foundation/tests/__init__.py
116
117
  src/cherrypy_foundation/tests/test_error_page.py