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

View File

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

View File

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

View File

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