Wiki-Quellcode von JSONTaskSource

Zuletzt geändert von Daniel Herrmann am 2026/03/08 12:48

Zeige letzte Bearbeiter
1 {{velocity output="false"}}
2 #macro (putOrDefault $map $propertyName $value $default1)
3 #if ($value)
4 #set ($discard = $map.put($propertyName, $value))
5 #else
6 #set ($discard = $map.put($propertyName, $default1))
7 #end
8 #end
9
10 #macro (csvToArray $csvString $return)
11 ## This macro escapes commas using backslashes, to not break when csv items contain commas.
12 ## TODO: Also escape backslashes, as a csv item ending with one will not be interpreted correctly.
13 #set ($csv = $csvString.split('(?<!\\),'))
14 #set ($newArray = [])
15 #foreach ($elem in $csv)
16 #set ($discard = $newArray.add($elem.replace('\,', ',')))
17 #end
18 #set ($discard = $return.put('csvReturn', $newArray))
19 #end
20 {{/velocity}}{{velocity wiki="false"}}
21 ##
22 ## This page prepares and returns the JSON of tasks used in the frappe-gantt library, in the taskgantt macro.
23 ## Parameters are the same as taskgantt macro, with an optional 'taskId'.
24 ## When the 'taskId' is present, only that task will be returned, regardless of other parameters.
25 ##
26 #if ($xcontext.action == 'get')
27 #set ($discard = $response.setContentType('application/json'))
28 #set ($query = 'from doc.object(TaskManager.TaskManagerClass) as task' +
29 " where doc.space <> 'TaskManager.TaskManagerTemplates'" +
30 ' and (task.startDate is not NULL or task.createDate is not NULL)')
31 #if ("$!request.taskId" != '')
32 ## Short-circuit if the request is for a specific task.
33 #set ($query = $query + ' and doc.fullName = (:taskId)')
34 #set ($query = $services.query.xwql($query).setLimit(1))
35 #set ($query = $query.bindValue('taskId', $request.taskId))
36 #else
37 #if ("$!request.spaces" != '')
38 #set ($spaces = {})
39 #csvToArray($request.spaces $spaces)
40 #set ($spaces = $spaces['csvReturn'])
41 ## Filter by exact space and by subspaces.
42 #set ($query = $query + ' and (doc.space in (:spaces)')
43 #set ($index = 0)
44 #foreach ($space in $spaces)
45 #set ($query = $query + " or doc.space like :spaces${index}")
46 #set ($index = $index + 1)
47 #end
48 #set ($query = $query + ')')
49 #end
50 #if ("$!request.assignees" != '')
51 #set ($assignees = {})
52 #csvToArray($request.assignees $assignees)
53 #set ($assignees = $assignees['csvReturn'])
54 #set ($assigneeQuery = '')
55 #foreach ($assignee in $assignees)
56 #if ($assigneeQuery.length() > 0)
57 #set ($assigneeQuery = "$assigneeQuery OR")
58 #end
59 ## The task contains at least one of the specified users.
60 #set ($assigneeQuery = "$assigneeQuery task.assignee LIKE '%$escapetool.sql($assignee),%'" +
61 " OR task.assignee LIKE '%$escapetool.sql($assignee)'")
62 #end
63 #set ($query = "$query AND ($assigneeQuery)")
64 #end
65 #if ("$!request.reporters" != '')
66 #set ($reporters = {})
67 #csvToArray($request.reporters $reporters)
68 #set ($reporters = $reporters['csvReturn'])
69 #set ($query = $query + " and task.reporter in (:reporters)")
70 #end
71 #if ("$!request.projects" != '')
72 #set ($projects = {})
73 #csvToArray($request.projects $projects)
74 #set ($projects = $projects['csvReturn'])
75 #set ($query = $query + " and task.project in (:projects)")
76 #end
77 #if ("$!request.from" != '')
78 #set ($from = $datetool.toDate($numbertool.toNumber($request.from).longValue()))
79 #set ($query = $query + ' and (' +
80 '(task.startDate is not NULL and task.startDate >= :from) or ' +
81 '(task.startDate is NULL and task.createDate >= :from))'
82 )
83 #end
84 #if ($request.hideNoDueDate != 'false')
85 #set ($query = $query + ' and task.duedate is not NULL')
86 #end
87 #if ("$!request.to" != '')
88 #set ($to = $datetool.toDate($numbertool.toNumber($request.to).longValue()))
89 #set ($query = $query + ' and (' +
90 '(task.duedate is not NULL and task.duedate <= :to) or ' +
91 '(task.duedate is NULL and (' +
92 '(task.startDate is not NULL and task.startDate <= :to) or ' +
93 '(task.startDate is NULL and task.createDate <= :to))' +
94 '))'
95 )
96 #end
97 #if ("$!request.maxTasks" != '')
98 #set ($maxTasks = $numbertool.toNumber($request.maxTasks))
99 #else
100 #set ($maxTasks = 50)
101 #end
102 ## Sort the tasks by project and name to ensure a stable order.
103 #set ($query = $query + ' order by UPPER(task.project), task.project, UPPER(task.name), task.name')
104 #set ($query = $services.query.xwql($query).setLimit($maxTasks))
105 #if ($spaces)
106 #set ($query = $query.bindValue("spaces", $spaces))
107 #set ($index = 0)
108 #foreach ($space in $spaces)
109 #set ($space = $space + '.%')
110 #set ($query = $query.bindValue("spaces${index}", $space))
111 #set ($index = $index + 1)
112 #end
113 #end
114 #if ($projects) #set ($query = $query.bindValue('projects', $projects)) #end
115 #if ($reporters) #set ($query = $query.bindValue('reporters', $reporters)) #end
116 #if ($from) #set ($query = $query.bindValue('from', $from)) #end
117 #if ($to) #set ($query = $query.bindValue('to', $to)) #end
118 #end
119 #set ($queryResult = $query.addFilter('hidden').addFilter('currentlanguage').execute())
120
121 #set ($tasks = [])
122 #foreach ($taskDocument in $queryResult)
123 #set ($taskXDoc = $xwiki.getDocument($taskDocument))
124 #set ($task = $taskXDoc.getObject('TaskManager.TaskManagerClass'))
125 #if ($services.security.authorization.hasAccess('view', $taskDocument))
126 #set ($taskObj = {})
127 #set ($customClasses = [])
128 #set ($discard = $taskObj.put('id', "$taskXDoc.getDocumentReference()"))
129 #set ($discard = $taskObj.put('link', $taskXDoc.getURL()))
130 #putOrDefault($taskObj 'taskName'
131 $task.getValue('name')
132 $services.localization.render('taskmanager.gantt.task.unknownTaskTitle')
133 )
134 #putOrDefault($taskObj 'progress'
135 $task.getValue('progress')
136 0
137 )
138 #putOrDefault($taskObj 'project' $task.getValue('project') '')
139 #putOrDefault($taskObj 'assignee' $task.getValue('assignee') '')
140 #putOrDefault($taskObj 'reporter' $task.getValue('reporter') '')
141 #putOrDefault($taskObj 'start'
142 $task.getValue('startDate').getTime()
143 $task.getValue('createDate').getTime()
144 )
145 #putOrDefault($taskObj 'end'
146 $task.getValue('duedate').getTime()
147 $xwiki.jodatime.getDateTime($taskObj['start']).plusWeeks(1).getMillis()
148 )
149 #if ("$!task.getValue('duedate').getTime()" == '')
150 #set ($discard = $customClasses.add('taskgantt-no-due-date'))
151 #end
152 #if (!$services.security.authorization.hasAccess('edit', $taskDocument))
153 #set ($discard = $customClasses.add('taskgantt-no-edit'))
154 #end
155 #set ($dependencies = [])
156 #foreach ($dep in $task.getValue('dependencies'))
157 #set ($discard = $dependencies.add("$xwiki.getDocument($dep).getDocumentReference()"))
158 #end
159 #set ($discard = $taskObj.put('dependencies', $dependencies))
160 #set ($discard = $taskObj.put('taskClasses', $customClasses))
161 #set ($discard = $tasks.add($taskObj))
162 #end
163 #end
164 $jsontool.serialize($tasks)
165 #end
166 {{/velocity}}