| | 270 | |
| | 271 | @register_view(None, 'copy') |
| | 272 | def view_copy_resource(request): |
| | 273 | """Copies/forks the resource to a new location on the wiki |
| | 274 | """ |
| | 275 | |
| | 276 | from django import forms |
| | 277 | |
| | 278 | class CopyPageForm(forms.Form): |
| | 279 | source_urn = forms.CharField(widget=forms.HiddenInput()) |
| | 280 | target_pagename = forms.CharField(help_text=_('wiki location of the new resource')) |
| | 281 | |
| | 282 | def clean_source_urn(self): |
| | 283 | source_urn = self.cleaned_data['source_urn'] |
| | 284 | try: |
| | 285 | source_resource = get_resource_database().get_resource_object(source_urn) |
| | 286 | except Exception: # fixme: some day we should just be able to catch KeyError here, or something |
| | 287 | raise forms.ValidationError(_('source resource does not exist')) |
| | 288 | else: |
| | 289 | return source_urn |
| | 290 | |
| | 291 | def clean_target_pagename(self): |
| | 292 | target_pagename = self.cleaned_data['target_pagename'] |
| | 293 | if not user_has_edit_permission(request.user, target_pagename): |
| | 294 | raise forms.ValidationError(_('you do not have permission to create/write to this resource')) |
| | 295 | return target_pagename |
| | 296 | |
| | 297 | if request.method == 'POST': |
| | 298 | form = CopyPageForm(request.POST) |
| | 299 | if form.is_valid(): |
| | 300 | source_urn = form.cleaned_data['source_urn'] |
| | 301 | source_resource = get_resource_database().get_resource_object(source_urn) |
| | 302 | target_pagename = form.cleaned_data['target_pagename'] |
| | 303 | page, page_created = WikiPage.objects.get_or_create(name=target_pagename) |
| | 304 | if page_created: |
| | 305 | page.save() |
| | 306 | response = SuccessfulEditRedirect(source_urn) |
| | 307 | return _handle_successful_wikiedit(request, response, page) |
| | 308 | else: |
| | 309 | form = CopyPageForm(initial={'source_urn': request.ductus.resource.urn}) |
| | 310 | |
| | 311 | return render_to_response('wiki/copy.html', { |
| | 312 | 'form': form, |
| | 313 | }, RequestContext(request)) |