TimeTracker/TimeTracker.py

Fri, 19 Oct 2012 15:54:12 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 19 Oct 2012 15:54:12 +0200
changeset 2
058c6a316ca8
parent 1
a0beac325e5a
child 4
c67abfea9955
permissions
-rw-r--r--

Implemented the next step.

# -*- coding: utf-8 -*-

# Copyright (c) 2012 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing the time tracker object.
"""

import os

from PyQt4.QtCore import QObject

from E5Gui.E5Application import e5App
from E5Gui import E5MessageBox

from .TimeTrackEntry import TimeTrackEntry
from .TimeTrackerWidget import TimeTrackerWidget

import UI.PixmapCache


class TimeTracker(QObject):
    """
    Class implementing the time tracker object.
    """
    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.__widget = TimeTrackerWidget(self)
        self.__ui.addSideWidget(self.__ui.BottomSide, self.__widget,
            UI.PixmapCache.getIcon(os.path.join("TimeTracker", "icons", "clock.png")),
            self.tr("Time Tracker"))
        
        self.__initialize()
    
    def __initialize(self):
        """
        Public slot to initialize some member variables.
        """
        self.__projectPath = ''
        self.__trackerFilePath = ''
        self.__projectOpen = False
        
        self.__entries = []
        self.__currentEntry = None
        
        self.__widget.clear()
    
    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.__widget.showTrackerEntries(sorted(self.__entries, reverse=True))
        
        self.__currentEntry = TimeTrackEntry()
        self.__currentEntry.start()
        self.__widget.setCurrentEntry(self.__currentEntry)
    
    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()

eric ide

mercurial