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
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})