Record a timezone-only admin update as an explicit choice (task 45243478)

update_settings() now persists timezone_configured=True when the changes
supply timezone without timezone_configured, so Home Assistant's reported
zone can no longer replace an admin-chosen zone (release review RR-001).
An explicit timezone_configured is kept as supplied; the automatic
adoption path is unchanged and still leaves the marker false.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-28 23:27:24 -04:00
co-authored by Claude Opus 5.5
parent 40d0e5d8f6
commit 4b6e196509
2 changed files with 47 additions and 0 deletions
@@ -184,6 +184,11 @@ async def update_settings(
in one atomic upsert; the updated settings are returned. The whole
read → merge → write span runs inside the per-database settings
lock, so concurrent updates queue instead of interleaving.
Supplying ``timezone`` without ``timezone_configured`` records the
zone as the admin's explicit choice (``timezone_configured`` is
persisted ``True`` in the same write); an explicitly supplied
``timezone_configured`` is kept exactly as given.
"""
if not isinstance(changes, Mapping):
raise ValueError(
@@ -199,6 +204,10 @@ async def update_settings(
raise ValueError(
f"unknown settings field(s): {listed}; known fields: {known}"
)
if "timezone" in changes and "timezone_configured" not in changes:
# An admin-supplied zone is an explicit choice, so Home
# Assistant's reported zone must no longer replace it.
changes = {**changes, "timezone_configured": True}
async with _settings_lock(database):
current = await load_settings(database)
return await _write_merged(database, current, changes)