fix jquery url for admins/error pages
[qcg-portal.git] / filex / uploadhandler.py
index c2414ee..ee34a91 100644 (file)
@@ -3,10 +3,11 @@ import os
 
 from django.core.files.uploadedfile import UploadedFile
 from django.core.files.uploadhandler import FileUploadHandler, StopUpload, StopFutureHandlers
+from django.http import JsonResponse
 from django.views.decorators.csrf import csrf_exempt, csrf_protect
 
 from filex.forms import HostPathForm
-from filex.ftp import FTPOperation
+from filex.ftp import FTPOperation, FTPError
 
 
 class FtpUploadHandler(FileUploadHandler):
@@ -25,7 +26,8 @@ class FtpUploadHandler(FileUploadHandler):
         if self.ftp is None:
             self.ftp = FTPOperation(self.request.session['proxy'], self.chunk_size)
 
-        self.url = 'gsiftp://' + form.cleaned_data['host'] + os.path.join(form.cleaned_data['path'], self.file_name)
+        self.url = 'gsiftp://{}/{}'.format(form.cleaned_data['host'],
+                                           os.path.join(form.cleaned_data['path'], self.file_name))
         self.tmp_url = self.url + '.part'
 
         self.ftp.put(self.tmp_url)
@@ -51,6 +53,15 @@ def with_ftp_upload_handler(view_func):
     def wrapped_view(request, *args, **kwargs):
         request.upload_handlers = [FtpUploadHandler(request)]
 
-        return csrf_protect(view_func)(request, *args, **kwargs)
+        try:
+            return csrf_protect(view_func)(request, *args, **kwargs)
+        except FTPError as e:
+            status = 400
+            if 'No such file or directory' in e.message:
+                status = 404
+            elif 'Permission denied' in e.message:
+                status = 403
+
+            return JsonResponse({'error': e.message}, status=status)
 
     return csrf_exempt(wrapped_view)