E5XML/TasksHandler.py

Sun, 18 Apr 2010 10:52:29 +0000

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 18 Apr 2010 10:52:29 +0000
changeset 186
655fda145529
parent 55
b5c84934de9c
child 792
a13346916170
permissions
-rw-r--r--

Prepared new snapshot release.

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

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

"""
Module implementing the handler class for reading an XML tasks file.
"""

import os
import time

from E5Gui.E5Application import e5App

from .Config import tasksFileFormatVersion
from .XMLHandlerBase import XMLHandlerBase

import Utilities

class TasksHandler(XMLHandlerBase):
    """
    Class implementing a sax handler to read an XML tasks file.
    """
    def __init__(self, forProject = False, taskViewer=None):
        """
        Constructor
        
        @param forProject flag indicating project related mode (boolean)
        @param taskViewer reference to the task viewer object
        """
        XMLHandlerBase.__init__(self)
        
        self.startDocumentSpecific = self.startDocumentTasks
        
        self.elements.update({
            'Tasks' : (self.startTasks, self.defaultEndElement),
            'Summary' : (self.defaultStartElement, self.endSummary),
            'Description' : (self.defaultStartElement, self.endDescription),
            'Created' : (self.defaultStartElement, self.endCreated),
            'Dir' : (self.defaultStartElement, self.endDir),
            'Name' : (self.defaultStartElement, self.endName),
            'Filename' : (self.startFilename, self.endFilename),
            'Linenumber' : (self.defaultStartElement, self.endLinenumber),
            'Task' : (self.startTask, self.endTask),
        })
    
        self.forProject = forProject
        if taskViewer:
            self.taskViewer = taskViewer
        else:
            self.taskViewer = e5App().getObject("TaskViewer")
        
    def startDocumentTasks(self):
        """
        Handler called, when the document parsing is started.
        """
        self.version = ''
        self.pathStack = []
        
    ###################################################
    ## below follow the individual handler functions
    ###################################################
    
    def startTask(self, attrs):
        """
        Handler method for the "Task" start tag.
        
        @param attrs list of tag attributes
        """
        self.task = {"summary"     : "",
                     "priority"    : 1,
                     "completed"   : False,
                     "created"     : 0,
                     "filename"    : "",
                     "linenumber"  : 0,
                     "bugfix"      : False,
                     "description" : "",
                    }
        self.task["priority"] = int(attrs.get("priority", "1"))
        
        val = attrs.get("completed", "False")
        if val in ["True", "False"]:
            val = (val == "True")
        else:
            val = bool(int(val))
        self.task["completed"] = val
        
        val = attrs.get("bugfix", "False")
        if val in ["True", "False"]:
            val = (val == "True")
        else:
            val = bool(int(val))
        self.task["bugfix"] = val
    
    def endTask(self):
        """
        Handler method for the "Task" end tag.
        """
        self.taskViewer.addTask(self.task["summary"], priority = self.task["priority"],
            filename = self.task["filename"], lineno = self.task["linenumber"], 
            completed = self.task["completed"],
            _time = self.task["created"], isProjectTask = self.forProject,
            isBugfixTask = self.task["bugfix"], longtext = self.task["description"])
        
    def endSummary(self):
        """
        Handler method for the "Summary" end tag.
        """
        self.task["summary"] = self.unescape(self.buffer)
        
    def endDescription(self):
        """
        Handler method for the "Description" end tag.
        """
        if self.version < '4.1':
            self.task["summary"] = self.unescape(self.buffer)
        elif self.version == '4.1':
            self.task["description"] = self.unescape(self.buffer)
        else:
            self.buffer = self.unescape(self.buffer)
            self.task["description"] = self.decodedNewLines(self.buffer)
        
    def endCreated(self):
        """
        Handler method for the "Created" end tag.
        """
        self.task["created"] = \
            time.mktime(time.strptime(self.buffer, "%Y-%m-%d, %H:%M:%S"))
    
    def endDir(self):
        """
        Handler method for the "Dir" end tag.
        """
        self.pathStack.append(self.buffer)
        
    def endName(self):
        """
        Handler method for the "Name" end tag.
        """
        self.pathStack.append(self.buffer)
        
    def endLinenumber(self):
        """
        Handler method for the "Linenumber" end tag.
        """
        try:
            self.task["linenumber"] = int(self.buffer)
        except ValueError:
            pass
    
    def startFilename(self, attrs):
        """
        Handler method for the "Filename" start tag.
        
        @param attrs list of tag attributes
        """
        self.pathStack = []
        self.buffer = ""
        
    def endFilename(self):
        """
        Handler method for the "Filename" end tag.
        """
        if self.version >= '4.2':
            self.task["filename"] = \
                Utilities.toNativeSeparators(self.buffer)
        else:
            self.task["filename"] = self.__buildPath()
        
    def __buildPath(self):
        """
        Private method to assemble a path.
        
        @return The ready assembled path. (string)
        """
        path = ""
        if self.pathStack and not self.pathStack[0]:
            self.pathStack[0] = os.sep
        for p in self.pathStack:
            path = os.path.join(path, p)
        return path
        
    def startTasks(self, attrs):
        """
        Handler method for the "Tasks" start tag.
        
        @param attrs list of tag attributes
        """
        self.version = attrs.get('version', tasksFileFormatVersion)
        
    def getVersion(self):
        """
        Public method to retrieve the version of the tasks file.
        
        @return String containing the version number.
        """
        return self.version

eric ide

mercurial