WuttaWeb 0.19.2__tar.gz → 0.19.3__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.19.2 → wuttaweb-0.19.3}/CHANGELOG.md +8 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/PKG-INFO +2 -2
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/pyproject.toml +2 -2
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/forms/schema.py +31 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/configure.mako +3 -3
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/wutta-components.mako +145 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/master.py +1 -1
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/forms/test_schema.py +19 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/.gitignore +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/COPYING.txt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/README.md +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/Makefile +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/_static/.keepme +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.app.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.auth.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.cli.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.cli.webapp.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.conf.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.db.continuum.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.db.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.db.sess.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.emails.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.forms.base.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.forms.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.forms.schema.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.forms.widgets.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.grids.base.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.grids.filters.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.grids.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.handler.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.helpers.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.menus.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.progress.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.static.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.subscribers.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.util.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.auth.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.base.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.batch.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.common.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.email.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.essential.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.master.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.people.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.progress.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.roles.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.settings.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.upgrades.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/api/wuttaweb.views.users.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/conf.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/glossary.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/index.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/make.bat +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/cli/builtin.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/cli/index.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/templates/base.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/templates/index.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/templates/lookup.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/docs/narr/templates/overview.rst +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/_version.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/app.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/auth.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/cli/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/cli/webapp.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/conf.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/db/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/db/continuum.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/db/sess.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/email-templates/feedback.html.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/email-templates/feedback.txt.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/emails.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/forms/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/forms/base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/forms/widgets.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/grids/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/grids/base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/grids/filters.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/handler.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/helpers.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/menus.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/progress.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/static/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/static/img/favicon.ico +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/static/img/logo.png +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/static/img/testing.png +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/subscribers.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/appinfo/configure.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/appinfo/index.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/auth/change_password.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/auth/login.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/base.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/base_meta.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/batch/view.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/checkbox.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/checkbox_choice.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/checked_password.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/dateinput.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/datetimeinput.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/moneyinput.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/password.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/permissions.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/checkbox.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/email_recips.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/filedownload.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/notes.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/objectref.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/permissions.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/readonly/rolerefs.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/select.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/textarea.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/deform/textinput.pt +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/email/settings/view.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/forbidden.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/form.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/forms/vue_template.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/grids/table_element.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/grids/vue_template.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/home.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/configure.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/create.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/delete.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/edit.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/form.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/index.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/master/view.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/notfound.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/page.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/people/view_profile.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/progress.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/setup.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/upgrade.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/upgrades/configure.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/templates/upgrades/view.mako +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/testing.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/util.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/auth.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/batch.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/common.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/email.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/essential.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/people.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/progress.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/roles.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/settings.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/upgrades.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/src/wuttaweb/views/users.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tasks.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/cli/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/cli/test_webapp.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/db/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/db/test_continuum.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/forms/test_base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/forms/test_widgets.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/grids/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/grids/test_base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/grids/test_filters.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_fontawesome_svg_core.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_free_solid_svg_icons.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_oruga.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_oruga_bulma.css +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_oruga_bulma.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_vue.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/bb_vue_fontawesome.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/buefy.css +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/buefy.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/fontawesome.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/vue.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/libcache/vue_resource.js +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_app.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_auth.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_emails.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_handler.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_helpers.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_menus.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_progress.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_static.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_subscribers.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/test_util.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/util.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/__init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test___init__.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_auth.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_base.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_batch.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_common.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_email.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_essential.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_master.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_people.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_progress.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_roles.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_settings.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_upgrades.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tests/views/test_users.py +0 -0
- {wuttaweb-0.19.2 → wuttaweb-0.19.3}/tox.ini +0 -0
|
@@ -5,6 +5,14 @@ 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.19.3 (2025-01-09)
|
|
9
|
+
|
|
10
|
+
### Fix
|
|
11
|
+
|
|
12
|
+
- use `request.url` instead of `current_route_url()`
|
|
13
|
+
- add basic `<wutta-autocomplete>` component
|
|
14
|
+
- add `WuttaDictEnum` form schema type
|
|
15
|
+
|
|
8
16
|
## v0.19.2 (2025-01-07)
|
|
9
17
|
|
|
10
18
|
### Fix
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: WuttaWeb
|
|
3
|
-
Version: 0.19.
|
|
3
|
+
Version: 0.19.3
|
|
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
|
|
@@ -39,7 +39,7 @@ Requires-Dist: pyramid-tm
|
|
|
39
39
|
Requires-Dist: pyramid>=2
|
|
40
40
|
Requires-Dist: waitress
|
|
41
41
|
Requires-Dist: webhelpers2
|
|
42
|
-
Requires-Dist: wuttjamaican[db]>=0.19.
|
|
42
|
+
Requires-Dist: wuttjamaican[db]>=0.19.3
|
|
43
43
|
Requires-Dist: zope-sqlalchemy>=1.5
|
|
44
44
|
Provides-Extra: continuum
|
|
45
45
|
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.19.
|
|
9
|
+
version = "0.19.3"
|
|
10
10
|
description = "Web App for Wutta Framework"
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
authors = [{name = "Lance Edgar", email = "lance@wuttaproject.org"}]
|
|
@@ -44,7 +44,7 @@ dependencies = [
|
|
|
44
44
|
"pyramid_tm",
|
|
45
45
|
"waitress",
|
|
46
46
|
"WebHelpers2",
|
|
47
|
-
"WuttJamaican[db]>=0.19.
|
|
47
|
+
"WuttJamaican[db]>=0.19.3",
|
|
48
48
|
"zope.sqlalchemy>=1.5",
|
|
49
49
|
]
|
|
50
50
|
|
|
@@ -155,6 +155,37 @@ class WuttaEnum(colander.Enum):
|
|
|
155
155
|
return widgets.SelectWidget(**kwargs)
|
|
156
156
|
|
|
157
157
|
|
|
158
|
+
class WuttaDictEnum(colander.String):
|
|
159
|
+
"""
|
|
160
|
+
Schema type for "pseudo-enum" fields which reference a dict for
|
|
161
|
+
known values instead of a true enum class.
|
|
162
|
+
|
|
163
|
+
This is primarily for use with "status" fields such as
|
|
164
|
+
:attr:`~wuttjamaican:wuttjamaican.db.model.batch.BatchRowMixin.status_code`.
|
|
165
|
+
|
|
166
|
+
This is a subclass of :class:`colander.String`, but adds a default
|
|
167
|
+
widget (``SelectWidget``) with enum choices.
|
|
168
|
+
|
|
169
|
+
:param request: Current :term:`request` object.
|
|
170
|
+
|
|
171
|
+
:param enum_dct: Dict with possible enum values and labels.
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
def __init__(self, request, enum_dct, *args, **kwargs):
|
|
175
|
+
super().__init__(*args, **kwargs)
|
|
176
|
+
self.request = request
|
|
177
|
+
self.config = self.request.wutta_config
|
|
178
|
+
self.app = self.config.get_app()
|
|
179
|
+
self.enum_dct = enum_dct
|
|
180
|
+
|
|
181
|
+
def widget_maker(self, **kwargs):
|
|
182
|
+
""" """
|
|
183
|
+
if 'values' not in kwargs:
|
|
184
|
+
kwargs['values'] = [(k, v) for k, v in self.enum_dct.items()]
|
|
185
|
+
|
|
186
|
+
return widgets.SelectWidget(**kwargs)
|
|
187
|
+
|
|
188
|
+
|
|
158
189
|
class WuttaMoney(colander.Money):
|
|
159
190
|
"""
|
|
160
191
|
Custom schema type for "money" fields.
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<br />
|
|
19
19
|
${self.buttons_content()}
|
|
20
20
|
|
|
21
|
-
${h.form(request.
|
|
21
|
+
${h.form(request.url, enctype='multipart/form-data', ref='saveSettingsForm', **{'@submit': 'saveSettingsFormSubmit'})}
|
|
22
22
|
${h.csrf_token(request)}
|
|
23
23
|
<div class="wutta-form-wrapper">
|
|
24
24
|
${self.form_content()}
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
<b-button @click="purgeSettingsShowDialog = false">
|
|
54
54
|
Cancel
|
|
55
55
|
</b-button>
|
|
56
|
-
${h.form(request.
|
|
56
|
+
${h.form(request.url, **{'@submit': 'purgingSettings = true'})}
|
|
57
57
|
${h.csrf_token(request)}
|
|
58
58
|
${h.hidden('remove_settings', 'true')}
|
|
59
59
|
<b-button type="is-danger"
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
icon-left="save">
|
|
108
108
|
{{ savingSettings ? "Working, please wait..." : "Save All Settings" }}
|
|
109
109
|
</b-button>
|
|
110
|
-
<b-button tag="a" href="${request.
|
|
110
|
+
<b-button tag="a" href="${request.url}"
|
|
111
111
|
icon-pack="fas"
|
|
112
112
|
icon-left="undo"
|
|
113
113
|
@click="undoChanges = true"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
<%def name="make_wutta_components()">
|
|
3
3
|
${self.make_wutta_request_mixin()}
|
|
4
|
+
${self.make_wutta_autocomplete_component()}
|
|
4
5
|
${self.make_wutta_button_component()}
|
|
5
6
|
${self.make_wutta_datepicker_component()}
|
|
6
7
|
${self.make_wutta_timepicker_component()}
|
|
@@ -86,6 +87,150 @@
|
|
|
86
87
|
</script>
|
|
87
88
|
</%def>
|
|
88
89
|
|
|
90
|
+
<%def name="make_wutta_autocomplete_component()">
|
|
91
|
+
<script type="text/x-template" id="wutta-autocomplete-template">
|
|
92
|
+
<div>
|
|
93
|
+
<b-autocomplete ref="autocomplete"
|
|
94
|
+
v-show="!value"
|
|
95
|
+
v-model="entry"
|
|
96
|
+
:data="data"
|
|
97
|
+
@typing="getAsyncData"
|
|
98
|
+
@select="selectionMade"
|
|
99
|
+
keep-first>
|
|
100
|
+
<template slot-scope="props">
|
|
101
|
+
{{ props.option.label }}
|
|
102
|
+
</template>
|
|
103
|
+
</b-autocomplete>
|
|
104
|
+
<b-button v-if="value"
|
|
105
|
+
@click="clearValue(true, true)">
|
|
106
|
+
{{ recordLabel }} (click to change)
|
|
107
|
+
</b-button>
|
|
108
|
+
</div>
|
|
109
|
+
</script>
|
|
110
|
+
<script>
|
|
111
|
+
const WuttaAutocomplete = {
|
|
112
|
+
template: '#wutta-autocomplete-template',
|
|
113
|
+
|
|
114
|
+
props: {
|
|
115
|
+
|
|
116
|
+
// callers do not specify this directly but rather by way
|
|
117
|
+
// of the `v-model` directive. the component will emit
|
|
118
|
+
// `input` events when this value changes
|
|
119
|
+
value: String,
|
|
120
|
+
|
|
121
|
+
// caller must specify initial display string, if the
|
|
122
|
+
// (v-model) value is not empty when component loads
|
|
123
|
+
display: String,
|
|
124
|
+
|
|
125
|
+
// the url from which search results are obtained. the
|
|
126
|
+
// endpoint should expect a GET with single `term` param
|
|
127
|
+
// in query string, and return list of objects, each with
|
|
128
|
+
// (at least) `value` and `label` properties.
|
|
129
|
+
serviceUrl: String,
|
|
130
|
+
},
|
|
131
|
+
|
|
132
|
+
data() {
|
|
133
|
+
return {
|
|
134
|
+
|
|
135
|
+
// user search input
|
|
136
|
+
entry: null,
|
|
137
|
+
|
|
138
|
+
// display label for button, when value is set
|
|
139
|
+
recordLabel: this.display,
|
|
140
|
+
|
|
141
|
+
// this contains the latest search results; it will
|
|
142
|
+
// change over time as user types. when an option is
|
|
143
|
+
// selected, it will be an element from this list.
|
|
144
|
+
data: [],
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
|
|
148
|
+
watch: {
|
|
149
|
+
|
|
150
|
+
value(val) {
|
|
151
|
+
// reset ourself when model value is cleared
|
|
152
|
+
if (!val) {
|
|
153
|
+
this.clearValue()
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
|
|
158
|
+
methods: {
|
|
159
|
+
|
|
160
|
+
focus() {
|
|
161
|
+
this.$refs.autocomplete.focus()
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
// convenience for parent component to fetch current label
|
|
165
|
+
getLabel() {
|
|
166
|
+
return this.recordLabel
|
|
167
|
+
},
|
|
168
|
+
|
|
169
|
+
// fetch new search results from server. this is invoked
|
|
170
|
+
// when user types new input
|
|
171
|
+
getAsyncData(entry) {
|
|
172
|
+
|
|
173
|
+
// nb. skip search until we have at least 3 chars of input
|
|
174
|
+
if (entry.length < 3) {
|
|
175
|
+
this.data = []
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// search results become autocomplete options
|
|
180
|
+
this.$http.get(this.serviceUrl + '?term=' + encodeURIComponent(entry))
|
|
181
|
+
.then(({ data }) => {
|
|
182
|
+
this.data = data
|
|
183
|
+
})
|
|
184
|
+
.catch((error) => {
|
|
185
|
+
this.data = []
|
|
186
|
+
throw error
|
|
187
|
+
})
|
|
188
|
+
},
|
|
189
|
+
|
|
190
|
+
// handle selection change. this is invoked when user
|
|
191
|
+
// chooses an autocomplete option
|
|
192
|
+
selectionMade(option) {
|
|
193
|
+
|
|
194
|
+
// reset user input
|
|
195
|
+
this.entry = null
|
|
196
|
+
|
|
197
|
+
// nb. this method can be triggered when a selection
|
|
198
|
+
// is made *or cleared* - if the latter then we do not
|
|
199
|
+
// want to emit event for the empty value; that part
|
|
200
|
+
// is handled in clearValue()
|
|
201
|
+
if (option) {
|
|
202
|
+
this.recordLabel = option.label
|
|
203
|
+
this.$emit('input', option.value)
|
|
204
|
+
} else {
|
|
205
|
+
this.recordLabel = null
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
|
|
209
|
+
// clear the component value
|
|
210
|
+
clearValue(emit, focus) {
|
|
211
|
+
|
|
212
|
+
// clear autocomplete selection
|
|
213
|
+
this.$refs.autocomplete.setSelected(null)
|
|
214
|
+
|
|
215
|
+
// maybe emit event for new value
|
|
216
|
+
if (emit) {
|
|
217
|
+
this.$emit('input', null)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// maybe set focus to autocomplete
|
|
221
|
+
if (focus) {
|
|
222
|
+
this.$nextTick(function() {
|
|
223
|
+
this.focus()
|
|
224
|
+
})
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
|
|
229
|
+
}
|
|
230
|
+
Vue.component('wutta-autocomplete', WuttaAutocomplete)
|
|
231
|
+
</script>
|
|
232
|
+
</%def>
|
|
233
|
+
|
|
89
234
|
<%def name="make_wutta_button_component()">
|
|
90
235
|
<script type="text/x-template" id="wutta-button-template">
|
|
91
236
|
<b-button :type="type"
|
|
@@ -1178,7 +1178,7 @@ class MasterView(View):
|
|
|
1178
1178
|
self.request.session.flash("Settings have been saved.")
|
|
1179
1179
|
|
|
1180
1180
|
# reload configure page
|
|
1181
|
-
return self.redirect(self.request.
|
|
1181
|
+
return self.redirect(self.request.url)
|
|
1182
1182
|
|
|
1183
1183
|
# render configure page
|
|
1184
1184
|
context = self.configure_get_context()
|
|
@@ -81,6 +81,25 @@ class TestWuttaEnum(WebTestCase):
|
|
|
81
81
|
self.assertIsInstance(widget, widgets.SelectWidget)
|
|
82
82
|
|
|
83
83
|
|
|
84
|
+
MOCK_STATUS_ONE = 1
|
|
85
|
+
MOCK_STATUS_TWO = 2
|
|
86
|
+
MOCK_STATUS = {
|
|
87
|
+
MOCK_STATUS_ONE: 'one',
|
|
88
|
+
MOCK_STATUS_TWO: 'two',
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
class TestWuttaDictEnum(WebTestCase):
|
|
92
|
+
|
|
93
|
+
def test_widget_maker(self):
|
|
94
|
+
typ = mod.WuttaDictEnum(self.request, MOCK_STATUS)
|
|
95
|
+
widget = typ.widget_maker()
|
|
96
|
+
self.assertIsInstance(widget, widgets.SelectWidget)
|
|
97
|
+
self.assertEqual(widget.values, [
|
|
98
|
+
(1, 'one'),
|
|
99
|
+
(2, 'two'),
|
|
100
|
+
])
|
|
101
|
+
|
|
102
|
+
|
|
84
103
|
class TestWuttaMoney(WebTestCase):
|
|
85
104
|
|
|
86
105
|
def test_widget_maker(self):
|
|
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
|
|
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
|