X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomtask%2Fdb.py;h=4396b444a61f0c2f59e2046b554e79c56e541faa;hb=f92de64d072009c8c4bf96b9eeb9fa245045662b;hp=548381e72e5c473047d7b90cb7f55ea1627b0ca6;hpb=f79031c51b888d66448d18b159f17fbe28c7885c;p=plomtask diff --git a/plomtask/db.py b/plomtask/db.py index 548381e..4396b44 100644 --- a/plomtask/db.py +++ b/plomtask/db.py @@ -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]: