eric6/E5XML/TasksReader.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
diff -r f99d60d6b59b -r 2602857055c5 eric6/E5XML/TasksReader.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/E5XML/TasksReader.py	Sun Apr 14 15:09:21 2019 +0200
@@ -0,0 +1,144 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class for reading an XML tasks file.
+"""
+
+from __future__ import unicode_literals
+
+import time
+
+from E5Gui.E5Application import e5App
+
+from .Config import tasksFileFormatVersion
+from .XMLStreamReaderBase import XMLStreamReaderBase
+
+from Tasks.Task import Task
+
+import Utilities
+
+
+class TasksReader(XMLStreamReaderBase):
+    """
+    Class for reading an XML tasks file.
+    """
+    supportedVersions = ["4.2", "5.0", "5.1", "6.0"]
+    
+    def __init__(self, device, forProject=False, viewer=None):
+        """
+        Constructor
+        
+        @param device reference to the I/O device to read from (QIODevice)
+        @param forProject flag indicating project related mode (boolean)
+        @param viewer reference to the task viewer (TaskViewer)
+        """
+        XMLStreamReaderBase.__init__(self, device)
+        
+        self.viewer = viewer
+        
+        self.forProject = forProject
+        if viewer:
+            self.viewer = viewer
+        else:
+            self.viewer = e5App().getObject("TaskViewer")
+        
+        self.version = ""
+        self.tasks = []
+    
+    def readXML(self):
+        """
+        Public method to read and parse the XML document.
+        """
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement() and self.name() == "Tasks":
+                for task, expanded in self.tasks:
+                    task.setExpanded(expanded)
+                break
+            
+            if self.isStartElement():
+                if self.name() == "Tasks":
+                    self.version = self.attribute(
+                        "version", tasksFileFormatVersion)
+                    if self.version not in self.supportedVersions:
+                        self.raiseUnsupportedFormatVersion(self.version)
+                elif self.name() == "Task":
+                    self.__readTask()
+                elif self.name() == "ProjectScanFilter":
+                    scanFilter = self.readElementText()
+                    if self.forProject:
+                        self.viewer.projectTasksScanFilter = scanFilter
+                else:
+                    self.raiseUnexpectedStartTag(self.name())
+        
+        self.showErrorMessage()
+    
+    def __readTask(self):
+        """
+        Private method to read the task info.
+        """
+        task = {"summary": "",
+                "priority": 1,
+                "completed": False,
+                "created": 0,
+                "filename": "",
+                "linenumber": 0,
+                "type": Task.TypeTodo,
+                "description": "",
+                "uid": "",
+                }
+        task["priority"] = int(self.attribute("priority", "1"))
+        task["completed"] = self.toBool(self.attribute("completed", "False"))
+        if self.version in ["4.2", "5.0"]:
+            isBugfix = self.toBool(self.attribute("bugfix", "False"))
+            if isBugfix:
+                task["type"] = Task.TypeFixme
+        else:
+            task["type"] = int(self.attribute("type", str(Task.TypeTodo)))
+        uid = self.attribute("uid", "")
+        if uid:
+            task["uid"] = uid
+        else:
+            # upgrade from pre 6.0 format
+            from PyQt5.QtCore import QUuid
+            task["uid"] = QUuid.createUuid().toString()
+        parentUid = self.attribute("parent_uid", "")
+        expanded = self.toBool(self.attribute("expanded", "True"))
+        
+        while not self.atEnd():
+            self.readNext()
+            if self.isEndElement() and self.name() == "Task":
+                parentTask = self.viewer.findParentTask(parentUid)
+                addedTask = self.viewer.addTask(
+                    task["summary"], priority=task["priority"],
+                    filename=task["filename"], lineno=task["linenumber"],
+                    completed=task["completed"], _time=task["created"],
+                    isProjectTask=self.forProject, taskType=task["type"],
+                    description=task["description"], uid=task["uid"],
+                    parentTask=parentTask)
+                self.tasks.append((addedTask, expanded))
+                break
+            
+            if self.isStartElement():
+                if self.name() == "Summary":
+                    task["summary"] = self.readElementText()
+                elif self.name() == "Description":
+                    task["description"] = self.readElementText()
+                elif self.name() == "Created":
+                    task["created"] = time.mktime(time.strptime(
+                        self.readElementText(), "%Y-%m-%d, %H:%M:%S"))
+                elif self.name() == "Resource":
+                    continue    # handle but ignore this tag
+                elif self.name() == "Filename":
+                    task["filename"] = \
+                        Utilities.toNativeSeparators(self.readElementText())
+                elif self.name() == "Linenumber":
+                    try:
+                        task["linenumber"] = int(self.readElementText())
+                    except ValueError:
+                        pass
+                else:
+                    self.raiseUnexpectedStartTag(self.name())

eric ide

mercurial