Add options flow to File (#120269)
* Add options flow to File * Review comments
This commit is contained in:
parent
e39bfeac08
commit
24a20c75eb
9 changed files with 307 additions and 38 deletions
|
@ -1,11 +1,18 @@
|
|||
"""Config flow for file integration."""
|
||||
|
||||
from copy import deepcopy
|
||||
import os
|
||||
from typing import Any
|
||||
|
||||
import voluptuous as vol
|
||||
|
||||
from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
|
||||
from homeassistant.config_entries import (
|
||||
ConfigEntry,
|
||||
ConfigFlow,
|
||||
ConfigFlowResult,
|
||||
OptionsFlow,
|
||||
OptionsFlowWithConfigEntry,
|
||||
)
|
||||
from homeassistant.const import (
|
||||
CONF_FILE_PATH,
|
||||
CONF_FILENAME,
|
||||
|
@ -15,6 +22,7 @@ from homeassistant.const import (
|
|||
CONF_VALUE_TEMPLATE,
|
||||
Platform,
|
||||
)
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.helpers.selector import (
|
||||
BooleanSelector,
|
||||
BooleanSelectorConfig,
|
||||
|
@ -31,27 +39,44 @@ BOOLEAN_SELECTOR = BooleanSelector(BooleanSelectorConfig())
|
|||
TEMPLATE_SELECTOR = TemplateSelector(TemplateSelectorConfig())
|
||||
TEXT_SELECTOR = TextSelector(TextSelectorConfig(type=TextSelectorType.TEXT))
|
||||
|
||||
FILE_FLOW_SCHEMAS = {
|
||||
FILE_OPTIONS_SCHEMAS = {
|
||||
Platform.SENSOR.value: vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_FILE_PATH): TEXT_SELECTOR,
|
||||
vol.Optional(CONF_VALUE_TEMPLATE): TEMPLATE_SELECTOR,
|
||||
vol.Optional(CONF_UNIT_OF_MEASUREMENT): TEXT_SELECTOR,
|
||||
}
|
||||
),
|
||||
Platform.NOTIFY.value: vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_FILE_PATH): TEXT_SELECTOR,
|
||||
vol.Optional(CONF_TIMESTAMP, default=False): BOOLEAN_SELECTOR,
|
||||
}
|
||||
),
|
||||
}
|
||||
|
||||
FILE_FLOW_SCHEMAS = {
|
||||
Platform.SENSOR.value: vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_FILE_PATH): TEXT_SELECTOR,
|
||||
}
|
||||
).extend(FILE_OPTIONS_SCHEMAS[Platform.SENSOR.value].schema),
|
||||
Platform.NOTIFY.value: vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_FILE_PATH): TEXT_SELECTOR,
|
||||
}
|
||||
).extend(FILE_OPTIONS_SCHEMAS[Platform.NOTIFY.value].schema),
|
||||
}
|
||||
|
||||
|
||||
class FileConfigFlowHandler(ConfigFlow, domain=DOMAIN):
|
||||
"""Handle a file config flow."""
|
||||
|
||||
VERSION = 1
|
||||
VERSION = 2
|
||||
|
||||
@staticmethod
|
||||
@callback
|
||||
def async_get_options_flow(config_entry: ConfigEntry) -> OptionsFlow:
|
||||
"""Get the options flow for this handler."""
|
||||
return FileOptionsFlowHandler(config_entry)
|
||||
|
||||
async def validate_file_path(self, file_path: str) -> bool:
|
||||
"""Ensure the file path is valid."""
|
||||
|
@ -80,7 +105,13 @@ class FileConfigFlowHandler(ConfigFlow, domain=DOMAIN):
|
|||
errors[CONF_FILE_PATH] = "not_allowed"
|
||||
else:
|
||||
title = f"{DEFAULT_NAME} [{user_input[CONF_FILE_PATH]}]"
|
||||
return self.async_create_entry(data=user_input, title=title)
|
||||
data = deepcopy(user_input)
|
||||
options = {}
|
||||
for key, value in user_input.items():
|
||||
if key not in (CONF_FILE_PATH, CONF_PLATFORM, CONF_NAME):
|
||||
data.pop(key)
|
||||
options[key] = value
|
||||
return self.async_create_entry(data=data, title=title, options=options)
|
||||
|
||||
return self.async_show_form(
|
||||
step_id=platform, data_schema=FILE_FLOW_SCHEMAS[platform], errors=errors
|
||||
|
@ -114,4 +145,29 @@ class FileConfigFlowHandler(ConfigFlow, domain=DOMAIN):
|
|||
else:
|
||||
file_path = import_data[CONF_FILE_PATH]
|
||||
title = f"{name} [{file_path}]"
|
||||
return self.async_create_entry(title=title, data=import_data)
|
||||
data = deepcopy(import_data)
|
||||
options = {}
|
||||
for key, value in import_data.items():
|
||||
if key not in (CONF_FILE_PATH, CONF_PLATFORM, CONF_NAME):
|
||||
data.pop(key)
|
||||
options[key] = value
|
||||
return self.async_create_entry(title=title, data=data, options=options)
|
||||
|
||||
|
||||
class FileOptionsFlowHandler(OptionsFlowWithConfigEntry):
|
||||
"""Handle File options."""
|
||||
|
||||
async def async_step_init(
|
||||
self, user_input: dict[str, Any] | None = None
|
||||
) -> ConfigFlowResult:
|
||||
"""Manage File options."""
|
||||
if user_input:
|
||||
return self.async_create_entry(data=user_input)
|
||||
|
||||
platform = self.config_entry.data[CONF_PLATFORM]
|
||||
return self.async_show_form(
|
||||
step_id="init",
|
||||
data_schema=self.add_suggested_values_to_schema(
|
||||
FILE_OPTIONS_SCHEMAS[platform], self.config_entry.options or {}
|
||||
),
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue