TimeTracker/TimeTracker.py

Fri, 19 Oct 2012 13:06:56 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 19 Oct 2012 13:06:56 +0200
changeset 1
a0beac325e5a
child 2
058c6a316ca8
permissions
-rw-r--r--

Added a few source files.

# -*- 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