Add icon to areas (#108650)

This commit is contained in:
Erik Montnemery 2024-01-24 19:11:03 +01:00 committed by GitHub
parent c6a1ec96f4
commit 9c727e5ea8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 58 additions and 9 deletions

View File

@ -38,6 +38,7 @@ def websocket_list_areas(
{
vol.Required("type"): "config/area_registry/create",
vol.Optional("aliases"): list,
vol.Optional("icon"): str,
vol.Required("name"): str,
vol.Optional("picture"): vol.Any(str, None),
}
@ -97,6 +98,7 @@ def websocket_delete_area(
vol.Required("type"): "config/area_registry/update",
vol.Optional("aliases"): list,
vol.Required("area_id"): str,
vol.Optional("icon"): vol.Any(str, None),
vol.Optional("name"): str,
vol.Optional("picture"): vol.Any(str, None),
}
@ -133,6 +135,7 @@ def _entry_dict(entry: AreaEntry) -> dict[str, Any]:
return {
"aliases": list(entry.aliases),
"area_id": entry.id,
"icon": entry.icon,
"name": entry.name,
"picture": entry.picture,
}

View File

@ -33,6 +33,7 @@ class AreaEntry:
"""Area Registry Entry."""
aliases: set[str]
icon: str | None
id: str
name: str
normalized_name: str
@ -107,6 +108,11 @@ class AreaRegistryStore(Store[dict[str, list[dict[str, Any]]]]):
for area in old_data["areas"]:
area["aliases"] = []
if old_minor_version < 4:
# Version 1.4 adds icon
for area in old_data["areas"]:
area["icon"] = None
if old_major_version > 1:
raise NotImplementedError
return old_data
@ -161,6 +167,7 @@ class AreaRegistry:
name: str,
*,
aliases: set[str] | None = None,
icon: str | None = None,
picture: str | None = None,
) -> AreaEntry:
"""Create a new area."""
@ -172,6 +179,7 @@ class AreaRegistry:
area_id = self._generate_area_id(name)
area = AreaEntry(
aliases=aliases or set(),
icon=icon,
id=area_id,
name=name,
normalized_name=normalized_name,
@ -207,12 +215,17 @@ class AreaRegistry:
area_id: str,
*,
aliases: set[str] | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED,
) -> AreaEntry:
"""Update name of area."""
updated = self._async_update(
area_id, aliases=aliases, name=name, picture=picture
area_id,
aliases=aliases,
icon=icon,
name=name,
picture=picture,
)
self.hass.bus.async_fire(
EVENT_AREA_REGISTRY_UPDATED, {"action": "update", "area_id": area_id}
@ -225,6 +238,7 @@ class AreaRegistry:
area_id: str,
*,
aliases: set[str] | UndefinedType = UNDEFINED,
icon: str | None | UndefinedType = UNDEFINED,
name: str | UndefinedType = UNDEFINED,
picture: str | None | UndefinedType = UNDEFINED,
) -> AreaEntry:
@ -235,6 +249,7 @@ class AreaRegistry:
for attr_name, value in (
("aliases", aliases),
("icon", icon),
("picture", picture),
):
if value is not UNDEFINED and value != getattr(old, attr_name):
@ -264,6 +279,7 @@ class AreaRegistry:
normalized_name = normalize_area_name(area["name"])
areas[area["id"]] = AreaEntry(
aliases=set(area["aliases"]),
icon=area["icon"],
id=area["id"],
name=area["name"],
normalized_name=normalized_name,
@ -286,8 +302,9 @@ class AreaRegistry:
data["areas"] = [
{
"aliases": list(entry.aliases),
"name": entry.name,
"icon": entry.icon,
"id": entry.id,
"name": entry.name,
"picture": entry.picture,
}
for entry in self.areas.values()

View File

@ -22,7 +22,10 @@ async def test_list_areas(
"""Test list entries."""
area1 = area_registry.async_create("mock 1")
area2 = area_registry.async_create(
"mock 2", aliases={"alias_1", "alias_2"}, picture="/image/example.png"
"mock 2",
aliases={"alias_1", "alias_2"},
icon="mdi:garage",
picture="/image/example.png",
)
await client.send_json({"id": 1, "type": "config/area_registry/list"})
@ -32,12 +35,14 @@ async def test_list_areas(
{
"aliases": [],
"area_id": area1.id,
"icon": None,
"name": "mock 1",
"picture": None,
},
{
"aliases": unordered(["alias_1", "alias_2"]),
"area_id": area2.id,
"icon": "mdi:garage",
"name": "mock 2",
"picture": "/image/example.png",
},
@ -58,6 +63,7 @@ async def test_create_area(
assert msg["result"] == {
"aliases": [],
"area_id": ANY,
"icon": None,
"name": "mock",
"picture": None,
}
@ -68,6 +74,7 @@ async def test_create_area(
{
"id": 2,
"aliases": ["alias_1", "alias_2"],
"icon": "mdi:garage",
"name": "mock 2",
"picture": "/image/example.png",
"type": "config/area_registry/create",
@ -79,6 +86,7 @@ async def test_create_area(
assert msg["result"] == {
"aliases": unordered(["alias_1", "alias_2"]),
"area_id": ANY,
"icon": "mdi:garage",
"name": "mock 2",
"picture": "/image/example.png",
}
@ -148,6 +156,7 @@ async def test_update_area(
"id": 1,
"aliases": ["alias_1", "alias_2"],
"area_id": area.id,
"icon": "mdi:garage",
"name": "mock 2",
"picture": "/image/example.png",
"type": "config/area_registry/update",
@ -159,6 +168,7 @@ async def test_update_area(
assert msg["result"] == {
"aliases": unordered(["alias_1", "alias_2"]),
"area_id": area.id,
"icon": "mdi:garage",
"name": "mock 2",
"picture": "/image/example.png",
}
@ -169,6 +179,7 @@ async def test_update_area(
"id": 2,
"aliases": ["alias_1", "alias_1"],
"area_id": area.id,
"icon": None,
"picture": None,
"type": "config/area_registry/update",
}
@ -179,6 +190,7 @@ async def test_update_area(
assert msg["result"] == {
"aliases": ["alias_1"],
"area_id": area.id,
"icon": None,
"name": "mock 2",
"picture": None,
}

View File

@ -40,7 +40,12 @@ async def test_create_area(
area = area_registry.async_create("mock")
assert area == ar.AreaEntry(
name="mock", normalized_name=ANY, aliases=set(), id=ANY, picture=None
aliases=set(),
icon=None,
id=ANY,
name="mock",
normalized_name=ANY,
picture=None,
)
assert len(area_registry.areas) == 1
@ -56,10 +61,11 @@ async def test_create_area(
)
assert area == ar.AreaEntry(
aliases={"alias_1", "alias_2"},
icon=None,
id=ANY,
name="mock 2",
normalized_name=ANY,
aliases={"alias_1", "alias_2"},
id=ANY,
picture="/image/example.png",
)
assert len(area_registry.areas) == 2
@ -139,16 +145,18 @@ async def test_update_area(
updated_area = area_registry.async_update(
area.id,
aliases={"alias_1", "alias_2"},
icon="mdi:garage",
name="mock1",
picture="/image/example.png",
)
assert updated_area != area
assert updated_area == ar.AreaEntry(
aliases={"alias_1", "alias_2"},
icon="mdi:garage",
id=ANY,
name="mock1",
normalized_name=ANY,
aliases={"alias_1", "alias_2"},
id=ANY,
picture="/image/example.png",
)
assert len(area_registry.areas) == 1
@ -250,6 +258,7 @@ async def test_loading_area_from_storage(
{
"aliases": ["alias_1", "alias_2"],
"id": "12345A",
"icon": "mdi:garage",
"name": "mock",
"picture": "blah",
}
@ -287,7 +296,15 @@ async def test_migration_from_1_1(
"minor_version": ar.STORAGE_VERSION_MINOR,
"key": ar.STORAGE_KEY,
"data": {
"areas": [{"aliases": [], "id": "12345A", "name": "mock", "picture": None}]
"areas": [
{
"aliases": [],
"icon": None,
"id": "12345A",
"name": "mock",
"picture": None,
}
]
},
}