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

1import datetime 

2from enum import Enum 

3 

4from plain.utils import timezone 

5 

6 

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" 

12 

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}") 

23 

24 

25class DatetimeRange: 

26 def __init__(self, start, end): 

27 self.start = start 

28 self.end = end 

29 

30 if isinstance(self.start, str) and self.start: 

31 self.start = datetime.datetime.fromisoformat(self.start) 

32 

33 if isinstance(self.end, str) and self.end: 

34 self.end = datetime.datetime.fromisoformat(self.end) 

35 

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 ) 

40 

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 ) 

45 

46 def as_tuple(self): 

47 return (self.start, self.end) 

48 

49 def total_days(self): 

50 return (self.end - self.start).days 

51 

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 ) 

58 

59 def __repr__(self): 

60 return f"DatetimeRange({self.start}, {self.end})" 

61 

62 def __str__(self): 

63 return f"{self.start} to {self.end}" 

64 

65 def __eq__(self, other): 

66 return self.start == other.start and self.end == other.end 

67 

68 def __hash__(self): 

69 return hash((self.start, self.end)) 

70 

71 def __contains__(self, item): 

72 return self.start <= item <= self.end