mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add icon to areas (#108650)
This commit is contained in:
parent
c6a1ec96f4
commit
9c727e5ea8
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user