WuttaWeb 0.14.2__tar.gz → 0.15.0__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 (178) hide show
  1. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/CHANGELOG.md +11 -0
  2. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/PKG-INFO +2 -2
  3. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/pyproject.toml +2 -2
  4. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/forms/base.py +1 -1
  5. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/appinfo/index.mako +2 -2
  6. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/base.mako +3 -1
  7. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/auth.py +3 -0
  8. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/users.py +9 -0
  9. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_auth.py +9 -2
  10. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_users.py +20 -0
  11. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/.gitignore +0 -0
  12. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/COPYING.txt +0 -0
  13. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/README.md +0 -0
  14. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/Makefile +0 -0
  15. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/_static/.keepme +0 -0
  16. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.app.rst +0 -0
  17. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.auth.rst +0 -0
  18. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.conf.rst +0 -0
  19. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.continuum.rst +0 -0
  20. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.rst +0 -0
  21. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.sess.rst +0 -0
  22. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.base.rst +0 -0
  23. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.rst +0 -0
  24. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.schema.rst +0 -0
  25. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.widgets.rst +0 -0
  26. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.base.rst +0 -0
  27. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.filters.rst +0 -0
  28. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.rst +0 -0
  29. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.handler.rst +0 -0
  30. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.helpers.rst +0 -0
  31. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.menus.rst +0 -0
  32. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.progress.rst +0 -0
  33. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.rst +0 -0
  34. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.static.rst +0 -0
  35. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.subscribers.rst +0 -0
  36. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.util.rst +0 -0
  37. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.auth.rst +0 -0
  38. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.base.rst +0 -0
  39. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.common.rst +0 -0
  40. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.essential.rst +0 -0
  41. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.master.rst +0 -0
  42. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.people.rst +0 -0
  43. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.progress.rst +0 -0
  44. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.roles.rst +0 -0
  45. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.rst +0 -0
  46. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.settings.rst +0 -0
  47. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.upgrades.rst +0 -0
  48. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.users.rst +0 -0
  49. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/conf.py +0 -0
  50. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/glossary.rst +0 -0
  51. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/index.rst +0 -0
  52. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/make.bat +0 -0
  53. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/narr/templates/base.rst +0 -0
  54. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/narr/templates/index.rst +0 -0
  55. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/narr/templates/lookup.rst +0 -0
  56. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/docs/narr/templates/overview.rst +0 -0
  57. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/__init__.py +0 -0
  58. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/_version.py +0 -0
  59. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/app.py +0 -0
  60. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/auth.py +0 -0
  61. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/conf.py +0 -0
  62. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/db/__init__.py +0 -0
  63. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/db/continuum.py +0 -0
  64. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/db/sess.py +0 -0
  65. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/email/templates/feedback.html.mako +0 -0
  66. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/email/templates/feedback.txt.mako +0 -0
  67. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/forms/__init__.py +0 -0
  68. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/forms/schema.py +0 -0
  69. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/forms/widgets.py +0 -0
  70. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/grids/__init__.py +0 -0
  71. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/grids/base.py +0 -0
  72. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/grids/filters.py +0 -0
  73. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/handler.py +0 -0
  74. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/helpers.py +0 -0
  75. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/menus.py +0 -0
  76. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/progress.py +0 -0
  77. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/static/__init__.py +0 -0
  78. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/static/img/favicon.ico +0 -0
  79. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/static/img/logo.png +0 -0
  80. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/static/img/testing.png +0 -0
  81. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/subscribers.py +0 -0
  82. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/appinfo/configure.mako +0 -0
  83. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/auth/change_password.mako +0 -0
  84. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/auth/login.mako +0 -0
  85. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/base_meta.mako +0 -0
  86. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/configure.mako +0 -0
  87. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checkbox.pt +0 -0
  88. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checkbox_choice.pt +0 -0
  89. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checked_password.pt +0 -0
  90. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/moneyinput.pt +0 -0
  91. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/password.pt +0 -0
  92. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/permissions.pt +0 -0
  93. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/checkbox.pt +0 -0
  94. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/filedownload.pt +0 -0
  95. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/notes.pt +0 -0
  96. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/objectref.pt +0 -0
  97. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/permissions.pt +0 -0
  98. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/rolerefs.pt +0 -0
  99. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/select.pt +0 -0
  100. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/textarea.pt +0 -0
  101. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/textinput.pt +0 -0
  102. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/forbidden.mako +0 -0
  103. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/form.mako +0 -0
  104. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/forms/vue_template.mako +0 -0
  105. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/grids/table_element.mako +0 -0
  106. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/grids/vue_template.mako +0 -0
  107. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/home.mako +0 -0
  108. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/configure.mako +0 -0
  109. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/create.mako +0 -0
  110. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/delete.mako +0 -0
  111. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/edit.mako +0 -0
  112. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/form.mako +0 -0
  113. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/index.mako +0 -0
  114. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/view.mako +0 -0
  115. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/notfound.mako +0 -0
  116. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/page.mako +0 -0
  117. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/people/view_profile.mako +0 -0
  118. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/progress.mako +0 -0
  119. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/setup.mako +0 -0
  120. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrade.mako +0 -0
  121. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrades/configure.mako +0 -0
  122. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrades/view.mako +0 -0
  123. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/templates/wutta-components.mako +0 -0
  124. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/util.py +0 -0
  125. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/__init__.py +0 -0
  126. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/base.py +0 -0
  127. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/common.py +0 -0
  128. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/essential.py +2 -2
  129. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/master.py +0 -0
  130. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/people.py +0 -0
  131. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/progress.py +0 -0
  132. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/roles.py +0 -0
  133. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/settings.py +0 -0
  134. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/src/wuttaweb/views/upgrades.py +0 -0
  135. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tasks.py +0 -0
  136. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/__init__.py +0 -0
  137. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/db/__init__.py +0 -0
  138. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/db/test_continuum.py +0 -0
  139. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/forms/__init__.py +0 -0
  140. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/forms/test_base.py +0 -0
  141. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/forms/test_schema.py +0 -0
  142. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/forms/test_widgets.py +0 -0
  143. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/grids/__init__.py +0 -0
  144. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/grids/test_base.py +0 -0
  145. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/grids/test_filters.py +0 -0
  146. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_fontawesome_svg_core.js +0 -0
  147. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_free_solid_svg_icons.js +0 -0
  148. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_oruga.js +0 -0
  149. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_oruga_bulma.css +0 -0
  150. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_oruga_bulma.js +0 -0
  151. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_vue.js +0 -0
  152. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/bb_vue_fontawesome.js +0 -0
  153. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/buefy.css +0 -0
  154. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/buefy.js +0 -0
  155. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/fontawesome.js +0 -0
  156. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/vue.js +0 -0
  157. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/libcache/vue_resource.js +0 -0
  158. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_app.py +0 -0
  159. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_auth.py +0 -0
  160. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_handler.py +0 -0
  161. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_helpers.py +0 -0
  162. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_menus.py +0 -0
  163. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_progress.py +0 -0
  164. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_static.py +0 -0
  165. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_subscribers.py +0 -0
  166. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/test_util.py +0 -0
  167. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/util.py +0 -0
  168. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/__init__.py +0 -0
  169. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test___init__.py +0 -0
  170. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_base.py +0 -0
  171. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_common.py +0 -0
  172. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_master.py +0 -0
  173. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_people.py +0 -0
  174. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_progress.py +0 -0
  175. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_roles.py +0 -0
  176. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_settings.py +0 -0
  177. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tests/views/test_upgrades.py +0 -0
  178. {wuttaweb-0.14.2 → wuttaweb-0.15.0}/tox.ini +0 -0
