core/homeassistant/components/picnic/todo.py

97 lines
3.2 KiB
Python

"""Definition of Picnic shopping cart."""
from __future__ import annotations
import logging
from typing import cast
from homeassistant.components.todo import (
TodoItem,
TodoItemStatus,
TodoListEntity,
TodoListEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import CONF_COORDINATOR, DOMAIN
from .coordinator import PicnicUpdateCoordinator
from .services import product_search
_LOGGER = logging.getLogger(__name__)
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the Picnic shopping cart todo platform config entry."""
picnic_coordinator = hass.data[DOMAIN][config_entry.entry_id][CONF_COORDINATOR]
async_add_entities([PicnicCart(hass, picnic_coordinator, config_entry)])
class PicnicCart(TodoListEntity, CoordinatorEntity[PicnicUpdateCoordinator]):
"""A Picnic Shopping Cart TodoListEntity."""
_attr_has_entity_name = True
_attr_icon = "mdi:cart"
_attr_supported_features = TodoListEntityFeature.CREATE_TODO_ITEM
_attr_translation_key = "shopping_cart"
def __init__(
self,
hass: HomeAssistant,
coordinator: PicnicUpdateCoordinator,
config_entry: ConfigEntry,
) -> None:
"""Initialize PicnicCart."""
super().__init__(coordinator)
self._attr_device_info = DeviceInfo(
entry_type=DeviceEntryType.SERVICE,
identifiers={(DOMAIN, cast(str, config_entry.unique_id))},
manufacturer="Picnic",
model=config_entry.unique_id,
)
self.hass = hass
self._attr_unique_id = f"{config_entry.unique_id}-cart"
@property
def todo_items(self) -> list[TodoItem] | None:
"""Get the current set of items in cart items."""
if self.coordinator.data is None:
return None
_LOGGER.debug(self.coordinator.data["cart_data"]["items"])
items = []
for item in self.coordinator.data["cart_data"]["items"]:
for article in item["items"]:
items.append(
TodoItem(
summary=f"{article['name']} ({article['unit_quantity']})",
uid=f"{item['id']}-{article['id']}",
status=TodoItemStatus.NEEDS_ACTION, # We set 'NEEDS_ACTION' so they count as state
)
)
return items
async def async_create_todo_item(self, item: TodoItem) -> None:
"""Add item to shopping cart."""
product_id = await self.hass.async_add_executor_job(
product_search, self.coordinator.picnic_api_client, item.summary
)
if not product_id:
raise ValueError("No product found or no product ID given")
await self.hass.async_add_executor_job(
self.coordinator.picnic_api_client.add_product, product_id, 1
)
await self.coordinator.async_refresh()