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 from django.views.decorators.http import require_POST
8 from filex.forms import NewDirForm, RenameForm
10 from filex.ftp import FTPOperation, FTPException
11 from filex.uploadhandler import with_ftp_upload_handler
14 def check_auth(request):
15 if not request.user.is_authenticated():
16 raise PermissionDenied("Login required!")
17 if not request.session['proxy']:
18 raise PermissionDenied("No proxy found!")
21 def list_content(request):
24 # TODO data validation
25 host = request.GET.get('host')
26 path = request.GET.get('path')
27 if not host or not path:
28 raise SuspiciousOperation("No path or host given!")
30 url = 'gsiftp://' + host + path
33 listing = FTPOperation(request.session['proxy']).listing(url)
34 except FTPException as e:
35 return JsonResponse({'msg': e.message}, status=400)
39 item['size'] = filesizeformat(item['size'])
40 item['date'] = date_format(item['date'], 'CUSTOM_DATETIME_FORMAT')
44 return JsonResponse(data, safe=False)
47 def download(request):
50 # TODO data validation
51 host = request.GET.get('host')
52 path = request.GET.get('path')
53 name = request.GET.get('name')
54 if not host or not path or not name:
55 raise SuspiciousOperation("No path or host or name given!")
57 url = 'gsiftp://' + host + path + '/' + name
59 mime_type, encoding = mimetypes.guess_type(name)
61 response = StreamingHttpResponse(FTPOperation(request.session['proxy']).get(url),
62 content_type=mime_type or 'application/octet-stream')
63 response['Content-Disposition'] = 'attachment; filename={}'.format(name)
64 # TODO Content-Length (?)
67 response['Content-Encoding'] = encoding
72 @with_ftp_upload_handler
75 return JsonResponse({'success': True})
81 # TODO data validation
82 host = request.GET.get('host')
83 path = request.GET.get('path')
84 if not host or not path:
85 raise SuspiciousOperation("No path or host given!")
87 url = 'gsiftp://' + host + path
90 return JsonResponse(FTPOperation(request.session['proxy']).info(url))
91 except FTPException as e:
93 if 'No such file or directory' in e.message:
95 elif 'Permission denied' in e.message:
98 return JsonResponse({'msg': e.message}, status=status)
105 # TODO data validation
106 host = request.POST.get('host')
107 path = request.POST.get('path')
108 dirs = request.POST.getlist('dirs')
109 files = request.POST.getlist('files')
110 if not host or not path or not (files or dirs):
111 raise SuspiciousOperation("No path or host or files given!")
113 url = 'gsiftp://' + host + path + '/'
114 ftp = FTPOperation(request.session['proxy'])
120 ftp.rmdir(url + name)
121 except FTPException as e:
122 fail[name] = e.message
128 ftp.delete(url + name)
129 except FTPException as e:
130 fail[name] = e.message
134 return JsonResponse({'done': done, 'fail': fail})
141 # TODO actual data validation
142 form = NewDirForm(request.POST)
145 host = form.cleaned_data['host']
146 path = form.cleaned_data['path']
147 name = form.cleaned_data['name']
149 url = 'gsiftp://' + host + path + '/' + name
152 FTPOperation(request.session['proxy']).mkdir(url)
153 except FTPException as e:
156 return JsonResponse({'success': True})
160 return JsonResponse({'msg': msg}, status=400)
167 # TODO actual data validation
168 form = RenameForm(request.POST)
171 host = form.cleaned_data['host']
172 path = form.cleaned_data['path']
173 src = form.cleaned_data['src']
174 dst = form.cleaned_data['dst']
176 src_url = 'gsiftp://' + host + path + '/' + src
177 dst_url = 'gsiftp://' + host + path + '/' + dst
180 FTPOperation(request.session['proxy']).move(src_url, dst_url)
181 except FTPException as e:
184 return JsonResponse({'success': True})
188 return JsonResponse({'msg': msg}, status=400)