src/eric7/EricXML/TasksReader.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2010 - 2022 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 EricWidgets.EricApplication import ericApp
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 = ericApp().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 if addedTask:
126 self.tasks.append((addedTask, expanded))
127 break
128
129 if self.isStartElement():
130 if self.name() == "Summary":
131 task["summary"] = self.readElementText()
132 elif self.name() == "Description":
133 task["description"] = self.readElementText()
134 elif self.name() == "Created":
135 task["created"] = time.mktime(time.strptime(
136 self.readElementText(), "%Y-%m-%d, %H:%M:%S"))
137 elif self.name() == "Resource":
138 continue # handle but ignore this tag
139 elif self.name() == "Filename":
140 task["filename"] = Utilities.toNativeSeparators(
141 self.readElementText()
142 )
143 elif self.name() == "Linenumber":
144 with contextlib.suppress(ValueError):
145 task["linenumber"] = int(self.readElementText())
146 else:
147 self.raiseUnexpectedStartTag(self.name())

eric ide

mercurial