Home Assistant Unofficial Reference 2024.12.1
todo.py
Go to the documentation of this file.
1 """A todo platform for OurGroceries."""
2 
3 import asyncio
4 from typing import Any
5 
7  TodoItem,
8  TodoItemStatus,
9  TodoListEntity,
10  TodoListEntityFeature,
11 )
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 from homeassistant.helpers.update_coordinator import CoordinatorEntity
16 
17 from .const import DOMAIN
18 from .coordinator import OurGroceriesDataUpdateCoordinator
19 
20 
22  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
23 ) -> None:
24  """Set up the OurGroceries todo platform config entry."""
25  coordinator: OurGroceriesDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
27  OurGroceriesTodoListEntity(coordinator, sl["id"], sl["name"])
28  for sl in coordinator.lists
29  )
30 
31 
32 def _completion_status(item: dict[str, Any]) -> TodoItemStatus:
33  if item.get("crossedOffAt", False):
34  return TodoItemStatus.COMPLETED
35  return TodoItemStatus.NEEDS_ACTION
36 
37 
39  CoordinatorEntity[OurGroceriesDataUpdateCoordinator], TodoListEntity
40 ):
41  """An OurGroceries TodoListEntity."""
42 
43  _attr_has_entity_name = True
44  _attr_supported_features = (
45  TodoListEntityFeature.CREATE_TODO_ITEM
46  | TodoListEntityFeature.UPDATE_TODO_ITEM
47  | TodoListEntityFeature.DELETE_TODO_ITEM
48  )
49 
50  def __init__(
51  self,
52  coordinator: OurGroceriesDataUpdateCoordinator,
53  list_id: str,
54  list_name: str,
55  ) -> None:
56  """Initialize TodoistTodoListEntity."""
57  super().__init__(coordinator=coordinator)
58  self._list_id_list_id = list_id
59  self._attr_unique_id_attr_unique_id = list_id
60  self._attr_name_attr_name = list_name
61 
62  @callback
63  def _handle_coordinator_update(self) -> None:
64  """Handle updated data from the coordinator."""
65  if self.coordinator.data is None:
66  self._attr_todo_items_attr_todo_items = None
67  else:
68  self._attr_todo_items_attr_todo_items = [
69  TodoItem(
70  summary=item["name"],
71  uid=item["id"],
72  status=_completion_status(item),
73  )
74  for item in self.coordinator.data[self._list_id_list_id]["list"]["items"]
75  ]
77 
78  async def async_create_todo_item(self, item: TodoItem) -> None:
79  """Create a To-do item."""
80  if item.status != TodoItemStatus.NEEDS_ACTION:
81  raise ValueError("Only active tasks may be created.")
82  await self.coordinator.og.add_item_to_list(
83  self._list_id_list_id, item.summary, auto_category=True
84  )
85  await self.coordinator.async_refresh()
86 
87  async def async_update_todo_item(self, item: TodoItem) -> None:
88  """Update a To-do item."""
89  if item.summary:
90  api_items = self.coordinator.data[self._list_id_list_id]["list"]["items"]
91  category = next(
92  api_item.get("categoryId")
93  for api_item in api_items
94  if api_item["id"] == item.uid
95  )
96  await self.coordinator.og.change_item_on_list(
97  self._list_id_list_id, item.uid, category, item.summary
98  )
99  if item.status is not None:
100  cross_off = item.status == TodoItemStatus.COMPLETED
101  await self.coordinator.og.toggle_item_crossed_off(
102  self._list_id_list_id, item.uid, cross_off=cross_off
103  )
104  await self.coordinator.async_refresh()
105 
106  async def async_delete_todo_items(self, uids: list[str]) -> None:
107  """Delete a To-do item."""
108  await asyncio.gather(
109  *[
110  self.coordinator.og.remove_item_from_list(self._list_id_list_id, uid)
111  for uid in uids
112  ]
113  )
114  await self.coordinator.async_refresh()
115 
116  async def async_added_to_hass(self) -> None:
117  """When entity is added to hass update state from existing coordinator data."""
118  await super().async_added_to_hass()
119  self._handle_coordinator_update_handle_coordinator_update()
None __init__(self, OurGroceriesDataUpdateCoordinator coordinator, str list_id, str list_name)
Definition: todo.py:55
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: todo.py:23
TodoItemStatus _completion_status(dict[str, Any] item)
Definition: todo.py:32