0 Votes

Wiki source code of Actions

Last modified by Ryan C on 2025/03/28 06:54

Show last authors
1 {{velocity}}
2 ## check token
3 #if ("$!request.action" != '' && !$services.csrf.isTokenValid("$!request.form_token"))
4 #set($discard = $response.sendRedirect($services.csrf.getResubmissionURL()))
5 #else
6 ## We expect an ajax request for this deleteforum action
7 #if ("$!request.action" == 'deleteforum')
8 ## We assume all paths are bad requests, so we have to change status code for other cases.
9 #set($discard = $response.setStatus(400))
10 #set($space = "$!{request.space}")
11 #set($webHomeDoc = $xwiki.getDocument("${space}.WebHome"))
12 ## Check if the space is a froum space
13 #if ($space != '' && $webHomeDoc.getObject('ForumCode.ForumClass') != $util.null)
14 ## Chck if the current user has delete right on the forum
15 #if ($webHomeDoc.hasAccessLevel('delete'))
16 ## We need to delete all documents of the forum space
17 #set($results = $services.query.xwql('WHERE doc.space=:forumSpace OR doc.space LIKE :forum').bindValue('forumSpace', $space).bindValue('forum', "${space}.%").execute())
18 #foreach ($fullName in $results)
19 #set($discard = $xwiki.getDocument($fullName).delete())
20 #end
21 #set($discard = $response.setStatus(200)) ok
22 #else
23 ## Forbidden action
24 #set($discard = $response.setStatus(403))
25 #end
26 #end
27 #elseif ("$!request.action" == 'addtopic')
28 #set ($title = $request.title.trim())
29 #if ("$!title" != '')
30 #if ("$!request.space" != '')
31 #getForumEntityDoc($request.space $title $entityDoc)
32 #if ($entityDoc.hasAccessLevel('edit'))
33 ## Add the TopicClass object
34 #set($discard = $entityDoc.updateObjectFromRequest('ForumCode.TopicClass'))
35 ## We add a XWiki.AverageRatingsClass object to simplify sorting topics by votes
36 ## when some topics don't have any votes.
37 #set($averageObj = $entityDoc.newObject('XWiki.AverageRatingsClass'))
38 #set($discard = $averageObj.set('nbvotes', 0))
39 #set($discard = $averageObj.set('method', 'average'))
40 #set($discard = $entityDoc.setTitle($title))
41 #set($discard = $entityDoc.setParent("$!request.parent"))
42 #set($discard = $entityDoc.saveWithProgrammingRights())
43 #if ("$!request.xredirect" != '')
44 #set($discard = $response.sendRedirect("$!request.xredirect"))
45 #end
46 #else
47 #set($discard = $response.setStatus(403))
48 {{warning}}$services.localization.render('conversations.create.error.topic.norights'){{/warning}}
49 #end
50 #else
51 {{warning}}$services.localization.render('conversations.create.error.missingmetadata'){{/warning}}
52 #end
53 #else
54 #set($discard = $response.setStatus(403))
55 {{warning}}$services.localization.render('conversations.create.error.missingtitle'){{/warning}}
56 #end
57 #elseif ("$!request.action" == 'addanswer')
58 #if ("$!request.space" != '')
59 #set ($title = "Answer_${datetool.date.time}_${mathtool.random(1, 99)}")
60 #getForumEntityDoc($request.space $title $entityDoc)
61 #if ($entityDoc.hasAccessLevel('edit'))
62 #set($discard = $entityDoc.setParent("${request.parent}"))
63 #set($discard = $entityDoc.updateObjectFromRequest('ForumCode.AnswerClass'))
64 #set($discard = $entityDoc.saveWithProgrammingRights())
65 #if ("$!request.xredirect" != '')
66 #set($discard = $response.sendRedirect("$!request.xredirect"))
67 #end
68 #else
69 #set($discard = $response.setStatus(403))
70 {{warning}}$services.localization.render('conversations.create.error.answer.norights'){{/warning}}
71 #end
72 #else
73 {{warning}}Not enough parameters.{{/warning}}
74 #end
75 #elseif ("$!request.action" == 'deleteconversation' || "$!request.action" == 'deletecomment')
76 #set($isDeleteComment = "$!request.action" == 'deletecomment')
77 #set($conversationDoc = $xwiki.getDocument("$!request.conversationdoc"))
78 #set($conversationObj = $conversationDoc.getObject('ForumCode.AnswerClass'))
79 #set($isAnswer = false)
80 #if ($conversationObj)
81 #set($isAnswer = true)
82 #end
83 #set($topicObj = $conversationDoc.getObject('ForumCode.TopicClass'))
84 #if ($isDeleteComment)
85 #set($commentNumber = $util.parseInt("$!request.commentnumber"))
86 #set($commentObj = $conversationDoc.getObject('XWiki.XWikiComments', $commentNumber))
87 #end
88 #if (!$conversationDoc.isNew() && ($conversationObj||$topicObj) && (!$isDeleteComment || $commentObj))
89 ## check rights
90 #set($requiredRight = 'edit')
91 #if (!$isDeleteComment)
92 #set($requiredRight = 'delete')
93 #end
94 #if ($conversationDoc.hasAccessLevel($requiredRight))
95 ## do the action then send a mail
96 ## 0. collect some data we need after
97 ## get a representation of the deleted item
98 #set($itemRepresentation = '')
99 #if ($isDeleteComment)
100 #set($itemRepresentation = $commentObj.getProperty('comment').value)
101 #elseif ($isAnswer)
102 #set($itemRepresentation = $conversationObj.getProperty('description').value)
103 #else
104 #set($itemRepresentation = $conversationDoc.displayTitle)
105 #end
106 ## get the item author to send mail after
107 #set($itemAuthor = '')
108 #if ($isDeleteComment)
109 #set($itemAuthor = $commentObj.getProperty('author').value)
110 #else
111 #set($itemAuthor = $conversationDoc.creator)
112 #end
113 ## 1. do the action
114 #set ($target = $conversationDoc)
115 #if ($isDeleteComment)
116 #set ($target = "${conversationDoc.parent}:xwikicomment_${conversationDoc.documentReference.lastSpaceReference.name}_${commentNumber}")
117 #set($discard = $conversationDoc.removeObject($commentObj))
118 #set($discard = $conversationDoc.save($services.localization.render("conversations.${request.action}.changecomment")))
119 #else
120 #set($discard = $conversationDoc.delete())
121 ## if we are a topic delete the answers
122 #if ($topicObj)
123 #set($answers = $services.query.xwql('from doc.object(ForumCode.AnswerClass) as answer where doc.space like :spacePrefix').bindValue('spacePrefix', "${conversationDoc.space}.%").execute())
124 #foreach ($answer in $answers)
125 #set($discard = $xwiki.getDocument($answer).deleteWithProgrammingRights())
126 #end
127 #else
128 #set ($target = "${conversationDoc.parent}%${conversationDoc.documentReference.lastSpaceReference.name}")
129 #end
130 #end
131 ## delete existing flags on this conversation
132 #deleteFlags($target)
133 ## 2. send an email
134 ## get the email of the dude to send the mail to
135 #set($itemAuthorUser = $xwiki.getUser($itemAuthor))
136 #set($itemAuthorEmail = $itemAuthorUser.email)
137 #set($mailsent = '1')
138 #if ("$!itemAuthorEmail" != '')
139 #set ($sender = $xwiki.getUserName($xcontext.user, false))
140 #if ("$!{xwiki.getXWikiPreference('admin_email')}" != '')
141 #set ($sender = "$sender <$!{xwiki.getXWikiPreference('admin_email')}>")
142 #else
143 #set($sender = "$!{escapetool.q($sender)} <noreply@$!{request.serverName}>")
144 #end
145 #set($deleteAction = 'topic')
146 #if ($isDeleteComment)
147 #set($deleteAction = 'comment')
148 #elseif ($isAnswer)
149 #set($deleteAction = 'answer')
150 #end
151 #set($deletedDoc = $conversationDoc)
152 #set($map = { 'action' : "$deleteAction" , 'deleted_content' : "$!{itemRepresentation}", 'deletedDoc' : "$!{deletedDoc}"})
153 #set($result = $xwiki.mailsender.sendMessageFromTemplate($sender, $itemAuthorEmail, ${util.null}, ${util.null}, $xcontext.language, 'ForumCode.Actions', $map))
154 #if ($result != 0)
155 #set($mailsent = '0')
156 #end
157 #else
158 #set($mailsent = '0')
159 #end
160 #if ($isAnswer)
161 #set($discard = $response.setContentType('application/json'))
162 $jsontool.serialize({'success' : $request.action, 'mailsent' : $mailsent})
163 #else
164 #if ("$!request.xredirect" != '')
165 #set($discard = $response.sendRedirect("$!request.xredirect?success=${request.action}&mailsent=$!{mailsent}"))
166 #end
167 #end
168 #else
169 ## set the status and print a message
170 #set($discard = $response.setStatus(403))
171 {{warning}}$services.localization.render("conversations.${request.action}.error.norights", [$!request.xredirect]){{/warning}}
172 #end
173 #else
174 ## set the status and print a message
175 #set($discard = $response.setStatus(404))
176 {{warning}}$services.localization.render("conversations.${request.action}.error.notfound", [$!request.xredirect ]){{/warning}}
177 #end
178 #else
179 {{warning}}No action specified.{{/warning}}
180 #end##action switch
181 #end##csrf token verification
182 #set($docextras = [])
183 #macro (deleteFlags $target)
184 ## When an entity is deleted, delete all its flags + all subentityes' flags. E.g: Topic > ANswer > Comments
185 #set ($query = 'from doc.object(ForumCode.FlagClass) as flag where flag.target like :target')
186 #set ($flags = $services.query.xwql($query).bindValue('target', "${target}%").execute())
187 #foreach ($flag in $flags)
188 #set($discard = $xwiki.getDocument($flag).delete())
189 #end
190 #end
191 #macro (getForumEntityDoc $parentSpace $title $entityDoc)
192 #set ($parentReference = $services.model.resolveSpace($parentSpace))
193 #set ($entitySpaceReference = $services.model.createSpaceReference($title, $parentReference))
194 #set ($entityDocReference = $services.model.createDocumentReference('WebHome', $entitySpaceReference))
195 #set ($entityDoc = $xwiki.getDocument($entityDocReference))
196 #end

XWiki AI Chat