@@ -5,6 +5,17 @@ All notable changes to wuttaweb will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## v0.15.0 (2024-11-24)
9
+
10
+ ### Feat
11
+
12
+ - add logic to prevent edit for some user accounts
13
+
14
+ ### Fix
15
+
16
+ - fix default form value logic for bool checkbox fields
17
+ - always use configured app dist for appinfo/index page
18
+
8
19
  ## v0.14.2 (2024-11-24)
9
20
 
10
21
  ### Fix
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: WuttaWeb
3
- Version: 0.14.2
3
+ Version: 0.15.0
4
4
  Summary: Web App for Wutta Framework
5
5
  Project-URL: Homepage, https://wuttaproject.org/
6
6
  Project-URL: Repository, https://forgejo.wuttaproject.org/wutta/wuttaweb
@@ -35,7 +35,7 @@ Requires-Dist: pyramid-tm
35
35
  Requires-Dist: pyramid>=2
36
36
  Requires-Dist: waitress
37
37
  Requires-Dist: webhelpers2
38
- Requires-Dist: wuttjamaican[db]>=0.14.0
38
+ Requires-Dist: wuttjamaican[db]>=0.15.0
39
39
  Requires-Dist: zope-sqlalchemy>=1.5
40
40
  Provides-Extra: continuum
41
41
  Requires-Dist: wutta-continuum; extra == 'continuum'
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "WuttaWeb"
9
- version = "0.14.2"
9
+ version = "0.15.0"
10
10
  description = "Web App for Wutta Framework"
11
11
  readme = "README.md"
12
12
  authors = [{name = "Lance Edgar", email = "lance@edbob.org"}]
@@ -42,7 +42,7 @@ dependencies = [
42
42
  "pyramid_tm",
43
43
  "waitress",
44
44
  "WebHelpers2",
45
- "WuttJamaican[db]>=0.14.0",
45
+ "WuttJamaican[db]>=0.15.0",
46
46
  "zope.sqlalchemy>=1.5",
47
47
  ]
48
48
 
@@ -1002,7 +1002,7 @@ class Form:
1002
1002
  # for now we explicitly translate here, ugh. also
1003
1003
  # note this does not yet allow for null values.. :(
1004
1004
  if isinstance(field.typ, colander.Boolean):
1005
- value = True if field.typ.true_val else False
1005
+ value = True if value == field.typ.true_val else False
1006
1006
 
1007
1007
  model_data[field.oid] = make_json_safe(value)
