eric7/EricXML/TasksReader.py

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

eric ide

mercurial