From b96be0ed08b8fe0d3c07b7bda0d683e67ff517e4 Mon Sep 17 00:00:00 2001 From: Maciej Tronowski Date: Thu, 9 Apr 2015 14:25:52 +0200 Subject: [PATCH] info view: get information about file or directory --- filex/ftp.py | 34 ++++++++++++++++++++++------------ filex/urls.py | 1 + filex/views.py | 30 ++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/filex/ftp.py b/filex/ftp.py index c0b3e25..a08732d 100644 --- a/filex/ftp.py +++ b/filex/ftp.py @@ -1,7 +1,9 @@ from datetime import datetime from Queue import Queue, Empty +import os import re from threading import Event +from urlparse import urlparse from django.utils.timezone import localtime, UTC from gridftp import FTPClient, Buffer, HandleAttr, OperationAttr @@ -84,25 +86,25 @@ class FTPOperation: @staticmethod def _parse_mlst(listing): - data = [] - for item in listing.strip().splitlines(): # 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())) + attrs_dict = {} + for attr in attrs.split(';'): + try: + key, value = attr.split('=', 1) + attrs_dict[key] = value + except ValueError: + pass - data.append({ + yield { 'name': name, - 'type': 'file' if attrs['Type'] == 'file' else 'directory', - 'size': int(attrs['Size']), - 'date': date, - }) - - return data + 'type': 'directory' if attrs_dict['Type'] == 'dir' else 'file', + 'size': int(attrs_dict['Size']), + 'date': localtime(datetime.strptime(attrs_dict['Modify'], "%Y%m%d%H%M%S").replace(tzinfo=UTC())), + } def get(self, url): self.cli.get(url, self._done, None, self.op_attr) @@ -125,3 +127,11 @@ class FTPOperation: self.cli.move(src, dst, self._done, None, self.op_attr) self.wait() + + def info(self, url): + data = self.listing(url).next() + + if data['name'] == '.': + data['name'] = os.path.basename(urlparse(url).path.rstrip('/')) or u'/' + + return data diff --git a/filex/urls.py b/filex/urls.py index 3a1945d..ad9f403 100644 --- a/filex/urls.py +++ b/filex/urls.py @@ -6,4 +6,5 @@ urlpatterns = patterns('', url(r'^list/$', views.list_content, name='list'), url(r'^download/$', views.download, name='download'), url(r'^upload/$', views.upload, name='upload'), + url(r'^info/$', views.info, name='info'), ) diff --git a/filex/views.py b/filex/views.py index 6dd2d9f..9aeb505 100644 --- a/filex/views.py +++ b/filex/views.py @@ -32,11 +32,14 @@ def list_content(request): except FTPException as e: return JsonResponse({'msg': e.message}, status=400) + data = [] for item in listing: item['size'] = filesizeformat(item['size']) - item['date'] = date_format(item['date'], 'DATETIME_FORMAT') + item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT') - return JsonResponse(listing, safe=False) + data.append(item) + + return JsonResponse(data, safe=False) def download(request): @@ -68,3 +71,26 @@ 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) -- 1.7.9.5