eric6/E5XML/TasksReader.py

changeset 6942
2602857055c5
parent 6645
ad476851d7e0
child 7229
53054eb5b15a
equal deleted inserted replaced
6941:f99d60d6b59b 6942:2602857055c5
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2019 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing a class for reading an XML tasks file.
8 """
9
10 from __future__ import unicode_literals
11
12 import time
13
14 from E5Gui.E5Application import e5App
15
16 from .Config import tasksFileFormatVersion
17 from .XMLStreamReaderBase import XMLStreamReaderBase
18
19 from Tasks.Task import Task
20
21 import Utilities
22
23
24 class TasksReader(XMLStreamReaderBase):
25 """
26 Class for reading an XML tasks file.
27 """
28 supportedVersions = ["4.2", "5.0", "5.1", "6.0"]
29
30 def __init__(self, device, forProject=False, viewer=None):
31 """
32 Constructor
33
34 @param device reference to the I/O device to read from (QIODevice)
35 @param forProject flag indicating project related mode (boolean)
36 @param viewer reference to the task viewer (TaskViewer)
37 """
38 XMLStreamReaderBase.__init__(self, device)
39
40 self.viewer = viewer
41
42 self.forProject = forProject
43 if viewer:
44 self.viewer = viewer
45 else:
46 self.viewer = e5App().getObject("TaskViewer")
47
48 self.version = ""
49 self.tasks = []
50
51 def readXML(self):
52 """
53 Public method to read and parse the XML document.
54 """
55 while not self.atEnd():
56 self.readNext()
57 if self.isEndElement() and self.name() == "Tasks":
58 for task, expanded in self.tasks:
59 task.setExpanded(expanded)
60 break
61
62 if self.isStartElement():
63 if self.name() == "Tasks":
64 self.version = self.attribute(
65 "version", tasksFileFormatVersion)
66 if self.version not in self.supportedVersions:
67 self.raiseUnsupportedFormatVersion(self.version)
68 elif self.name() == "Task":
69 self.__readTask()
70 elif self.name() == "ProjectScanFilter":
71 scanFilter = self.readElementText()
72 if self.forProject:
73 self.viewer.projectTasksScanFilter = scanFilter
74 else:
75 self.raiseUnexpectedStartTag(self.name())
76
77 self.showErrorMessage()
78
79 def __readTask(self):
80 """
81 Private method to read the task info.
82 """
83 task = {"summary": "",
84 "priority": 1,
85 "completed": False,
86 "created": 0,
87 "filename": "",
88 "linenumber": 0,
89 "type": Task.TypeTodo,
90 "description": "",
91 "uid": "",
92 }
93 task["priority"] = int(self.attribute("priority", "1"))
94 task["completed"] = self.toBool(self.attribute("completed", "False"))
95 if self.version in ["4.2", "5.0"]:
96 isBugfix = self.toBool(self.attribute("bugfix", "False"))
97 if isBugfix:
98 task["type"] = Task.TypeFixme
99 else:
100 task["type"] = int(self.attribute("type", str(Task.TypeTodo)))
101 uid = self.attribute("uid", "")
102 if uid:
103 task["uid"] = uid
104 else:
105 # upgrade from pre 6.0 format
106 from PyQt5.QtCore import QUuid
107 task["uid"] = QUuid.createUuid().toString()
108 parentUid = self.attribute("parent_uid", "")
109 expanded = self.toBool(self.attribute("expanded", "True"))
110
111 while not self.atEnd():
112 self.readNext()
113 if self.isEndElement() and self.name() == "Task":
114 parentTask = self.viewer.findParentTask(parentUid)
115 addedTask = self.viewer.addTask(
116 task["summary"], priority=task["priority"],
117 filename=task["filename"], lineno=task["linenumber"],
118 completed=task["completed"], _time=task["created"],
119 isProjectTask=self.forProject, taskType=task["type"],
120 description=task["description"], uid=task["uid"],
121 parentTask=parentTask)
122 self.tasks.append((addedTask, expanded))
123 break
124
125 if self.isStartElement():
126 if self.name() == "Summary":
127 task["summary"] = self.readElementText()
128 elif self.name() == "Description":
129 task["description"] = self.readElementText()
130 elif self.name() == "Created":
131 task["created"] = time.mktime(time.strptime(
132 self.readElementText(), "%Y-%m-%d, %H:%M:%S"))
133 elif self.name() == "Resource":
134 continue # handle but ignore this tag
135 elif self.name() == "Filename":
136 task["filename"] = \
137 Utilities.toNativeSeparators(self.readElementText())
138 elif self.name() == "Linenumber":
139 try:
140 task["linenumber"] = int(self.readElementText())
141 except ValueError:
142 pass
143 else:
144 self.raiseUnexpectedStartTag(self.name())

eric ide

mercurial