61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
"""DataUpdateCoordinator for the Todoist component."""
|
|
|
|
from datetime import timedelta
|
|
import logging
|
|
|
|
from todoist_api_python.api_async import TodoistAPIAsync
|
|
from todoist_api_python.models import Label, Project, Section, Task
|
|
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
|
|
|
|
|
class TodoistCoordinator(DataUpdateCoordinator[list[Task]]):
|
|
"""Coordinator for updating task data from Todoist."""
|
|
|
|
def __init__(
|
|
self,
|
|
hass: HomeAssistant,
|
|
logger: logging.Logger,
|
|
entry: ConfigEntry | None,
|
|
update_interval: timedelta,
|
|
api: TodoistAPIAsync,
|
|
token: str,
|
|
) -> None:
|
|
"""Initialize the Todoist coordinator."""
|
|
super().__init__(
|
|
hass,
|
|
logger,
|
|
config_entry=entry,
|
|
name="Todoist",
|
|
update_interval=update_interval,
|
|
)
|
|
self.api = api
|
|
self._projects: list[Project] | None = None
|
|
self._labels: list[Label] | None = None
|
|
self.token = token
|
|
|
|
async def _async_update_data(self) -> list[Task]:
|
|
"""Fetch tasks from the Todoist API."""
|
|
try:
|
|
return await self.api.get_tasks()
|
|
except Exception as err:
|
|
raise UpdateFailed(f"Error communicating with API: {err}") from err
|
|
|
|
async def async_get_projects(self) -> list[Project]:
|
|
"""Return todoist projects fetched at most once."""
|
|
if self._projects is None:
|
|
self._projects = await self.api.get_projects()
|
|
return self._projects
|
|
|
|
async def async_get_sections(self, project_id: str) -> list[Section]:
|
|
"""Return todoist sections for a given project ID."""
|
|
return await self.api.get_sections(project_id=project_id)
|
|
|
|
async def async_get_labels(self) -> list[Label]:
|
|
"""Return todoist labels fetched at most once."""
|
|
if self._labels is None:
|
|
self._labels = await self.api.get_labels()
|
|
return self._labels
|