Wiki-Quellcode von JSONTaskSource
Zuletzt geändert von Daniel Herrmann am 2026/03/08 12:48
Verstecke letzte Bearbeiter
| author | version | line-number | content |
|---|---|---|---|
| |
1.1 | 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}} |