1- from datetime import datetime , timedelta
2- from utils .time import (
3- current_datetime ,
4- current_datetime_str ,
5- start_datetime_of_current_month ,
6- start_datetime_of_current_week ,
7- start_datetime_of_current_day ,
8- start_datetime_of_current_month_str ,
9- )
1+ import pytz
2+ from datetime import datetime , timedelta , timezone
3+ from utils .time import datetime_str
4+
5+
6+ class DateRange :
7+ def __init__ (self , _timezone ):
8+ self .tz = _timezone
9+
10+ def start (self ):
11+ raise NotImplementedError
12+
13+ def end (self ):
14+ return datetime .now (self .tz )
15+
16+
17+ class MonthDateRange (DateRange ):
18+ def start (self ):
19+ return (
20+ datetime .now (self .tz )
21+ .replace (hour = 0 , minute = 0 , second = 0 , microsecond = 0 )
22+ .replace (day = 1 )
23+ )
24+
25+
26+ class WeekDateRange (DateRange ):
27+ def start (self ):
28+ result = datetime .now (self .tz ).replace (
29+ hour = 0 , minute = 0 , second = 0 , microsecond = 0
30+ )
31+ result = result - timedelta (days = result .weekday ())
32+ return result
33+
34+
35+ class DayDateRange (DateRange ):
36+ def start (self ):
37+ return datetime .now (self .tz ).replace (
38+ hour = 0 , minute = 0 , second = 0 , microsecond = 0
39+ )
1040
1141
1242def date_range ():
43+ dr = MonthDateRange (pytz .UTC )
1344 return {
14- "start_date" : start_datetime_of_current_month_str ( ),
15- "end_date" : current_datetime_str ( ),
45+ "start_date" : datetime_str ( dr . start () ),
46+ "end_date" : datetime_str ( dr . end () ),
1647 }
1748
1849
19- def stop_running_time_entry (time_entries ):
50+ def stop_running_time_entry (time_entries , tz ):
51+ end = datetime .now (tz )
2052 for t in time_entries :
2153 if t .end_date is None :
22- t .end_date = current_datetime_str ( )
54+ t .end_date = datetime_str ( end )
2355
2456
2557class WorkedTime :
2658 def __init__ (self , time_entries ):
2759 self .time_entries = time_entries
2860
29- @classmethod
30- def from_time_entries_in_range (
31- cls , time_entries , start_date : datetime , end_date : datetime
32- ):
33- time_entries_in_range = [
34- t for t in time_entries if t .in_range (start_date , end_date )
35- ]
36- return cls (time_entries_in_range )
37-
3861 def total_time_in_seconds (self ):
3962 times = [t .elapsed_time for t in self .time_entries ]
4063 total_time = sum (times , timedelta ())
@@ -57,36 +80,38 @@ def summary(self):
5780 }
5881
5982
60- def worked_time_in_day (time_entries ):
61- return WorkedTime .from_time_entries_in_range (
62- time_entries ,
63- start_date = start_datetime_of_current_day (),
64- end_date = current_datetime (),
65- ).summary ()
83+ def filter_time_entries (time_entries , dr : DateRange ):
84+ return [
85+ t
86+ for t in time_entries
87+ if t .in_range (start_date = dr .start (), end_date = dr .end ())
88+ ]
89+
90+
91+ def worked_time_in_day (time_entries , tz ):
92+ dr = DayDateRange (tz )
93+ day_time_entries = filter_time_entries (time_entries , dr )
94+ return WorkedTime (day_time_entries ).summary ()
6695
6796
68- def worked_time_in_week (time_entries ):
69- return WorkedTime .from_time_entries_in_range (
70- time_entries ,
71- start_date = start_datetime_of_current_week (),
72- end_date = current_datetime (),
73- ).summary ()
97+ def worked_time_in_week (time_entries , tz ):
98+ dr = WeekDateRange (tz )
99+ week_time_entries = filter_time_entries (time_entries , dr )
100+ return WorkedTime (week_time_entries ).summary ()
74101
75102
76- def worked_time_in_month (time_entries ):
77- return WorkedTime .from_time_entries_in_range (
78- time_entries ,
79- start_date = start_datetime_of_current_month (),
80- end_date = current_datetime (),
81- ).summary ()
103+ def worked_time_in_month (time_entries , tz ):
104+ dr = MonthDateRange (tz )
105+ month_time_entries = filter_time_entries (time_entries , dr )
106+ return WorkedTime (month_time_entries ).summary ()
82107
83108
84109def summary (time_entries , time_offset ):
85110 offset_in_minutes = time_offset if time_offset else 300
86- print ( offset_in_minutes )
87- stop_running_time_entry (time_entries )
111+ tz = timezone ( timedelta ( minutes = - offset_in_minutes ) )
112+ stop_running_time_entry (time_entries , tz )
88113 return {
89- 'day' : worked_time_in_day (time_entries ),
90- 'week' : worked_time_in_week (time_entries ),
91- 'month' : worked_time_in_month (time_entries ),
114+ 'day' : worked_time_in_day (time_entries , tz ),
115+ 'week' : worked_time_in_week (time_entries , tz ),
116+ 'month' : worked_time_in_month (time_entries , tz ),
92117 }
0 commit comments