1008
1008
 
@@ -8,10 +8,10 @@
8
8
  <div class="panel-block">
9
9
  <div style="width: 100%;">
10
10
  <b-field horizontal label="Distribution">
11
- <span>${app.get_distribution(obj=app.get_web_handler()) or f'?? - set config for `{app.appname}.app_dist`'}</span>
11
+ <span>${app.get_distribution() or f'?? - set config for `{app.appname}.app_dist`'}</span>
12
12
  </b-field>
13
13
  <b-field horizontal label="Version">
14
- <span>${app.get_version(obj=app.get_web_handler()) or f'?? - set config for `{app.appname}.app_dist`'}</span>
14
+ <span>${app.get_version() or f'?? - set config for `{app.appname}.app_dist`'}</span>
15
15
  </b-field>
16
16
  <b-field horizontal label="App Title">
17
17
  <span>${app.get_title()}</span>
@@ -661,7 +661,9 @@
661
661
  </a>
662
662
  ${h.end_form()}
663
663
  % endif
664
- ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
664
+ % if request.is_root or not request.user.prevent_edit:
665
+ ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
666
+ % endif
665
667
  ${h.link_to("Logout", url('logout'), class_='navbar-item')}
666
668
  </div>
667
669
  </div>
@@ -157,6 +157,9 @@ class AuthView(View):
157
157
  if not self.request.user:
158
158
  return self.redirect(self.request.route_url('home'))
159
159
 
160
+ if self.request.user.prevent_edit:
161
+ raise self.forbidden()
162
+
160
163
  form = self.make_form(schema=self.change_password_make_schema(),
161
164
  show_button_cancel=False,
162
165
  show_button_reset=True)
@@ -95,6 +95,15 @@ class UserView(MasterView):
95
95
  if not user.active:
96
96
  return 'has-background-warning'
97
97
 
98
+ def is_editable(self, user):
99
+ """ """
100
+
101
+ # only root can edit certain users
102
+ if user.prevent_edit and not self.request.is_root:
103
+ return False
104
+
105
+ return True
106
+
98
107
  def configure_form(self, f):
99
108
  """ """
100
109
  super().configure_form(f)
@@ -80,11 +80,18 @@ class TestAuthView(WebTestCase):
80
80
  redirect = view.change_password()
81
81
  self.assertIsInstance(redirect, HTTPFound)
82
82
 
83
- # now "login" the user, and set initial password
84
- self.request.user = barney
83
+ # set initial password
85
84
  auth.set_user_password(barney, 'foo')
86
85
  self.session.commit()
87
86
 
87
+ # forbidden if prevent_edit is set for user
88
+ self.request.user = barney
89
+ barney.prevent_edit = True
90
+ self.assertRaises(HTTPForbidden, view.change_password)
91
+
92
+ # okay let's test with edit allowed
93
+ barney.prevent_edit = False
94
+
88
95
  # view should now return context w/ form
89
96
  context = view.change_password()
90
97
  self.assertIn('form', context)
@@ -42,6 +42,26 @@ class TestUserView(WebTestCase):
42
42
  user.active = False
43
43
  self.assertEqual(view.grid_row_class(user, data, 1), 'has-background-warning')
44
44
 
45
+ def test_is_editable(self):
46
+ model = self.app.model
47
+ view = self.make_view()
48
+
49
+ # active user is editable
50
+ user = model.User(username='barney', active=True)
51
+ self.assertTrue(view.is_editable(user))
52
+
53
+ # inactive also editable
54
+ user = model.User(username='barney', active=False)
55
+ self.assertTrue(view.is_editable(user))
56
+
57
+ # but not if prevent_edit flag is set
58
+ user = model.User(username='barney', prevent_edit=True)
59
+ self.assertFalse(view.is_editable(user))
60
+
61
+ # unless request user is root
62
+ self.request.is_root = True
63
+ self.assertTrue(view.is_editable(user))
64
+
45
65
  def test_configure_form(self):
46
66
  model = self.app.model
47
67
  barney = model.User(username='barney')
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -29,8 +29,8 @@ Most apps should include this module::
29
29
 
30
30
  That will in turn include the following modules:
31
31
 
32
- * :mod:`wuttaweb.views.auth`
33
32
  * :mod:`wuttaweb.views.common`
33
+ * :mod:`wuttaweb.views.auth`
34
34
  * :mod:`wuttaweb.views.settings`
35
35
  * :mod:`wuttaweb.views.progress`
36
36
  * :mod:`wuttaweb.views.people`
@@ -43,8 +43,8 @@ That will in turn include the following modules:
43
43
  def defaults(config, **kwargs):
44
44
  mod = lambda spec: kwargs.get(spec, spec)
45
45
 
46
- config.include(mod('wuttaweb.views.auth'))
47
46
  config.include(mod('wuttaweb.views.common'))
47
+ config.include(mod('wuttaweb.views.auth'))
48
48
  config.include(mod('wuttaweb.views.settings'))
49
49
  config.include(mod('wuttaweb.views.progress'))
50
50
  config.include(mod('wuttaweb.views.people'))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes