home · contact · privacy
Base core models on BaseModel providing sensible defaults.
[plomtask] / plomtask / todos.py
index ce83faddff55278c0efe44f604f6a5fddfaa5851..5d46b30d93640e40ba39f6e0cd1ba4b114241396 100644 (file)
@@ -1,7 +1,7 @@
 """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
@@ -9,14 +9,18 @@ from plomtask.exceptions import (NotFoundException, BadFormatException,
                                  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
@@ -37,7 +41,7 @@ class Todo:
                    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
 
@@ -115,6 +119,16 @@ class 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."""
@@ -171,11 +185,8 @@ class Todo:
         """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_,))