home · contact · privacy
Use same date ranging code for Day and Todo filtering.
[plomtask] / plomtask / db.py
index 548381e72e5c473047d7b90cb7f55ea1627b0ca6..4396b444a61f0c2f59e2046b554e79c56e541faa 100644 (file)
@@ -6,6 +6,7 @@ from difflib import Differ
 from sqlite3 import connect as sql_connect, Cursor, Row
 from typing import Any, Self, TypeVar, Generic
 from plomtask.exceptions import HandledException, NotFoundException
+from plomtask.dating import (MIN_RANGE_DATE, MAX_RANGE_DATE, valid_date)
 
 EXPECTED_DB_VERSION = 4
 MIGRATIONS_DIR = 'migrations'
@@ -354,6 +355,29 @@ class BaseModel(Generic[BaseModelId]):
                 items[item.id_] = item
         return list(items.values())
 
+    @classmethod
+    def by_date_range_with_limits(cls: type[BaseModelInstance],
+                                  db_conn: DatabaseConnection,
+                                  date_range: tuple[str, str] = ('', ''),
+                                  date_col: str = 'day'
+                                  ) -> tuple[list[BaseModelInstance], str,
+                                             str]:
+        """Return list of Days in database within (open) date_range interval.
+
+        If no range values provided, defaults them to MIN_RANGE_DATE and
+        MAX_RANGE_DATE. Also knows to properly interpret 'today' as value.
+        """
+        min_date = MIN_RANGE_DATE
+        max_date = MAX_RANGE_DATE
+        start_date = valid_date(date_range[0] if date_range[0] else min_date)
+        end_date = valid_date(date_range[1] if date_range[1] else max_date)
+        items = []
+        sql = f'SELECT id FROM {cls.table_name} '
+        sql += f'WHERE {date_col} >= ? AND {date_col} <= ?'
+        for row in db_conn.exec(sql, (start_date, end_date)):
+            items += [cls.by_id(db_conn, row[0])]
+        return items, start_date, end_date
+
     @classmethod
     def matching(cls: type[BaseModelInstance], db_conn: DatabaseConnection,
                  pattern: str) -> list[BaseModelInstance]: