TimeTracker/TimeTracker.py

changeset 1
a0beac325e5a
child 2
058c6a316ca8
equal deleted inserted replaced
0:944024997123 1:a0beac325e5a
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the time tracker object.
8 """
9
10 import os
11
12 from PyQt4.QtCore import pyqtSignal, QObject
13
14 from E5Gui.E5Application import e5App
15 from E5Gui import E5MessageBox
16
17 from .TimeTrackEntry import TimeTrackEntry
18
19
20 class TimeTracker(QObject):
21 """
22 Class implementing the time tracker object.
23 """
24 currentEntryChanged = pyqtSignal()
25
26 FileName = "TimeTracker.txt"
27
28 def __init__(self, plugin, parent=None):
29 """
30 Constructor
31
32 @param plugin reference to the plugin object
33 @param parent parent (QObject)
34 """
35 QObject.__init__(self, parent)
36
37 self.__plugin = plugin
38 self.__ui = parent
39
40 self.__e5project = e5App().getObject("Project")
41
42 self.__initialize()
43
44 def __initialize(self):
45 """
46 Public slot to initialize some member variables.
47 """
48 self.__projectPath = ''
49 self.__trackerFilePath = ''
50 self.__projectOpen = False
51
52 self.__entries = []
53 self.__currentEntry = None
54
55 def projectOpened(self):
56 """
57 Public slot to handle the projectOpened signal.
58 """
59 if self.__projectOpen:
60 self.projectClosed()
61
62 self.__projectOpen = True
63 self.__projectPath = self.__e5project.getProjectPath()
64 self.__trackerFilePath = os.path.join(
65 self.__e5project.getProjectManagementDir(),
66 TimeTracker.FileName)
67
68 self.__readTrackerEntries()
69
70 self.__currentEntry = TimeTrackEntry()
71 self.__currentEntry.start()
72 self.currentEntryChanged.emit()
73
74 def projectClosed(self):
75 """
76 Public slot to handle the projectClosed signal.
77 """
78 if self.__currentEntry is not None:
79 self.__currentEntry.stop()
80 if self.__currentEntry.isValid():
81 self.__entries.append(self.__currentEntry)
82
83 self.__saveTrackerEntries()
84
85 self.__initialize()
86
87 def __readTrackerEntries(self):
88 """
89 Private slot to read the time tracker entries from a file.
90 """
91 if os.path.exists(self.__trackerFilePath):
92 try:
93 f = open(self.__trackerFilePath, "r", encoding="utf-8")
94 data = f.read()
95 f.close()
96 except (IOError, OSError) as err:
97 E5MessageBox.critical(self.__ui,
98 self.trUtf8("Read Time Tracker File"),
99 self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be"""
100 """ read.</p><p>Reason: {1}</p>""").format(
101 self.__trackerFilePath, str(err)))
102 return
103
104 invalidCount = 0
105 for line in data.splitlines():
106 entry = TimeTrackEntry()
107 if entry.fromString(line.strip()):
108 self.__entries.append(entry)
109 else:
110 invalidCount += 1
111
112 if invalidCount:
113 E5MessageBox.information(self.__ui,
114 self.trUtf8("Read Time Tracker File"),
115 self.trUtf8("""<p>The time tracker file <b>{0}</b> contained"""
116 """ %n invalid entries. These have been discarded.""",
117 "", invalidCount).format(self.__trackerFilePath))
118
119 def __saveTrackerEntries(self):
120 """
121 Private slot to save the tracker entries to a file.
122 """
123 try:
124 f = open(self.__trackerFilePath, "w", encoding="utf-8")
125 for entry in self.__entries:
126 if entry.isValid():
127 f.write(entry.toString() + "\n")
128 f.close()
129 except (IOError, OSError) as err:
130 E5MessageBox.critical(self.__ui,
131 self.trUtf8("Save Time Tracker File"),
132 self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be"""
133 """ saved.</p><p>Reason: {1}</p>""").format(
134 self.__trackerFilePath, str(err)))
135
136 def pauseTrackerEntry(self):
137 """
138 Public method to pause the current tracker entry.
139 """
140 self.__currentEntry.pause()
141
142 def continueTrackerEntry(self):
143 """
144 Public method to continue the current tracker entry.
145 """
146 self.__currentEntry.continue_()
147
148 def getCurrentEntry(self):
149 """
150 Public method to get a reference to the current tracker entry.
151 """
152 return self.__currentEntry
153
154 def newEntry(self):
155 """
156 Public method to stop the current tracker entry and start a new one.
157 """
158 # stop the current time tracker entry
159 if self.__currentEntry is not None:
160 self.__currentEntry.stop()
161 if self.__currentEntry.isValid():
162 self.__entries.append(self.__currentEntry)
163
164 # save the tracker entries
165 self.__saveTrackerEntries()
166
167 # start a new time tracker entry
168 self.__currentEntry = TimeTrackEntry()
169 self.__currentEntry.start()
170 self.currentEntryChanged.emit()

eric ide

mercurial