home · contact · privacy
Display historical VersionedAttributes where it makes sense.
[plomtask] / plomtask / days.py
index 9f3aa697a831758d0635109446a35e73428b7181..fe1ba44e80e9a1c4182130b870d6d531dc9c9c06 100644 (file)
@@ -3,8 +3,11 @@ from __future__ import annotations
 from datetime import datetime, timedelta
 from plomtask.exceptions import BadFormatException
 from plomtask.db import DatabaseConnection, BaseModel
 from datetime import datetime, timedelta
 from plomtask.exceptions import BadFormatException
 from plomtask.db import DatabaseConnection, BaseModel
+from plomtask.todos import Todo
 
 DATE_FORMAT = '%Y-%m-%d'
 
 DATE_FORMAT = '%Y-%m-%d'
+MIN_RANGE_DATE = '2024-01-01'
+MAX_RANGE_DATE = '2030-12-31'
 
 
 def valid_date(date_str: str) -> str:
 
 
 def valid_date(date_str: str) -> str:
@@ -34,6 +37,7 @@ class Day(BaseModel[str]):
         super().__init__(id_)
         self.datetime = datetime.strptime(self.date, DATE_FORMAT)
         self.comment = comment
         super().__init__(id_)
         self.datetime = datetime.strptime(self.date, DATE_FORMAT)
         self.comment = comment
+        self.calendarized_todos: list[Todo] = []
 
     def __lt__(self, other: Day) -> bool:
         return self.date < other.date
 
     def __lt__(self, other: Day) -> bool:
         return self.date < other.date
@@ -42,7 +46,14 @@ class Day(BaseModel[str]):
     def all(cls, db_conn: DatabaseConnection,
             date_range: tuple[str, str] = ('', ''),
             fill_gaps: bool = False) -> list[Day]:
     def all(cls, db_conn: DatabaseConnection,
             date_range: tuple[str, str] = ('', ''),
             fill_gaps: bool = False) -> list[Day]:
-        """Return list of Days in database within date_range."""
+        """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.
+
+        On fill_gaps=True, will instantiate (without saving) Days of all dates
+        within the date range that don't exist yet.
+        """
         min_date = '2024-01-01'
         max_date = '2030-12-31'
         start_date = valid_date(date_range[0] if date_range[0] else min_date)
         min_date = '2024-01-01'
         max_date = '2030-12-31'
         start_date = valid_date(date_range[0] if date_range[0] else min_date)
@@ -69,6 +80,17 @@ class Day(BaseModel[str]):
         assert isinstance(self.id_, str)
         return self.id_
 
         assert isinstance(self.id_, str)
         return self.id_
 
+    @property
+    def first_of_month(self) -> bool:
+        """Return what month self.date is part of."""
+        assert isinstance(self.id_, str)
+        return self.id_[-2:] == '01'
+
+    @property
+    def month_name(self) -> str:
+        """Return what month self.date is part of."""
+        return self.datetime.strftime('%B')
+
     @property
     def weekday(self) -> str:
         """Return what weekday matches self.date."""
     @property
     def weekday(self) -> str:
         """Return what weekday matches self.date."""
@@ -86,6 +108,7 @@ class Day(BaseModel[str]):
         next_datetime = self.datetime + timedelta(days=1)
         return next_datetime.strftime(DATE_FORMAT)
 
         next_datetime = self.datetime + timedelta(days=1)
         return next_datetime.strftime(DATE_FORMAT)
 
-    def save(self, db_conn: DatabaseConnection) -> None:
-        """Add (or re-write) self to DB and cache."""
-        self.save_core(db_conn)
+    def collect_calendarized_todos(self, db_conn: DatabaseConnection) -> None:
+        """Fill self.calendarized_todos."""
+        self.calendarized_todos = [t for t in Todo.by_date(db_conn, self.date)
+                                   if t.calendarize]