Home Assistant Unofficial Reference 2024.12.1
todo.py
Go to the documentation of this file.
1 """Definition of Picnic shopping cart."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import cast
7 
9  TodoItem,
10  TodoItemStatus,
11  TodoListEntity,
12  TodoListEntityFeature,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant
16 from homeassistant.exceptions import ServiceValidationError
17 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.update_coordinator import CoordinatorEntity
20 
21 from .const import CONF_COORDINATOR, DOMAIN
22 from .coordinator import PicnicUpdateCoordinator
23 from .services import product_search
24 
25 _LOGGER = logging.getLogger(__name__)
26 
27 
29  hass: HomeAssistant,
30  config_entry: ConfigEntry,
31  async_add_entities: AddEntitiesCallback,
32 ) -> None:
33  """Set up the Picnic shopping cart todo platform config entry."""
34  picnic_coordinator = hass.data[DOMAIN][config_entry.entry_id][CONF_COORDINATOR]
35 
36  async_add_entities([PicnicCart(picnic_coordinator, config_entry)])
37 
38 
39 class PicnicCart(TodoListEntity, CoordinatorEntity[PicnicUpdateCoordinator]):
40  """A Picnic Shopping Cart TodoListEntity."""
41 
42  _attr_has_entity_name = True
43  _attr_supported_features = TodoListEntityFeature.CREATE_TODO_ITEM
44  _attr_translation_key = "shopping_cart"
45 
46  def __init__(
47  self,
48  coordinator: PicnicUpdateCoordinator,
49  config_entry: ConfigEntry,
50  ) -> None:
51  """Initialize PicnicCart."""
52  super().__init__(coordinator)
53  self._attr_device_info_attr_device_info = DeviceInfo(
54  entry_type=DeviceEntryType.SERVICE,
55  identifiers={(DOMAIN, cast(str, config_entry.unique_id))},
56  manufacturer="Picnic",
57  model=config_entry.unique_id,
58  )
59  self._attr_unique_id_attr_unique_id = f"{config_entry.unique_id}-cart"
60 
61  @property
62  def todo_items(self) -> list[TodoItem] | None:
63  """Get the current set of items in cart items."""
64  if self.coordinator.data is None:
65  return None
66 
67  _LOGGER.debug(self.coordinator.data["cart_data"]["items"])
68 
69  return [
70  TodoItem(
71  summary=f"{article['name']} ({article['unit_quantity']})",
72  uid=f"{item['id']}-{article['id']}",
73  status=TodoItemStatus.NEEDS_ACTION, # We set 'NEEDS_ACTION' so they count as state
74  )
75  for item in self.coordinator.data["cart_data"]["items"]
76  for article in item["items"]
77  ]
78 
79  async def async_create_todo_item(self, item: TodoItem) -> None:
80  """Add item to shopping cart."""
81  product_id = await self.hasshasshass.async_add_executor_job(
82  product_search, self.coordinator.picnic_api_client, item.summary
83  )
84 
85  if not product_id:
86  raise ServiceValidationError("No product found or no product ID given")
87 
88  await self.hasshasshass.async_add_executor_job(
89  self.coordinator.picnic_api_client.add_product, product_id, 1
90  )
91 
92  await self.coordinator.async_refresh()
None __init__(self, PicnicUpdateCoordinator coordinator, ConfigEntry config_entry)
Definition: todo.py:50
list[TodoItem]|None todo_items(self)
Definition: todo.py:62
None async_create_todo_item(self, TodoItem item)
Definition: todo.py:79
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: todo.py:32