|
1 # -*- coding: utf-8 -*- |
|
2 |
|
3 # Copyright (c) 2005 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
|
4 # |
|
5 |
|
6 """ |
|
7 Module implementing a class to store task data. |
|
8 """ |
|
9 |
|
10 import fnmatch |
|
11 import re |
|
12 |
|
13 from .Task import TaskType |
|
14 |
|
15 |
|
16 class TaskFilter: |
|
17 """ |
|
18 Class implementing a filter for tasks. |
|
19 """ |
|
20 def __init__(self): |
|
21 """ |
|
22 Constructor |
|
23 """ |
|
24 self.active = False |
|
25 |
|
26 self.summaryFilter = None |
|
27 self.filenameFilter = "" |
|
28 self.typeFilter = TaskType.NONE |
|
29 # task type |
|
30 |
|
31 self.scopeFilter = None |
|
32 #- global (False) or project (True) |
|
33 |
|
34 self.statusFilter = None |
|
35 #- not completed (False) or completed (True) |
|
36 |
|
37 self.prioritiesFilter = None |
|
38 #- list of priorities |
|
39 |
|
40 def setActive(self, enabled): |
|
41 """ |
|
42 Public method to activate the filter. |
|
43 |
|
44 @param enabled flag indicating the activation state (boolean) |
|
45 """ |
|
46 self.active = enabled |
|
47 |
|
48 def setSummaryFilter(self, filterStr): |
|
49 """ |
|
50 Public method to set the description filter. |
|
51 |
|
52 @param filterStr a regular expression for the description filter |
|
53 to set (string) or None |
|
54 """ |
|
55 if not filterStr: |
|
56 self.summaryFilter = None |
|
57 else: |
|
58 self.summaryFilter = re.compile(filterStr) |
|
59 |
|
60 def setFileNameFilter(self, filterStr): |
|
61 """ |
|
62 Public method to set the filename filter. |
|
63 |
|
64 @param filterStr a wildcard expression for the filename filter |
|
65 to set (string) or None |
|
66 """ |
|
67 self.filenameFilter = filterStr |
|
68 |
|
69 def setTypeFilter(self, taskType): |
|
70 """ |
|
71 Public method to set the type filter. |
|
72 |
|
73 @param taskType type of the task |
|
74 @type TaskType |
|
75 """ |
|
76 self.typeFilter = taskType |
|
77 |
|
78 def setScopeFilter(self, scope): |
|
79 """ |
|
80 Public method to set the scope filter. |
|
81 |
|
82 @param scope flag indicating a project task (boolean) or None |
|
83 """ |
|
84 self.scopeFilter = scope |
|
85 |
|
86 def setStatusFilter(self, status): |
|
87 """ |
|
88 Public method to set the status filter. |
|
89 |
|
90 @param status flag indicating a completed task (boolean) or None |
|
91 """ |
|
92 self.statusFilter = status |
|
93 |
|
94 def setPrioritiesFilter(self, priorities): |
|
95 """ |
|
96 Public method to set the priorities filter. |
|
97 |
|
98 @param priorities list of task priorities or None |
|
99 @type list of TaskPriority or None |
|
100 """ |
|
101 self.prioritiesFilter = priorities |
|
102 |
|
103 def hasActiveFilter(self): |
|
104 """ |
|
105 Public method to check for active filters. |
|
106 |
|
107 @return flag indicating an active filter was found (boolean) |
|
108 """ |
|
109 return ( |
|
110 self.summaryFilter is not None or |
|
111 bool(self.filenameFilter) or |
|
112 self.typeFilter != TaskType.NONE or |
|
113 self.scopeFilter is not None or |
|
114 self.statusFilter is not None or |
|
115 self.prioritiesFilter is not None |
|
116 ) |
|
117 |
|
118 def showTask(self, task): |
|
119 """ |
|
120 Public method to check, if a task should be shown. |
|
121 |
|
122 @param task reference to the task object to check (Task) |
|
123 @return flag indicating whether the task should be shown (boolean) |
|
124 """ |
|
125 if not self.active: |
|
126 return True |
|
127 |
|
128 if ( |
|
129 self.summaryFilter and |
|
130 self.summaryFilter.search(task.summary) is None |
|
131 ): |
|
132 return False |
|
133 |
|
134 if ( |
|
135 self.filenameFilter and |
|
136 not fnmatch.fnmatch(task.filename, self.filenameFilter) |
|
137 ): |
|
138 return False |
|
139 |
|
140 if ( |
|
141 self.typeFilter != TaskType.NONE and |
|
142 self.typeFilter != task.taskType |
|
143 ): |
|
144 return False |
|
145 |
|
146 if ( |
|
147 self.scopeFilter is not None and |
|
148 self.scopeFilter != task._isProjectTask |
|
149 ): |
|
150 return False |
|
151 |
|
152 if ( |
|
153 self.statusFilter is not None and |
|
154 self.statusFilter != task.completed |
|
155 ): |
|
156 return False |
|
157 |
|
158 if ( |
|
159 self.prioritiesFilter is not None and |
|
160 task.priority not in self.prioritiesFilter |
|
161 ): |
|
162 return False |
|
163 |
|
164 return True |