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, )
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
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))
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))
def __init__(self, key, component, default=None): super(OnlyWith, self).__init__(key) self._component = component self._default = vol.default_factory(default)
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)