ha(H4): исправления по ревью — маскировка ключа в дампе, reload-repair, reconfigure сохраняет поля

- major: diagnostics больше не содержит полный lanip_key (esp_home —
  маска, entry_data redacted); ключ для ESPHome — через reconfigure/CLI;
  план §3 синхронизирован; дамп при незагруженной записи не падает
- reconfigure: сохраняет listen_port/keepalive_ms и текущие overrides/
  temp_step; превью-дефолты подхватывают значения записи
- repair fix-flow: подтверждение перезагружает запись (issue снимается
  только когда сессия вышла из key_error; иначе создаётся заново)
- key_issue_id helper, использование async_remove_issue (мёртвый код),
  CONF_EMAIL/PASSWORD в TO_REDACT, placeholders в fix_flow, тест
  плейсхолдеров ru
- тесты обновлены (47 components)
This commit is contained in:
2026-09-29 14:29:36 +03:00
parent dcbf9a6c7e
commit 43d3ff7dea
12 changed files with 160 additions and 80 deletions
+40 -4
View File
@@ -1,13 +1,49 @@
"""Repair flows fglair: подтверждение issue key_mismatch."""
"""Repair flow fglair: key_mismatch → подсказка и reload записи.
Issue не удаляем молча: подтверждение перезагружает ConfigEntry, и если
ключ всё ещё неверен, coordinator создаёт issue заново (issue снимается
только когда сессия выходит из key_error).
"""
from __future__ import annotations
from typing import Any
from homeassistant.components.repairs import ConfirmRepairFlow
import voluptuous as vol
from homeassistant.components.repairs import RepairsFlow
from homeassistant.core import HomeAssistant
from homeassistant.data_entry_flow import FlowResult
class KeyMismatchRepairFlow(RepairsFlow):
async def async_step_init(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
return await self.async_step_confirm()
async def async_step_confirm(
self, user_input: dict[str, Any] | None = None
) -> FlowResult:
if user_input is not None:
entry_id = (self.data or {}).get("entry_id")
if entry_id:
self.hass.config_entries.async_schedule_reload(entry_id)
return self.async_create_entry(data={})
return self.async_show_form(
step_id="confirm",
data_schema=vol.Schema({}),
description_placeholders=self._placeholders(),
)
def _placeholders(self) -> dict[str, str]:
from homeassistant.helpers import issue_registry as ir
issue = ir.async_get(self.hass).async_get_issue(
self.handler, self.issue_id
)
return dict(issue.translation_placeholders or {}) if issue else {}
async def async_create_fix_flow(
hass: HomeAssistant, issue_id: str, data: dict[str, Any] | None
) -> ConfirmRepairFlow:
return ConfirmRepairFlow()
) -> KeyMismatchRepairFlow:
return KeyMismatchRepairFlow()