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