fix in handling file name with special characters
[qcg-portal.git] / filex / views.py
index 0d4ab17..ada8b7b 100644 (file)
@@ -1,4 +1,5 @@
 from itertools import islice
+import logging
 import mimetypes
 import os
 
@@ -8,6 +9,7 @@ from django.http import JsonResponse, StreamingHttpResponse
 from django.shortcuts import get_object_or_404, render
 from django.template.defaultfilters import filesizeformat
 from django.utils.formats import date_format
+from django.utils.http import urlquote
 from django.views.decorators.http import require_POST
 from django.views.generic import View
 
@@ -42,6 +44,9 @@ class FTPView(View):
             except FTPError as e:
                 msg, status = parse_ftp_error(e)
 
+                logger = logging.getLogger('gridftp')
+                logger.error(e.verbose, extra={'user': request.user, 'path': request.path, 'params': form.cleaned_data})
+
                 return JsonResponse({'error': msg}, status=status)
 
         setattr(cls, cls.method, process)
@@ -108,7 +113,7 @@ class DeleteView(FTPView):
 
         for path in params['dirs']:
             try:
-                ftp.rmdir(url + path)
+                ftp.rmdir(url + urlquote(path))
             except FTPError as e:
                 fail[path] = e.message
             else:
@@ -116,7 +121,7 @@ class DeleteView(FTPView):
 
         for path in params['files']:
             try:
-                ftp.delete(url + path)
+                ftp.delete(url + urlquote(path))
             except FTPError as e:
                 fail[path] = e.message
             else:
@@ -174,7 +179,8 @@ class ExtractView(FTPView):
 
 
 def make_url(params, *parts):
-    return 'gsiftp://{}/{}'.format(params['host'], os.path.join(*[params[part] for part in parts]) if parts else '')
+    return 'gsiftp://{}/{}'.format(params['host'],
+                                   urlquote(os.path.join(*[params[part] for part in parts]), safe='/~') if parts else '')
 
 
 @require_POST