X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=filex%2Fviews.py;h=b37a6ce359df320d737d516c1378e487732b73f8;hb=4268b04e49c87d6373c094a41e77372328e87be1;hp=57932d7d371c055e54a5d491b16db8212d0e0ec0;hpb=a0070644fd09063d4222ca3142f3e920924c0bea;p=qcg-portal.git diff --git a/filex/views.py b/filex/views.py index 57932d7..b37a6ce 100644 --- a/filex/views.py +++ b/filex/views.py @@ -1,11 +1,10 @@ -from datetime import datetime import mimetypes 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.utils.timezone import UTC, localtime +from django.views.decorators.http import require_POST from filex.ftp import FTPOperation, FTPException from filex.uploadhandler import with_ftp_upload_handler @@ -35,23 +34,11 @@ def list_content(request): return JsonResponse({'msg': e.message}, status=400) data = [] + for item in listing: + item['size'] = filesizeformat(item['size']) + item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT') - # ignore first two: '.' and '..' - for item in listing.strip().splitlines()[2:]: - # we may receive empty string when there are multiple consecutive newlines in listing - if item: - attrs, name = item.split(' ', 1) - - attrs = dict((attr.split('=') for attr in attrs.split(';') if attr)) - - date = localtime(datetime.strptime(attrs['Modify'], "%Y%m%d%H%M%S").replace(tzinfo=UTC())) - - data.append({ - 'name': name, - 'type': 'file' if attrs['Type'] == 'file' else 'directory', - 'size': filesizeformat(attrs['Size']), - 'date': date_format(date, 'DATETIME_FORMAT'), - }) + data.append(item) return JsonResponse(data, safe=False) @@ -85,3 +72,62 @@ def download(request): def upload(request): # TODO error handling return JsonResponse({'success': True}) + + +def info(request): + check_auth(request) + + # TODO data validation + host = request.GET.get('host') + path = request.GET.get('path') + if not host or not path: + raise SuspiciousOperation("No path or host given!") + + url = 'gsiftp://' + host + path + + try: + return JsonResponse(FTPOperation(request.session['proxy']).info(url)) + except FTPException as e: + status = 400 + if 'No such file or directory' in e.message: + status = 404 + elif 'Permission denied' in e.message: + 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})