def form(
    flow: FlowHandler,
    step_id: str,
    schema: dict,
    defaults: dict = None,
    template: dict = None,
    error: str = None,
):
    """Suppport:
     - overwrite schema defaults from dict (user_input or entry.options)
     - set base error code (translations > config > error > code)
     - set custom error via placeholders ("template": "{error}")
    """
    if defaults:
        for key in schema:
            if key.schema in defaults:
                key.default = vol.default_factory(defaults[key.schema])

    if template and "error" in template:
        error = {"base": "template"}
    elif error:
        error = {"base": error}

    return flow.async_show_form(
        step_id=step_id,
        data_schema=vol.Schema(schema),
        description_placeholders=template,
        errors=error,
    )
Exemplo n.º 2
0
def schema_defaults(schema, dps_list=None, **defaults):
    """Create a new schema with default values filled in."""
    copy = schema.extend({})
    for field, field_type in copy.schema.items():
        if isinstance(field_type, vol.In):
            value = None
            for dps in dps_list or []:
                if dps.startswith(f"{defaults.get(field)} "):
                    value = dps
                    break

            if value in field_type.container:
                field.default = vol.default_factory(value)
                continue

        if field.schema in defaults:
            field.default = vol.default_factory(defaults[field])
    return copy
Exemplo n.º 3
0
    async def async_step_effect(self, user_input=None):
        """Handle the configure single effect flow"""
        if user_input is not None:
            changed = self.vals
            changed[self.step] = user_input
            return self.async_create_entry(
                title="ColorWall",
                data=changed)

        data = effect.data_schema[self.step]
        if self.step in self.vals:
            for key, value in data.items():
                if str(key.schema) != "type":
                    key.default = vol.default_factory(self.vals[self.step][str(key.schema)])
        return self.async_show_form(step_id="effect", data_schema=vol.Schema(data))
Exemplo n.º 4
0
    async def async_step_all(self, user_input=None):
        """Handle the configure all effects flow"""
        if user_input is not None:
            self.values[self.step] = user_input
            self.step = self.step + 1

        if self.step == len(effect.data_schema):
            return self.async_create_entry(
                title="ColorWall",
                data=self.values)

        if len(effect.data_schema[self.step]) == 0:
            self.step = self.step + 1
            if self.step < len(effect.data_schema):
                return await self.async_step_all(None)

        data = effect.data_schema[self.step]
        if self.step in self.vals:
            for key, value in data.items():
                if str(key.schema) != "type":
                    key.default = vol.default_factory(self.vals[self.step][str(key.schema)])

        return self.async_show_form(step_id="all", data_schema=vol.Schema(data))
Exemplo n.º 5
0
 def __init__(self, key, component, default=None):
     super(OnlyWith, self).__init__(key)
     self._component = component
     self._default = vol.default_factory(default)
Exemplo n.º 6
0
 def __init__(self, key, esp8266=vol.UNDEFINED, esp32=vol.UNDEFINED):
     super(SplitDefault, self).__init__(key)
     self._esp8266_default = vol.default_factory(esp8266)
     self._esp32_default = vol.default_factory(esp32)