From c1920a17d1712b09b72ae4b0772c2be4627e1675 Mon Sep 17 00:00:00 2001 From: DanCardin Date: Tue, 5 Nov 2024 16:10:22 -0500 Subject: [PATCH] fix: Dont set `None` audit "context values". --- CHANGELOG.md | 4 ++++ pyproject.toml | 2 +- src/sqlalchemy_declarative_extensions/audit.py | 3 +++ tests/audit/test_context_values.py | 18 +++++++++++++++++- uv.lock | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30805fa..7313cb7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## 0.15 +### 0.15.5 + +- fix: Dont set `None` audit "context values". + ### 0.15.4 - fix: Undo accidental inclusion of alembic as required dependencies. diff --git a/pyproject.toml b/pyproject.toml index 387e894..38dbd76 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sqlalchemy-declarative-extensions" -version = "0.15.4" +version = "0.15.5" authors = [ {name = "Dan Cardin", email = "ddcardin@gmail.com"}, ] diff --git a/src/sqlalchemy_declarative_extensions/audit.py b/src/sqlalchemy_declarative_extensions/audit.py index c7763f7..79608e3 100644 --- a/src/sqlalchemy_declarative_extensions/audit.py +++ b/src/sqlalchemy_declarative_extensions/audit.py @@ -296,6 +296,9 @@ def create_audit_triggers( def set_context_values(connectable, **values): """Set transaction-local context values, to be included on audit-tables.""" for name, value in values.items(): + if value is None: + continue + statement = f"SET LOCAL audit.{name} = '{value}'" connectable.execute(text(statement)) diff --git a/tests/audit/test_context_values.py b/tests/audit/test_context_values.py index fcdf4a1..d44c708 100644 --- a/tests/audit/test_context_values.py +++ b/tests/audit/test_context_values.py @@ -19,7 +19,10 @@ class Base(_Base): # type: ignore # type: ignore __abstract__ = True -context_columns = [Column("username", types.Unicode(), nullable=False)] +context_columns = [ + Column("username", types.Unicode(), nullable=False), + Column("nickname", types.Unicode(), nullable=True), +] @audit(context_columns=context_columns) @@ -48,6 +51,19 @@ def test_sets_session_values(pg): assert audit_row.audit_username == "foo@foo.com" +def test_sets_session_value_to_none(pg): + Base.metadata.create_all(bind=pg.connection()) + pg.commit() + + set_context_values(pg, username="foo@foo.com", nickname=None) + pg.add(Foo(id=1, name=None, json=None)) + pg.commit() + + audit_row = pg.execute(Foo.__audit_table__.select()).fetchone() + assert audit_row.audit_username == "foo@foo.com" + assert audit_row.audit_nickname is None + + def test_fails_to_set_session_values(pg): Base.metadata.create_all(bind=pg.connection()) pg.commit() diff --git a/uv.lock b/uv.lock index 3d697ff..3687536 100644 --- a/uv.lock +++ b/uv.lock @@ -1415,7 +1415,7 @@ mypy = [ [[package]] name = "sqlalchemy-declarative-extensions" -version = "0.13.0" +version = "0.15.4" source = { editable = "." } dependencies = [ { name = "sqlalchemy" },