forked from artynusov/MacTimeLog
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Timings.py
120 lines (100 loc) · 3.35 KB
/
Timings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#
# Timings.py
# Class for working with task timings
#
# Copyright 2009 Artem Yunusov. All rights reserved.
#
import datetime
import time
from Settings import Settings
class Timings(object):
_spent = 0
_slacking = 0
_prevDate = None
_taskType = None
def __init__(self):
self._startDateTime = self.workStartDateTime()
@property
def spentSeconds(self):
"""Return time, spent on work"""
possible = 0
if self._taskType:
possible = 0 if self._taskType == "slack" else self.currentSeconds
return self._spent + possible
@property
def slackingSeconds(self):
"""Retrun slacking time"""
possible = 0
if self._taskType:
possible = 0 if self._taskType == "work" else self.currentSeconds
return self._slacking + possible
@property
def leftSeconds(self):
"""Return time left to work"""
res = Settings.get("workDayLength") - self.spentSeconds
if res < 0:
return 0
else:
return res
@property
def currentSeconds(self):
"""Retrun curent task time"""
if self._prevDate:
return (Timings.now() - self._prevDate).seconds
else:
return 0
@property
def workTillTime(self):
"""Return work till estimate"""
currenttime = time.time()
return time.localtime(currenttime + self.leftSeconds)
@staticmethod
def now():
"""Returren current datetime"""
return datetime.datetime.now()
@staticmethod
def workEndTime():
return datetime.datetime.strptime(Settings.get("workEndTime"), "%H:%M").time()
@staticmethod
def workStartDateTime():
""" Return datetime object that represents start of the working day """
workEndTime = Timings.workEndTime()
cd = datetime.datetime.combine(Timings.now().date(),
workEndTime)
if Timings.now().time() < workEndTime:
cd -= datetime.timedelta(days=1)
return cd
@staticmethod
def combineDateWithTime(date):
"""Combine date with work end/start time"""
return datetime.datetime.combine(date, Timings.workEndTime())
def setPrevDate(self, prevDate):
"""Set datetime of previous task"""
self._prevDate = prevDate
def setCurrentTaskType(self, taskType):
"""Set current task type"""
self._taskType = taskType
def count(self, date, taskType):
"""
Increment counters
Return seconds spent on task
"""
if self._prevDate is None:
self._prevDate = date
return None
else:
currSpentSeconds = (date - self._prevDate).seconds
if taskType == "slack":
self._slacking += currSpentSeconds
elif taskType == "work":
self._spent += currSpentSeconds
self._prevDate = date
return currSpentSeconds
def isNextDay(self):
"""Return true if program next working day started"""
if self._startDateTime + datetime.timedelta(days=1) < self.now():
return True
else:
return False
if __name__ == '__main__':
t = Timings()