Coverage for /Users/davegaeddert/Development/dropseed/plain/plain-staff/plain/staff/dates.py: 67%
46 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-16 22:04 -0500
« prev ^ index » next coverage.py v7.6.1, created at 2024-10-16 22:04 -0500
1import datetime
2from enum import Enum
4from plain.utils import timezone
7class DatetimeRangeAliases(Enum):
8 LAST_365_DAYS = "last_365_days"
9 LAST_30_DAYS = "last_30_days"
10 LAST_7_DAYS = "last_7_days"
11 INHERIT = "inherit"
13 @classmethod
14 def to_range(cls, value: str) -> (datetime.datetime, datetime.datetime):
15 now = timezone.localtime()
16 if value == cls.LAST_365_DAYS:
17 return DatetimeRange(now - datetime.timedelta(days=365), now)
18 if value == cls.LAST_30_DAYS:
19 return DatetimeRange(now - datetime.timedelta(days=30), now)
20 if value == cls.LAST_7_DAYS:
21 return DatetimeRange(now - datetime.timedelta(days=7), now)
22 raise ValueError(f"Invalid range: {value}")
25class DatetimeRange:
26 def __init__(self, start, end):
27 self.start = start
28 self.end = end
30 if isinstance(self.start, str) and self.start:
31 self.start = datetime.datetime.fromisoformat(self.start)
33 if isinstance(self.end, str) and self.end:
34 self.end = datetime.datetime.fromisoformat(self.end)
36 if isinstance(self.start, datetime.date):
37 self.start = timezone.localtime().replace(
38 year=self.start.year, month=self.start.month, day=self.start.day
39 )
41 if isinstance(self.end, datetime.date):
42 self.end = timezone.localtime().replace(
43 year=self.end.year, month=self.end.month, day=self.end.day
44 )
46 def as_tuple(self):
47 return (self.start, self.end)
49 def total_days(self):
50 return (self.end - self.start).days
52 def __iter__(self):
53 # Iters days currently... probably should have an iter_days method instead
54 return iter(
55 self.start.date() + datetime.timedelta(days=i)
56 for i in range(0, self.total_days())
57 )
59 def __repr__(self):
60 return f"DatetimeRange({self.start}, {self.end})"
62 def __str__(self):
63 return f"{self.start} to {self.end}"
65 def __eq__(self, other):
66 return self.start == other.start and self.end == other.end
68 def __hash__(self):
69 return hash((self.start, self.end))
71 def __contains__(self, item):
72 return self.start <= item <= self.end