Merge branch 'devel'
[qcg-portal.git] / filex / views.py
index 1904d4f..108f7c3 100644 (file)
@@ -1,4 +1,3 @@
-from itertools import islice
 import logging
 import mimetypes
 import os
@@ -9,6 +8,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
 
@@ -61,12 +61,12 @@ class ListView(FTPView):
         listing = ftp.listing(make_url(params, 'path'))
 
         data = []
-        # ignore . and .. from beginning of the listing
-        for item in islice(listing, 2, None):
-            item['size'] = filesizeformat(item['size'])
-            item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT')
+        for item in listing:
+            if item['name'] not in ['.', '..']:
+                item['size'] = filesizeformat(item['size'])
+                item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT')
 
-            data.append(item)
+                data.append(item)
 
         return JsonResponse(data, safe=False)
 
@@ -88,7 +88,7 @@ class DownloadView(FTPView):
         mime_type, encoding = mimetypes.guess_type(name)
 
         response = StreamingHttpResponse(data, content_type=mime_type or 'application/octet-stream')
-        response['Content-Disposition'] = u'attachment; filename={}'.format(name)
+        response['Content-Disposition'] = 'attachment; filename*={}'.format(urlquote(name))
         response['Content-Length'] = stats['size']
 
         if encoding:
@@ -112,7 +112,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:
@@ -120,7 +120,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:
@@ -178,7 +178,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