X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;ds=sidebyside;f=filex%2Fviews.py;h=5d23947c25235bf9c6451724ceea68380aa36c0a;hb=a0feb25389615e9d2ab2b036a491a1aeeb059a52;hp=9aeb505fc6145e10d78af39f94289c915902b0cf;hpb=b96be0ed08b8fe0d3c07b7bda0d683e67ff517e4;p=qcg-portal.git diff --git a/filex/views.py b/filex/views.py index 9aeb505..5d23947 100644 --- a/filex/views.py +++ b/filex/views.py @@ -1,11 +1,16 @@ import mimetypes +from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied, SuspiciousOperation from django.http import JsonResponse, StreamingHttpResponse +from django.shortcuts import get_object_or_404 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, FavoriteForm from filex.ftp import FTPOperation, FTPException +from filex.models import Favorite from filex.uploadhandler import with_ftp_upload_handler @@ -94,3 +99,165 @@ 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}) + + +@require_POST +@login_required +def fav_add(request): + data = request.POST.copy() + data['owner'] = request.user.id + + form = FavoriteForm(data) + + # TODO check if path exists + if form.is_valid(): + instance = form.save() + + return JsonResponse({'group': 'usr', 'host': instance.host, 'path': instance.path, + 'value': instance.host + instance.path}) + + return JsonResponse({'msg': form.errors}, status=400) + + +@require_POST +@login_required +def fav_delete(request): + fav = get_object_or_404(Favorite, owner=request.user, host=request.POST['host'], path=request.POST['path']) + fav.delete() + + return JsonResponse({'success': True})