WuttaWeb 0.14.1__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.
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/CHANGELOG.md +18 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/PKG-INFO +2 -3
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/pyproject.toml +2 -2
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/forms/base.py +1 -1
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/appinfo/index.mako +2 -2
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/base.mako +3 -1
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/util.py +1 -1
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/auth.py +3 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/users.py +9 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_auth.py +9 -2
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_users.py +20 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/.gitignore +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/COPYING.txt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/README.md +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/Makefile +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/_static/.keepme +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.app.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.auth.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.conf.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.continuum.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.db.sess.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.base.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.schema.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.forms.widgets.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.base.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.filters.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.grids.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.handler.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.helpers.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.menus.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.progress.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.static.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.subscribers.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.util.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.auth.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.base.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.common.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.essential.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.master.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.people.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.progress.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.roles.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.settings.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.upgrades.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/api/wuttaweb.views.users.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/conf.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/glossary.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/index.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/make.bat +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/narr/templates/base.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/narr/templates/index.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/narr/templates/lookup.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/docs/narr/templates/overview.rst +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/_version.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/app.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/auth.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/conf.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/db/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/db/continuum.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/db/sess.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/email/templates/feedback.html.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/email/templates/feedback.txt.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/forms/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/forms/schema.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/forms/widgets.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/grids/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/grids/base.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/grids/filters.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/handler.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/helpers.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/menus.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/progress.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/static/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/static/img/favicon.ico +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/static/img/logo.png +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/static/img/testing.png +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/subscribers.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/appinfo/configure.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/auth/change_password.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/auth/login.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/base_meta.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/configure.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checkbox.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checkbox_choice.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/checked_password.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/moneyinput.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/password.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/permissions.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/checkbox.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/filedownload.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/notes.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/objectref.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/permissions.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/readonly/rolerefs.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/select.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/textarea.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/deform/textinput.pt +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/forbidden.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/form.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/forms/vue_template.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/grids/table_element.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/grids/vue_template.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/home.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/configure.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/create.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/delete.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/edit.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/form.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/index.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/master/view.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/notfound.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/page.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/people/view_profile.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/progress.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/setup.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrade.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrades/configure.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/upgrades/view.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/templates/wutta-components.mako +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/base.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/common.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/essential.py +2 -2
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/master.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/people.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/progress.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/roles.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/settings.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/src/wuttaweb/views/upgrades.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tasks.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/db/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/db/test_continuum.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/forms/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/forms/test_base.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/forms/test_schema.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/forms/test_widgets.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/grids/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/grids/test_base.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/grids/test_filters.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_fontawesome_svg_core.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_free_solid_svg_icons.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_oruga.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_oruga_bulma.css +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_oruga_bulma.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_vue.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/bb_vue_fontawesome.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/buefy.css +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/buefy.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/fontawesome.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/vue.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/libcache/vue_resource.js +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_app.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_auth.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_handler.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_helpers.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_menus.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_progress.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_static.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_subscribers.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/test_util.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/util.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/__init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test___init__.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_base.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_common.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_master.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_people.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_progress.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_roles.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_settings.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tests/views/test_upgrades.py +0 -0
- {wuttaweb-0.14.1 → wuttaweb-0.15.0}/tox.ini +0 -0
|
@@ -5,6 +5,24 @@ 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
|
+
|
|
19
|
+
## v0.14.2 (2024-11-24)
|
|
20
|
+
|
|
21
|
+
### Fix
|
|
22
|
+
|
|
23
|
+
- remove 'email' extra from wuttjamaican dependency
|
|
24
|
+
- omit `id` attr when rendering hidden input for CSRF token
|
|
25
|
+
|
|
8
26
|
## v0.14.1 (2024-08-30)
|
|
9
27
|
|
|
10
28
|
### Fix
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: WuttaWeb
|
|
3
|
-
Version: 0.
|
|
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
|
|
7
7
|
Project-URL: Changelog, https://forgejo.wuttaproject.org/wutta/wuttaweb/src/branch/master/CHANGELOG.md
|
|
8
8
|
Author-email: Lance Edgar <lance@edbob.org>
|
|
9
9
|
License: GNU GPL v3+
|
|
10
|
-
License-File: COPYING.txt
|
|
11
10
|
Classifier: Development Status :: 4 - Beta
|
|
12
11
|
Classifier: Environment :: Web Environment
|
|
13
12
|
Classifier: Framework :: Pyramid
|
|
@@ -36,7 +35,7 @@ Requires-Dist: pyramid-tm
|
|
|
36
35
|
Requires-Dist: pyramid>=2
|
|
37
36
|
Requires-Dist: waitress
|
|
38
37
|
Requires-Dist: webhelpers2
|
|
39
|
-
Requires-Dist: wuttjamaican[db
|
|
38
|
+
Requires-Dist: wuttjamaican[db]>=0.15.0
|
|
40
39
|
Requires-Dist: zope-sqlalchemy>=1.5
|
|
41
40
|
Provides-Extra: continuum
|
|
42
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.
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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>
|
|
@@ -473,7 +473,7 @@ def render_csrf_token(request, name='_csrf'):
|
|
|
473
473
|
See also :func:`get_csrf_token()`.
|
|
474
474
|
"""
|
|
475
475
|
token = get_csrf_token(request)
|
|
476
|
-
return HTML.tag('div', tags.hidden(name, value=token), style='display:none;')
|
|
476
|
+
return HTML.tag('div', tags.hidden(name, value=token, id=None), style='display:none;')
|
|
477
477
|
|
|
478
478
|
|
|
479
479
|
def get_model_fields(config, model_class=None):
|
|
@@ -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
|
-
#
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|