Compare commits
5 commits
204548e4f2
...
9541bc6a27
| Author | SHA1 | Date | |
|---|---|---|---|
| 9541bc6a27 | |||
| c1717d46e1 | |||
| d9b880248c | |||
| 4ac40a835b | |||
| b410b5aa02 |
7 changed files with 50 additions and 9 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -5,6 +5,18 @@ All notable changes to wuttaweb will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## v0.27.2 (2026-02-04)
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
- fallback to dict logic for grid render date/time
|
||||||
|
- add dedicated `authenticate_user()` method for auth view
|
||||||
|
- increase default width for read-only form views
|
||||||
|
- add `hoverable` and `narrowed` for all `<b-table>` elements
|
||||||
|
- show users grid when deleting a Person
|
||||||
|
- add `model` and `enum` to global template rendering context
|
||||||
|
- ensure grid action icon+label do not wrap
|
||||||
|
|
||||||
## v0.27.1 (2026-01-03)
|
## v0.27.1 (2026-01-03)
|
||||||
|
|
||||||
### Fix
|
### Fix
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ build-backend = "hatchling.build"
|
||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "WuttaWeb"
|
name = "WuttaWeb"
|
||||||
version = "0.27.1"
|
version = "0.27.2"
|
||||||
description = "Web App for Wutta Framework"
|
description = "Web App for Wutta Framework"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
authors = [{name = "Lance Edgar", email = "lance@wuttaproject.org"}]
|
authors = [{name = "Lance Edgar", email = "lance@wuttaproject.org"}]
|
||||||
|
|
|
||||||
|
|
@ -2030,7 +2030,10 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
|
||||||
|
|
||||||
grid.set_renderer('foo', 'date')
|
grid.set_renderer('foo', 'date')
|
||||||
"""
|
"""
|
||||||
dt = getattr(obj, key)
|
try:
|
||||||
|
dt = getattr(obj, key)
|
||||||
|
except AttributeError:
|
||||||
|
dt = obj[key]
|
||||||
return self.app.render_date(dt)
|
return self.app.render_date(dt)
|
||||||
|
|
||||||
def render_datetime(self, obj, key, value): # pylint: disable=unused-argument
|
def render_datetime(self, obj, key, value): # pylint: disable=unused-argument
|
||||||
|
|
@ -2046,7 +2049,10 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
|
||||||
|
|
||||||
grid.set_renderer('foo', 'datetime')
|
grid.set_renderer('foo', 'datetime')
|
||||||
"""
|
"""
|
||||||
dt = getattr(obj, key)
|
try:
|
||||||
|
dt = getattr(obj, key)
|
||||||
|
except AttributeError:
|
||||||
|
dt = obj[key]
|
||||||
return self.app.render_datetime(dt, html=True)
|
return self.app.render_datetime(dt, html=True)
|
||||||
|
|
||||||
def render_enum(self, obj, key, value, enum=None):
|
def render_enum(self, obj, key, value, enum=None):
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# wuttaweb -- Web App for Wutta Framework
|
# wuttaweb -- Web App for Wutta Framework
|
||||||
# Copyright © 2024-2025 Lance Edgar
|
# Copyright © 2024-2026 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Wutta Framework.
|
# This file is part of Wutta Framework.
|
||||||
#
|
#
|
||||||
|
|
@ -47,14 +47,15 @@ class AuthView(View):
|
||||||
* route: ``login``
|
* route: ``login``
|
||||||
* template: ``/auth/login.mako``
|
* template: ``/auth/login.mako``
|
||||||
"""
|
"""
|
||||||
|
# pylint: disable=duplicate-code
|
||||||
model = self.app.model
|
model = self.app.model
|
||||||
session = session or Session()
|
session = session or Session()
|
||||||
auth = self.app.get_auth_handler()
|
|
||||||
|
|
||||||
# nb. redirect to /setup if no users exist
|
# nb. redirect to /setup if no users exist
|
||||||
user = session.query(model.User).first()
|
user = session.query(model.User).first()
|
||||||
if not user:
|
if not user:
|
||||||
return self.redirect(self.request.route_url("setup"))
|
return self.redirect(self.request.route_url("setup"))
|
||||||
|
# pylint: enable=duplicate-code
|
||||||
|
|
||||||
referrer = self.request.get_referrer()
|
referrer = self.request.get_referrer()
|
||||||
|
|
||||||
|
|
@ -79,8 +80,9 @@ class AuthView(View):
|
||||||
if data:
|
if data:
|
||||||
|
|
||||||
# truly validate user credentials
|
# truly validate user credentials
|
||||||
user = auth.authenticate_user(session, data["username"], data["password"])
|
if user := self.authenticate_user(
|
||||||
if user:
|
session, data["username"], data["password"]
|
||||||
|
):
|
||||||
|
|
||||||
# okay now they're truly logged in
|
# okay now they're truly logged in
|
||||||
headers = login_user(self.request, user)
|
headers = login_user(self.request, user)
|
||||||
|
|
@ -95,6 +97,12 @@ class AuthView(View):
|
||||||
# 'referrer': referrer,
|
# 'referrer': referrer,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def authenticate_user(
|
||||||
|
self, session, username, password
|
||||||
|
): # pylint: disable=missing-function-docstring
|
||||||
|
auth = self.app.get_auth_handler()
|
||||||
|
return auth.authenticate_user(session, username, password)
|
||||||
|
|
||||||
def login_make_schema(self): # pylint: disable=empty-docstring
|
def login_make_schema(self): # pylint: disable=empty-docstring
|
||||||
""" """
|
""" """
|
||||||
schema = colander.Schema()
|
schema = colander.Schema()
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
#
|
||||||
# wuttaweb -- Web App for Wutta Framework
|
# wuttaweb -- Web App for Wutta Framework
|
||||||
# Copyright © 2024-2025 Lance Edgar
|
# Copyright © 2024-2026 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Wutta Framework.
|
# This file is part of Wutta Framework.
|
||||||
#
|
#
|
||||||
|
|
@ -51,6 +51,7 @@ class CommonView(View):
|
||||||
This is normally the view shown when a user navigates to the
|
This is normally the view shown when a user navigates to the
|
||||||
root URL for the web app.
|
root URL for the web app.
|
||||||
"""
|
"""
|
||||||
|
# pylint: disable=duplicate-code
|
||||||
model = self.app.model
|
model = self.app.model
|
||||||
session = session or Session()
|
session = session or Session()
|
||||||
|
|
||||||
|
|
@ -58,6 +59,7 @@ class CommonView(View):
|
||||||
user = session.query(model.User).first()
|
user = session.query(model.User).first()
|
||||||
if not user:
|
if not user:
|
||||||
return self.redirect(self.request.route_url("setup"))
|
return self.redirect(self.request.route_url("setup"))
|
||||||
|
# pylint: enable=duplicate-code
|
||||||
|
|
||||||
# maybe auto-redirect anons to login
|
# maybe auto-redirect anons to login
|
||||||
if not self.request.user:
|
if not self.request.user:
|
||||||
|
|
|
||||||
|
|
@ -1682,6 +1682,12 @@ class TestGrid(WebTestCase):
|
||||||
result = grid.render_date(obj, "dt", str(dt))
|
result = grid.render_date(obj, "dt", str(dt))
|
||||||
self.assertEqual(result, "2025-01-13")
|
self.assertEqual(result, "2025-01-13")
|
||||||
|
|
||||||
|
# object as dict
|
||||||
|
dt = datetime.date(2025, 1, 13)
|
||||||
|
obj = {"dt": dt}
|
||||||
|
result = grid.render_date(obj, "dt", str(dt))
|
||||||
|
self.assertEqual(result, "2025-01-13")
|
||||||
|
|
||||||
def test_render_datetime(self):
|
def test_render_datetime(self):
|
||||||
tzlocal = get_timezone_by_name("America/Los_Angeles")
|
tzlocal = get_timezone_by_name("America/Los_Angeles")
|
||||||
with patch.object(self.app, "get_timezone", return_value=tzlocal):
|
with patch.object(self.app, "get_timezone", return_value=tzlocal):
|
||||||
|
|
@ -1699,6 +1705,13 @@ class TestGrid(WebTestCase):
|
||||||
self.assertTrue(result.startswith('<span title="'))
|
self.assertTrue(result.startswith('<span title="'))
|
||||||
self.assertIn("2024-12-12 05:44-0800", result)
|
self.assertIn("2024-12-12 05:44-0800", result)
|
||||||
|
|
||||||
|
# object as dict
|
||||||
|
dt = datetime.datetime(2024, 12, 12, 13, 44)
|
||||||
|
obj = {"dt": dt}
|
||||||
|
result = grid.render_datetime(obj, "dt", str(dt))
|
||||||
|
self.assertTrue(result.startswith('<span title="'))
|
||||||
|
self.assertIn("2024-12-12 05:44-0800", result)
|
||||||
|
|
||||||
def test_render_vue_tag(self):
|
def test_render_vue_tag(self):
|
||||||
grid = self.make_grid(columns=["foo", "bar"])
|
grid = self.make_grid(columns=["foo", "bar"])
|
||||||
html = grid.render_vue_tag()
|
html = grid.render_vue_tag()
|
||||||
|
|
|
||||||
2
tox.ini
2
tox.ini
|
|
@ -23,7 +23,7 @@ commands = pylint wuttaweb
|
||||||
basepython = python3.11
|
basepython = python3.11
|
||||||
commands =
|
commands =
|
||||||
pytest -m 'not versioned and not functional' --cov=wuttaweb
|
pytest -m 'not versioned and not functional' --cov=wuttaweb
|
||||||
pytest -m 'versioned' --cov-append --cov=wuttaweb --cov-report=html
|
pytest -m 'versioned' --cov-append --cov=wuttaweb
|
||||||
pytest -m 'functional' --cov-append --cov=wuttaweb --cov-report=html --cov-fail-under=100
|
pytest -m 'functional' --cov-append --cov=wuttaweb --cov-report=html --cov-fail-under=100
|
||||||
|
|
||||||
[testenv:docs]
|
[testenv:docs]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue