+from datetime import datetime
from Queue import Queue, Empty
import re
from threading import Event
+from django.utils.timezone import localtime, UTC
from gridftp import FTPClient, Buffer, HandleAttr, OperationAttr
while not self.stream.empty():
result += self.stream.get()
- return result
+ return self._parse_mlst(result)
+
+ @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()))
+
+ data.append({
+ 'name': name,
+ 'type': 'file' if attrs['Type'] == 'file' else 'directory',
+ 'size': int(attrs['Size']),
+ 'date': date,
+ })
+
+ return data
def get(self, url):
self.cli.get(url, self._done, None, self.op_attr)
-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 filex.ftp import FTPOperation, FTPException
from filex.uploadhandler import with_ftp_upload_handler
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')
- # 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'),
- })
-
- return JsonResponse(data, safe=False)
+ return JsonResponse(listing, safe=False)
def download(request):