Wiki source code of Migration from 1.x

Last modified by Vincent Massol on 2026/09/10 13:54

Show last authors
1 {{velocity}}
2 ## The migration converts every 1.x change document of the wiki and saves it, and the conversion cannot be undone:
3 ## it removes the 1.x object from the page it converts. Its query is not restricted to the ReleaseNotes space, so
4 ## administering the wiki is what it takes to run it. The check gates the listing as well as the conversion: a user
5 ## who may not run the migration has no use for the list of the pages it would touch, and hiding the action while
6 ## still answering the request that performs it would not keep that request from performing it.
7 ## The check is in the page content, so the document also enforces wiki_admin as a required right: that is
8 ## what refuses edit on this page to anyone who does not already hold the right the check tests for.
9 #set ($hasWikiAdmin = $services.security.authorization.hasAccess('admin', $doc.documentReference.wikiReference))
10 #if (!$hasWikiAdmin)
11 {{error}}{{translation key="releasenotes.migration.notAllowed"/}}{{/error}}
12 #else
13 ## Find all pages having a v1.x ReleaseNotes.Code.ChangesClass
14 #set ($xwql = "from doc.object(ReleaseNotes.Code.ChangesClass) as changes")
15 ## The migration writes to every 1.x change document, so it only runs on a request carrying a valid
16 ## form token; a request without one falls through to the unconfirmed state and changes nothing.
17 #set ($migrate = ($request.confirm == '1' && $services.csrf.isTokenValid($request.getParameter('form_token'))))
18 #if (!$migrate)
19 {{translation key="releasenotes.migration.pending"/}}
20 #else
21 {{translation key="releasenotes.migration.migrated"/}}
22 #end
23 #foreach ($item in $services.query.xwql($xwql).execute())
24 #if ($migrate)
25 #set ($itemDoc = $xwiki.getDocument($item))
26 ## Add a ReleaseNotes.Code.EntryClass
27 #set ($newEntryObject = $itemDoc.newObject("ReleaseNotes.Code.EntryClass"))
28 ## Add a ReleaseNotes.Code.Change.ChangeClass
29 #set ($newChangeObject = $itemDoc.newObject("ReleaseNotes.Code.Change.ChangeClass"))
30 ## Copy data from ReleaseNotes.Code.ChangesClass into the 2 new objects
31 #set ($oldChangeObject = $itemDoc.getObject("ReleaseNotes.Code.ChangesClass"))
32 #set ($discard = $newEntryObject.set('version', $oldChangeObject.getValue('version')))
33 #set ($discard = $newEntryObject.set('product', $oldChangeObject.getValue('product')))
34 #set ($discard = $newEntryObject.set('type', 'Change'))
35 #set ($discard = $newChangeObject.set('summary', $oldChangeObject.getValue('summary')))
36 #set ($discard = $newChangeObject.set('audience', $oldChangeObject.getValue('audience')))
37 #set ($discard = $newChangeObject.set('importance', $oldChangeObject.getValue('importance')))
38 #set ($discard = $newChangeObject.set('description', $oldChangeObject.getValue('description')))
39 #set ($discard = $newChangeObject.set('category', $oldChangeObject.getValue('category')))
40 #set ($discard = $newChangeObject.set('title', $oldChangeObject.getValue('title')))
41 #set ($discard = $newChangeObject.set('screenshots', $oldChangeObject.getValue('screenshots')))
42 ## Remove the old ReleaseNotes.Code.ChangesClass xobject
43 #set ($discard = $itemDoc.removeObject($oldChangeObject))
44 ## Save the changes
45 #set ($discard = $itemDoc.save('Migrated from v1.x format to v2.0', true))
46 * [[$item>>$item]]
47 #else
48 * [[$item>>$item]]
49 #end
50 #end
51
52 #if (!$migrate)
53 [[{{translation key="releasenotes.migration.start"/}}>>||queryString="confirm=1&form_token=$escapetool.url($services.csrf.token)"]]
54 #end
55 #end
56 {{/velocity}}

Get Connected