def upload_file(request, pk): if pk is None: extension = models.Extension(creator=request.user) else: extension = models.Extension.objects.get(pk=pk) if extension.creator != request.user: return HttpResponseForbidden() if request.method == 'POST': form = UploadForm(request.POST, request.FILES) if form.is_valid(): file_source = form.cleaned_data['source'] try: metadata = models.parse_zipfile_metadata(file_source) uuid = metadata['uuid'] except (models.InvalidExtensionData, KeyError), e: messages.error(request, "Invalid extension data.") return redirect('extensions-upload-file', pk=pk) existing = models.Extension.objects.filter(uuid=uuid) if pk is None and existing.exists(): # Error out if we already have an extension with the same # uuid -- or correct their mistake if they're the same user. ext = existing.get() if request.user == ext.creator: return redirect('extensions-upload-file', pk=ext.pk) else: messages.error(request, "An extension with that UUID has already been added.") return redirect('extensions-upload-file') version = models.ExtensionVersion() version.extension = extension version.parse_metadata_json(metadata) extension.creator = request.user extension.save() version.extension = extension version.source = file_source version.status = models.STATUS_NEW version.save() return redirect('extensions-version-detail', pk=version.pk, ext_pk=extension.pk, slug=extension.slug)