"""Actionables."""
from __future__ import annotations
from sqlite3 import Row
-from plomtask.db import DatabaseConnection
+from plomtask.db import DatabaseConnection, BaseModel
from plomtask.days import Day
from plomtask.processes import Process
from plomtask.conditions import Condition
HandledException)
-class Todo:
+class Todo(BaseModel):
"""Individual actionable."""
# pylint: disable=too-many-instance-attributes
+ name = 'Todo'
+ table_name = 'todos'
+ to_save = ['process_id', 'is_done', 'date']
+
def __init__(self, id_: int | None, process: Process,
is_done: bool, day: Day) -> None:
- self.id_ = id_
+ self.set_int_id(id_)
self.process = process
self._is_done = is_done
self.day = day
process=Process.by_id(db_conn, row[1]),
is_done=bool(row[2]),
day=Day.by_date(db_conn, row[3]))
- assert todo.id_ is not None
+ assert isinstance(todo.id_, int)
db_conn.cached_todos[todo.id_] = todo
return todo
return False
return True
+ @property
+ def process_id(self) -> int | str | None:
+ """Return ID of tasked Process."""
+ return self.process.id_
+
+ @property
+ def date(self) -> str:
+ """Return date of used Day."""
+ return self.day.date
+
@property
def is_done(self) -> bool:
"""Wrapper around self._is_done so we can control its setter."""
"""Write self and children to DB and its cache."""
if self.process.id_ is None:
raise NotFoundException('Process of Todo without ID (not saved?)')
- cursor = db_conn.exec('REPLACE INTO todos VALUES (?,?,?,?)',
- (self.id_, self.process.id_,
- self.is_done, self.day.date))
- self.id_ = cursor.lastrowid
- assert self.id_ is not None
+ self.save_core(db_conn)
+ assert isinstance(self.id_, int)
db_conn.cached_todos[self.id_] = self
db_conn.exec('DELETE FROM todo_children WHERE parent = ?',
(self.id_,))