Compare commits
No commits in common. "9541bc6a27c4e6ec04ed11656410a78eb2068088" and "204548e4f2dd79525e02edb3100134c3bab09088" have entirely different histories.
9541bc6a27
...
204548e4f2
7 changed files with 9 additions and 50 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -5,18 +5,6 @@ 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.2"
|
version = "0.27.1"
|
||||||
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,10 +2030,7 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
|
||||||
|
|
||||||
grid.set_renderer('foo', 'date')
|
grid.set_renderer('foo', 'date')
|
||||||
"""
|
"""
|
||||||
try:
|
|
||||||
dt = getattr(obj, key)
|
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
|
||||||
|
|
@ -2049,10 +2046,7 @@ class Grid: # pylint: disable=too-many-instance-attributes,too-many-public-meth
|
||||||
|
|
||||||
grid.set_renderer('foo', 'datetime')
|
grid.set_renderer('foo', 'datetime')
|
||||||
"""
|
"""
|
||||||
try:
|
|
||||||
dt = getattr(obj, key)
|
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-2026 Lance Edgar
|
# Copyright © 2024-2025 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Wutta Framework.
|
# This file is part of Wutta Framework.
|
||||||
#
|
#
|
||||||
|
|
@ -47,15 +47,14 @@ 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()
|
||||||
|
|
||||||
|
|
@ -80,9 +79,8 @@ class AuthView(View):
|
||||||
if data:
|
if data:
|
||||||
|
|
||||||
# truly validate user credentials
|
# truly validate user credentials
|
||||||
if user := self.authenticate_user(
|
user = auth.authenticate_user(session, data["username"], data["password"])
|
||||||
session, data["username"], data["password"]
|
if user:
|
||||||
):
|
|
||||||
|
|
||||||
# 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)
|
||||||
|
|
@ -97,12 +95,6 @@ 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-2026 Lance Edgar
|
# Copyright © 2024-2025 Lance Edgar
|
||||||
#
|
#
|
||||||
# This file is part of Wutta Framework.
|
# This file is part of Wutta Framework.
|
||||||
#
|
#
|
||||||
|
|
@ -51,7 +51,6 @@ 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()
|
||||||
|
|
||||||
|
|
@ -59,7 +58,6 @@ 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,12 +1682,6 @@ 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):
|
||||||
|
|
@ -1705,13 +1699,6 @@ 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
|
pytest -m 'versioned' --cov-append --cov=wuttaweb --cov-report=html
|
||||||
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