fix handling zip archives
[qcg-portal.git] / filex / views.py
index 9aeb505..a85c265 100644 (file)
@@ -4,6 +4,8 @@ from django.core.exceptions import PermissionDenied, SuspiciousOperation
 from django.http import JsonResponse, StreamingHttpResponse
 from django.template.defaultfilters import filesizeformat
 from django.utils.formats import date_format
+from django.views.decorators.http import require_POST
+from filex.forms import NewDirForm, RenameForm
 
 from filex.ftp import FTPOperation, FTPException
 from filex.uploadhandler import with_ftp_upload_handler
@@ -94,3 +96,138 @@ def info(request):
             status = 403
 
         return JsonResponse({'msg': e.message}, status=status)
+
+
+@require_POST
+def delete(request):
+    check_auth(request)
+
+    # TODO data validation
+    host = request.POST.get('host')
+    path = request.POST.get('path')
+    dirs = request.POST.getlist('dirs')
+    files = request.POST.getlist('files')
+    if not host or not path or not (files or dirs):
+        raise SuspiciousOperation("No path or host or files given!")
+
+    url = 'gsiftp://' + host + path + '/'
+    ftp = FTPOperation(request.session['proxy'])
+
+    done, fail = [], {}
+
+    for name in dirs:
+        try:
+            ftp.rmdir(url + name)
+        except FTPException as e:
+            fail[name] = e.message
+        else:
+            done.append(name)
+
+    for name in files:
+        try:
+            ftp.delete(url + name)
+        except FTPException as e:
+            fail[name] = e.message
+        else:
+            done.append(name)
+
+    return JsonResponse({'done': done, 'fail': fail})
+
+
+@require_POST
+def mkdir(request):
+    check_auth(request)
+
+    # TODO actual data validation
+    form = NewDirForm(request.POST)
+
+    if form.is_valid():
+        host = form.cleaned_data['host']
+        path = form.cleaned_data['path']
+        name = form.cleaned_data['name']
+
+        url = 'gsiftp://' + host + path + '/' + name
+
+        try:
+            FTPOperation(request.session['proxy']).mkdir(url)
+        except FTPException as e:
+            msg = e.message
+        else:
+            return JsonResponse({'success': True})
+    else:
+        msg = form.errors
+
+    return JsonResponse({'msg': msg}, status=400)
+
+
+@require_POST
+def move(request):
+    check_auth(request)
+
+    # TODO actual data validation
+    form = RenameForm(request.POST)
+
+    if form.is_valid():
+        host = form.cleaned_data['host']
+        path = form.cleaned_data['path']
+        src = form.cleaned_data['src']
+        dst = form.cleaned_data['dst']
+
+        src_url = 'gsiftp://' + host + path + '/' + src
+        dst_url = 'gsiftp://' + host + path + '/' + dst
+
+        try:
+            FTPOperation(request.session['proxy']).move(src_url, dst_url)
+        except FTPException as e:
+            msg = e.message
+        else:
+            return JsonResponse({'success': True})
+    else:
+        msg = form.errors
+
+    return JsonResponse({'msg': msg}, status=400)
+
+
+@require_POST
+def compress(request):
+    check_auth(request)
+
+    # TODO data validation
+    host = request.POST.get('host')
+    path = request.POST.get('path')
+    files = request.POST.getlist('files')
+    archive = request.POST.get('archive')
+    if not host or not path or not files or not archive:
+        raise SuspiciousOperation("No path or host or files or archive given!")
+
+    server = 'gsiftp://' + host
+
+    try:
+        # consume generator with command output
+        list(FTPOperation(request.session['proxy']).compress(server, path, files, archive))
+    except FTPException as e:
+        return JsonResponse({'msg': e.message}, status=400)
+    else:
+        return JsonResponse({'success': True})
+
+
+@require_POST
+def extract(request):
+    check_auth(request)
+
+    # TODO data validation
+    host = request.POST.get('host')
+    archive = request.POST.get('archive')
+    dst = request.POST.get('dst')
+    if not host or not archive or not dst:
+        raise SuspiciousOperation("No path or host or files or archive given!")
+
+    server = 'gsiftp://' + host
+
+    try:
+        # consume generator with command output
+        list(FTPOperation(request.session['proxy']).extract(server, archive, dst))
+    except FTPException as e:
+        return JsonResponse({'msg': e.message}, status=400)
+    else:
+        return JsonResponse({'success': True})