6dd2d9f5f4f79aacc7d142447d999c1b97ff6cdf
[qcg-portal.git] / filex / views.py
1 import mimetypes
2
3 from django.core.exceptions import PermissionDenied, SuspiciousOperation
4 from django.http import JsonResponse, StreamingHttpResponse
5 from django.template.defaultfilters import filesizeformat
6 from django.utils.formats import date_format
7
8 from filex.ftp import FTPOperation, FTPException
9 from filex.uploadhandler import with_ftp_upload_handler
10
11
12 def check_auth(request):
13     if not request.user.is_authenticated():
14         raise PermissionDenied("Login required!")
15     if not request.session['proxy']:
16         raise PermissionDenied("No proxy found!")
17
18
19 def list_content(request):
20     check_auth(request)
21
22     # TODO data validation
23     host = request.GET.get('host')
24     path = request.GET.get('path')
25     if not host or not path:
26         raise SuspiciousOperation("No path or host given!")
27
28     url = 'gsiftp://' + host + path
29
30     try:
31         listing = FTPOperation(request.session['proxy']).listing(url)
32     except FTPException as e:
33         return JsonResponse({'msg': e.message}, status=400)
34
35     for item in listing:
36         item['size'] = filesizeformat(item['size'])
37         item['date'] = date_format(item['date'], 'DATETIME_FORMAT')
38
39     return JsonResponse(listing, safe=False)
40
41
42 def download(request):
43     check_auth(request)
44
45     # TODO data validation
46     host = request.GET.get('host')
47     path = request.GET.get('path')
48     name = request.GET.get('name')
49     if not host or not path or not name:
50         raise SuspiciousOperation("No path or host or name given!")
51
52     url = 'gsiftp://' + host + path + '/' + name
53
54     mime_type, encoding = mimetypes.guess_type(name)
55
56     response = StreamingHttpResponse(FTPOperation(request.session['proxy']).get(url),
57                                      content_type=mime_type or 'application/octet-stream')
58     response['Content-Disposition'] = 'attachment; filename={}'.format(name)
59     # TODO Content-Length (?)
60
61     if encoding:
62         response['Content-Encoding'] = encoding
63
64     return response
65
66
67 @with_ftp_upload_handler
68 def upload(request):
69     # TODO error handling
70     return JsonResponse({'success': True})