Files
core/homeassistant/components/template/repairs.py
T

90 lines
3.2 KiB
Python

"""Repairs platform for the template integration."""
import voluptuous as vol
from homeassistant.components.repairs import (
ConfirmRepairFlow,
RepairsFlow,
RepairsFlowResult,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_DEVICE_ID
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.selector import DeviceSelector
class CompositeDeviceIdRepairFlow(RepairsFlow):
"""Handler to select a device again after the linked device was split."""
def __init__(self, entry: ConfigEntry) -> None:
"""Initialize the flow."""
self._entry_id = entry.entry_id
async def async_step_init(
self, user_input: dict[str, str] | None = None
) -> RepairsFlowResult:
"""Handle the first step of the fix flow."""
# The flow manager passes {"issue_id": ...} as user_input to this step;
# delegate so the form step can tell rendering from an (empty) submission
return await self.async_step_select_device()
async def async_step_select_device(
self, user_input: dict[str, str] | None = None
) -> RepairsFlowResult:
"""Handle the device selection step."""
entry = self.hass.config_entries.async_get_entry(self._entry_id)
if entry is None:
return self.async_abort(reason="entry_removed")
device_registry = dr.async_get(self.hass)
errors: dict[str, str] = {}
if user_input is not None:
device_id = user_input.get(CONF_DEVICE_ID)
if (
device_id is None
or device_registry.async_is_composite_device_id(device_id) is False
):
options = {**entry.options}
if device_id:
options[CONF_DEVICE_ID] = device_id
else:
options.pop(CONF_DEVICE_ID, None)
self.hass.config_entries.async_update_entry(entry, options=options)
await self.hass.config_entries.async_reload(entry.entry_id)
return self.async_create_entry(data={})
# A composite or unknown device id was submitted
errors[CONF_DEVICE_ID] = "invalid_device"
return self.async_show_form(
step_id="select_device",
data_schema=vol.Schema(
{
vol.Optional(
CONF_DEVICE_ID,
description={
"suggested_value": entry.options.get(CONF_DEVICE_ID)
},
): DeviceSelector(),
}
),
description_placeholders={"name": entry.title},
errors=errors,
)
async def async_create_fix_flow(
hass: HomeAssistant,
issue_id: str,
data: dict[str, str | int | float | None] | None,
) -> RepairsFlow:
"""Create a fix flow."""
if (
issue_id.startswith("composite_device_id_")
and data is not None
and (entry := hass.config_entries.async_get_entry(str(data["entry_id"])))
is not None
):
return CompositeDeviceIdRepairFlow(entry)
return ConfirmRepairFlow()