TimeTracker/TimeTracker.py

changeset 1
a0beac325e5a
child 2
058c6a316ca8
diff -r 944024997123 -r a0beac325e5a TimeTracker/TimeTracker.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TimeTracker/TimeTracker.py	Fri Oct 19 13:06:56 2012 +0200
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing the time tracker object.
+"""
+
+import os
+
+from PyQt4.QtCore import pyqtSignal, QObject
+
+from E5Gui.E5Application import e5App
+from E5Gui import E5MessageBox
+
+from .TimeTrackEntry import TimeTrackEntry
+
+
+class TimeTracker(QObject):
+    """
+    Class implementing the time tracker object.
+    """
+    currentEntryChanged = pyqtSignal()
+    
+    FileName = "TimeTracker.txt"
+    
+    def __init__(self, plugin, parent=None):
+        """
+        Constructor
+        
+        @param plugin reference to the plugin object
+        @param parent parent (QObject)
+        """
+        QObject.__init__(self, parent)
+        
+        self.__plugin = plugin
+        self.__ui = parent
+        
+        self.__e5project = e5App().getObject("Project")
+        
+        self.__initialize()
+    
+    def __initialize(self):
+        """
+        Public slot to initialize some member variables.
+        """
+        self.__projectPath = ''
+        self.__trackerFilePath = ''
+        self.__projectOpen = False
+        
+        self.__entries = []
+        self.__currentEntry = None
+    
+    def projectOpened(self):
+        """
+        Public slot to handle the projectOpened signal.
+        """
+        if self.__projectOpen:
+            self.projectClosed()
+        
+        self.__projectOpen = True
+        self.__projectPath = self.__e5project.getProjectPath()
+        self.__trackerFilePath = os.path.join(
+            self.__e5project.getProjectManagementDir(),
+            TimeTracker.FileName)
+        
+        self.__readTrackerEntries()
+        
+        self.__currentEntry = TimeTrackEntry()
+        self.__currentEntry.start()
+        self.currentEntryChanged.emit()
+    
+    def projectClosed(self):
+        """
+        Public slot to handle the projectClosed signal.
+        """
+        if self.__currentEntry is not None:
+            self.__currentEntry.stop()
+            if self.__currentEntry.isValid():
+                self.__entries.append(self.__currentEntry)
+        
+        self.__saveTrackerEntries()
+        
+        self.__initialize()
+    
+    def __readTrackerEntries(self):
+        """
+        Private slot to read the time tracker entries from a file.
+        """
+        if os.path.exists(self.__trackerFilePath):
+            try:
+                f = open(self.__trackerFilePath, "r", encoding="utf-8")
+                data = f.read()
+                f.close()
+            except (IOError, OSError) as err:
+                E5MessageBox.critical(self.__ui,
+                    self.trUtf8("Read Time Tracker File"),
+                    self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be"""
+                                """ read.</p><p>Reason: {1}</p>""").format(
+                        self.__trackerFilePath, str(err)))
+                return
+            
+            invalidCount = 0
+            for line in data.splitlines():
+                entry = TimeTrackEntry()
+                if entry.fromString(line.strip()):
+                    self.__entries.append(entry)
+                else:
+                    invalidCount += 1
+            
+            if invalidCount:
+                E5MessageBox.information(self.__ui,
+                    self.trUtf8("Read Time Tracker File"),
+                    self.trUtf8("""<p>The time tracker file <b>{0}</b> contained"""
+                                """ %n invalid entries. These have been discarded.""",
+                                "", invalidCount).format(self.__trackerFilePath))
+    
+    def __saveTrackerEntries(self):
+        """
+        Private slot to save the tracker entries to a file.
+        """
+        try:
+            f = open(self.__trackerFilePath, "w", encoding="utf-8")
+            for entry in self.__entries:
+                if entry.isValid():
+                    f.write(entry.toString() + "\n")
+            f.close()
+        except (IOError, OSError) as err:
+            E5MessageBox.critical(self.__ui,
+                self.trUtf8("Save Time Tracker File"),
+                self.trUtf8("""<p>The time tracker file <b>{0}</b> could not be"""
+                            """ saved.</p><p>Reason: {1}</p>""").format(
+                    self.__trackerFilePath, str(err)))
+    
+    def pauseTrackerEntry(self):
+        """
+        Public method to pause the current tracker entry.
+        """
+        self.__currentEntry.pause()
+    
+    def continueTrackerEntry(self):
+        """
+        Public method to continue the current tracker entry.
+        """
+        self.__currentEntry.continue_()
+    
+    def getCurrentEntry(self):
+        """
+        Public method to get a reference to the current tracker entry.
+        """
+        return self.__currentEntry
+    
+    def newEntry(self):
+        """
+        Public method to stop the current tracker entry and start a new one.
+        """
+        # stop the current time tracker entry
+        if self.__currentEntry is not None:
+            self.__currentEntry.stop()
+            if self.__currentEntry.isValid():
+                self.__entries.append(self.__currentEntry)
+        
+        # save the tracker entries
+        self.__saveTrackerEntries()
+        
+        # start a new time tracker entry
+        self.__currentEntry = TimeTrackEntry()
+        self.__currentEntry.start()
+        self.currentEntryChanged.emit()

eric ide

mercurial