General Actions:
Log-in
Register
Wiki:
Main wiki
▼
:
Document Index
»
Space:
WorkspaceManager
▼
:
Document Index
»
Page:
JoinWorkspaceCode
Search
en
Page Actions:
Export
▼
:
Export as PDF
Export as RTF
Export as HTML
More actions
▼
:
Print preview
View Source
Main wiki
»
Browse Workspaces
»
Join Workspace
Wiki source code of
Join Workspace
Last modified by
Administrator
on 2012/03/21 17:40
Content
·
Comments
(0)
·
Annotations
(0)
·
Attachments
(0)
·
History
·
Information
Show line numbers
{{velocity}} #set ($workspaceId = $request.workspaceId) #set ($confirm = $request.confirm) ## #if ("$!workspaceId" == '') {{error}}The [workspaceId] parameter is not specified.{{/error}} #else ## FIXME: add plugin dependency checks. ## #set ($WorkspaceManager = $services.workspace) ## #set ($workspace = $WorkspaceManager.getWorkspace($workspaceId)) ## #if ("$!workspace" == '') #if ("$!{WorkspaceManager.lastException}" != '') {{error}}Exception: $!{WorkspaceManager.lastException.message}{{/error}} #else {{error}}$msg.get('workspacemanager.error.workspacedoesnotexist', ["$workspaceId"]){{/error}} #end #else #set ($wikiDescriptor = $workspace.wikiDescriptor) #set ($workspaceName = $wikiDescriptor.wikiPrettyName) #if ("$!workspaceName" == '') #set ($workspaceName = $workspaceId) #end #set ($workspaceGroupDocument = $workspace.groupDocument) ## ## Use the low level API since this page has PR and we need to make the current user modify a document of a wiki he does not yet have access to. ## #set ($workspaceGroupDocumentRestricted = $workspaceGroupDocument.document) #set ($groupsClassReference = $services.model.createDocumentReference($workspaceId, 'XWiki', 'XWikiGroups')) ## Hack for http://jira.xwiki.org/jira/browse/XWIKI-5040 untill it gets fixed. TODO: Remove redundant class copy once the bug is fixed. #set ($candidateMemberClassReference = $services.model.createDocumentReference($workspaceId, 'XWiki', 'WorkspaceCandidateMemberClass')) #set ($currentUser = "${xcontext.mainWikiName}:${xcontext.user}") #set ($workspaceUrl = $wikiDescriptor.homePageUrl) ## #set ($existingMemberObject = $workspaceGroupDocumentRestricted.getXObject($groupsClassReference, 'member', $currentUser)) #if ("$!existingMemberObject" != '') {{info}}The user [[$currentUser]] is already a member of the workspace [[$workspaceName>>$workspaceUrl]].{{/info}} #elseif ($currentUser == 'xwiki:XWiki.XWikiGuest') #set ($loginDocumentReference = $services.model.createDocumentReference($xcontext.mainWikiName, 'XWiki', 'XWikiLogin')) #set ($loginDocument = $xwiki.getDocument($loginDocumentReference)) #set ($loginUrl = $loginDocument.getExternalURL('login', "xredirect=$escapetool.url($xwiki.getRequestURL())")) {{error}}In order to continue, you need to [[log in>>$loginUrl]] first.{{/error}} #else ## The user is not already a member of the workspace. ## #set ($browseDocumentReference = $services.model.createDocumentReference($xcontext.mainWikiName, 'WorkspaceManager', 'WebHome')) #set ($backUrl = $xwiki.getURL($browseDocumentReference)) ## #set ($membershipType = $wikiDescriptor.getValue('membershipType')) ## ## Determine if, regardless of membership type, an existing invitation exists for the current user. #set ($candidateMembers = $workspaceGroupDocumentRestricted.getXObjects($candidateMemberClassReference)) #set ($existingInvitation = false) #foreach ($candidateMember in $candidateMembers) #if ("$!{candidateMember.get('userName').getValue()}" == "$currentUser" && "$!{candidateMember.get('type').getValue()}" == 'invitation' && "$!{candidateMember.get('status').getValue()}" == 'pending') ## Remember the existing invitation. #set ($existingInvitation = $candidateMember) #end #end #if ($existingInvitation) ## ## An invitation exists. #if ($request.acceptInvitation || $request.rejectInvitation) ## ## The user decided whether to accept or to reject the invitation. #set ($saveComment = "The user $currentUser accepted the invitation.") #set ($notificationMessage = "The user '${xwiki.getUserName($currentUser, false)}' ($currentUser) has accepted the invitation to join the workspace '${workspaceName}' ($workspaceId).") ## Common values. #set ($temp = $existingInvitation.setDateValue('date', $datetool.date)) #set ($temp = $existingInvitation.setLargeStringValue('userComment', "$!{escapetool.xml($request.userComment)}")) ## Specific values. #if ($request.acceptInvitation) #set ($temp = $existingInvitation.setStringValue('status', 'accepted')) ## Add user to workspace. #set ($newMemberObject = $workspaceGroupDocumentRestricted.newXObject($groupsClassReference, $xcontext.context)) #set ($temp = $newMemberObject.setStringValue('member', $currentUser)) #else #set ($saveComment = "The user $currentUser rejected the invitation.") #set ($notificationMessage = "The user '${xwiki.getUserName($currentUser, false)}' ($currentUser) has rejected the invitation to join the workspace '${workspaceName}' ($workspaceId).") #set ($temp = $existingInvitation.setStringValue('status', 'rejected')) #end ## Save changes. #set ($temp = $xwiki.getXWiki().saveDocument($workspaceGroupDocumentRestricted, $saveComment, true, $xcontext.context)) ## Send message to workspace admins. (XWikiAdminGroup) #set ($workspaceAdminGroupReference = $services.model.createDocumentReference($workspaceId, 'XWiki', 'XWikiAdminGroup')) #set ($temp = $services.messageStream.postMessageToGroup($notificationMessage, $workspaceAdminGroupReference)) ## Display the proper success info. {{success}} #if ($request.acceptInvitation) The user [[$currentUser]] successfully accepted the invitation and joined the workspace [[$workspaceName>>$workspaceUrl]]. #else The user [[$currentUser]] successfully rejected the invitation to join the workspace [[$workspaceName>>$workspaceUrl]]. #end {{/success}} #else ## ## User can decide if to accept or reject the invitation. {{html wiki='true'}} You have been invited to join the workspace [[$workspaceName>>$workspaceUrl]]. <form class='xform third' method='GET'> <dl> #if ("$!existingInvitation.get('reviewerComment').getValue()" != '') <dt> <label>Invitation message:</label> </dt> <dd> $existingInvitation.get('reviewerComment').getValue() </dd> #end <dt> <label for='userComment'>Reply</label> <span class='xHint'>A reply message to send, viewable by the workspace admin, in which you can motivate your decision.</span> </dt> <dd><textarea name='userComment' rows='7' cols='45'></textarea></dd> <span class='buttonwrapper'> <br/> <input type='submit' name='acceptInvitation' value='Accept' class='button'/> <input type='submit' name='rejectInvitation' value='Reject' class='button'/> <a href="$backUrl" class='button secondary'>Later</a> </span> <input type='hidden' name='workspaceId' value="$!workspaceId"/> <input type='hidden' name='workspaceName' value="$!workspaceName"/> </dl> </form> {{/html}} #end ## ## The user is not invited to join, continue based on the current membership type of the workspace. #elseif ($membershipType == 'invite') ## ## User does not have an invitation. {{error}}This workspace is invite only. In order to join it, you need to receive an invitation from one of its admins.{{/error}} #elseif ($membershipType == 'request') ## Determine if a pending request already exists. ## #set ($candidateMembers = $workspaceGroupDocumentRestricted.getXObjects($candidateMemberClassReference)) #set ($pendingRequest = false) #foreach ($candidateMember in $candidateMembers) #if ("$!{candidateMember.get('userName').getValue()}" == "$currentUser" && "$!{candidateMember.get('type').getValue()}" == 'request' && "$!{candidateMember.get('status').getValue()}" == 'pending') ## Remember the existing request. #set ($pendingRequest = $candidateMember) #end #end #if ($pendingRequest) #if ("$!{request.cancelJoinRequest}" != '1') ## Request already exists. ## {{info}}The user [[$currentUser]] already has a pending request to join the workspace [[$workspaceName>>$workspaceUrl]]. Please wait for a workspace admin to review it.{{/info}} #elseif ("$!confirm" != '1') ## User wants to cancel existing request. ## #set ($confirmUrl = $doc.getURL('view', "$!request.queryString&confirm=1")) {{box}} Are you sure you want cancel the request to join the workspace [[$workspaceName>>$workspaceUrl]]? ((({{html}} <span class="buttonwrapper"><a class="button" href="$confirmUrl">Yes</a> <a class="button" href="$backUrl">No</a></span> {{/html}}))) {{/box}} #else ## User confirms the cancel of existing request. ## #set ($temp = $workspaceGroupDocumentRestricted.removeXObject($pendingRequest)) #set ($temp = $xwiki.getXWiki().saveDocument($workspaceGroupDocumentRestricted, "The user $currentUser canceled his join request.", true, $xcontext.context)) {{success}}The user [[$currentUser]] successfully canceled the request to join the workspace [[$workspaceName>>$workspaceUrl]].{{/success}} #end #elseif ("$!confirm" != '1') ## Join request. ## {{html wiki='true'}} To join the workspace [[$workspaceName>>$workspaceUrl]], you must first issue a join request. After this, a workspace admin will review your request and consider accepting or rejecting it. <form class='xform third' method='GET'> <dl> <dt> <label for='userComment'>Message</label> <span class='xHint'>A message to send, viewable by the workspace admin, in which you can motivate this join request.</span> </dt> <dd><textarea name='userComment' rows='7' cols='45'></textarea></dd> <span class='buttonwrapper'> <br/> <input type='submit' name='submit' value='Send Request' class='button'/> <a href="$backUrl" class='button secondary'>Back</a> </span> <input type='hidden' name='workspaceId' value="$!workspaceId"/> <input type='hidden' name='workspaceName' value="$!workspaceName"/> <input type='hidden' name='requestJoin' value="$!request.requestJoin"/> <input type='hidden' name='confirm' value="1"/> </dl> </form> {{/html}} #else ## User confirmed the join request. ## #set ($newRequestObject = $workspaceGroupDocumentRestricted.newXObject($candidateMemberClassReference, $xcontext.context)) #set ($temp = $newRequestObject.setStringValue('userName', $currentUser)) #set ($temp = $newRequestObject.setDateValue('date', $datetool.date)) #set ($temp = $newRequestObject.setLargeStringValue('userComment', "$!{escapetool.xml($request.userComment)}")) #set ($temp = $newRequestObject.setStringValue('status', 'pending')) #set ($temp = $newRequestObject.setStringValue('type', 'request')) #set ($temp = $xwiki.getXWiki().saveDocument($workspaceGroupDocumentRestricted, "The user $currentUser requested to join the workspace.", true, $xcontext.context)) ## Send message to workspace admins. (XWikiAdminGroup) #set ($workspaceAdminGroupReference = $services.model.createDocumentReference($workspaceId, 'XWiki', 'XWikiAdminGroup')) #set ($notificationMessage = "The user '${xwiki.getUserName($currentUser, false)}' ($currentUser) has requested to join the workspace '${workspaceName}' ($workspaceId).") #set ($temp = $services.messageStream.postMessageToGroup($notificationMessage, $workspaceAdminGroupReference)) {{success}}The user [[$currentUser]] successfully sent the request to join workspace [[$workspaceName>>$workspaceUrl]].{{/success}} #end #else ## Open membership as default. ## #if ("$!confirm" != '1') ## Open join. ## #set ($confirmUrl = $doc.getURL('view', "$!request.queryString&confirm=1")) {{box}} Are you sure you want to join the workspace [[$workspaceName>>$workspaceUrl]]? ((({{html}} <span class="buttonwrapper"><a class="button" href="$confirmUrl">Yes</a> <a class="button" href="$backUrl">No</a></span> {{/html}}))) {{/box}} #else ## User confirmed to join the workspace. ## #set ($newMemberObject = $workspaceGroupDocumentRestricted.newXObject($groupsClassReference, $xcontext.context)) #set ($temp = $newMemberObject.setStringValue('member', $currentUser)) #set ($temp = $xwiki.getXWiki().saveDocument($workspaceGroupDocumentRestricted, "The user $currentUser joined the workspace.", true, $xcontext.context)) {{success}}The user [[$currentUser]] successfully joined workspace [[$workspaceName>>$workspaceUrl]].{{/success}} #end #end #end #end #end {{/velocity}}