1 """A todo platform for Todoist."""
5 from typing
import Any, cast
7 from todoist_api_python.models
import Task
13 TodoListEntityFeature,
21 from .const
import DOMAIN
22 from .coordinator
import TodoistCoordinator
26 hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
28 """Set up the Todoist todo platform config entry."""
29 coordinator: TodoistCoordinator = hass.data[DOMAIN][entry.entry_id]
30 projects = await coordinator.async_get_projects()
33 for project
in projects
37 def _task_api_data(item: TodoItem, api_data: Task |
None =
None) -> dict[str, Any]:
38 """Convert a TodoItem to the set of add or update arguments."""
39 item_data: dict[str, Any] = {
40 "content": item.summary,
42 "description": item.description
or "",
45 if isinstance(due, datetime.datetime):
46 item_data[
"due_datetime"] = due.isoformat()
48 item_data[
"due_date"] = due.isoformat()
53 if api_data
and api_data.due:
54 item_data[
"due_string"] = api_data.due.string
58 item_data[
"due_string"] =
"no date"
63 """A Todoist TodoListEntity."""
65 _attr_supported_features = (
66 TodoListEntityFeature.CREATE_TODO_ITEM
67 | TodoListEntityFeature.UPDATE_TODO_ITEM
68 | TodoListEntityFeature.DELETE_TODO_ITEM
69 | TodoListEntityFeature.SET_DUE_DATE_ON_ITEM
70 | TodoListEntityFeature.SET_DUE_DATETIME_ON_ITEM
71 | TodoListEntityFeature.SET_DESCRIPTION_ON_ITEM
76 coordinator: TodoistCoordinator,
81 """Initialize TodoistTodoListEntity."""
82 super().
__init__(coordinator=coordinator)
89 """Handle updated data from the coordinator."""
90 if self.coordinator.data
is None:
94 for task
in self.coordinator.data:
97 if task.parent_id
is not None:
100 if task.is_completed:
101 status = TodoItemStatus.COMPLETED
103 status = TodoItemStatus.NEEDS_ACTION
104 due: datetime.date | datetime.datetime |
None =
None
105 if task_due := task.due:
106 if task_due.datetime:
107 due = dt_util.as_local(
108 datetime.datetime.fromisoformat(task_due.datetime)
111 due = datetime.date.fromisoformat(task_due.date)
114 summary=task.content,
118 description=task.description
or None,
125 """Create a To-do item."""
126 if item.status != TodoItemStatus.NEEDS_ACTION:
127 raise ValueError(
"Only active tasks may be created.")
128 await self.coordinator.api.add_task(
135 """Update a To-do item."""
136 uid: str = cast(str, item.uid)
137 api_data = next((d
for d
in self.coordinator.data
if d.id == uid),
None)
139 await self.coordinator.api.update_task(task_id=uid, **update_data)
140 if item.status
is not None:
143 if existing_item.uid != item.uid:
146 if item.status != existing_item.status:
147 if item.status == TodoItemStatus.COMPLETED:
148 await self.coordinator.api.close_task(task_id=uid)
150 await self.coordinator.api.reopen_task(task_id=uid)
154 """Delete a To-do item."""
155 await asyncio.gather(
156 *[self.coordinator.api.delete_task(task_id=uid)
for uid
in uids]
161 """When entity is added to hass update state from existing coordinator data."""
None async_added_to_hass(self)
None async_delete_todo_items(self, list[str] uids)
None async_create_todo_item(self, TodoItem item)
None _handle_coordinator_update(self)
None async_update_todo_item(self, TodoItem item)
None __init__(self, TodoistCoordinator coordinator, str config_entry_id, str project_id, str project_name)
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
dict[str, Any] _task_api_data(TodoItem item, Task|None api_data=None)