+ def handle(self, ftp, params):
+ ftp.mkdir(make_url(params, 'path', 'name'))
+
+ return JsonResponse({'success': True})
+
+
+class MoveView(FTPView):
+ method = 'post'
+ form_class = RenameForm
+
+ def handle(self, ftp, params):
+ ftp.move(make_url(params, 'src'), make_url(params, 'dst'))
+
+ return JsonResponse({'success': True})
+
+
+class CompressView(FTPView):
+ method = 'post'
+ form_class = CompressForm
+
+ def handle(self, ftp, params):
+ try:
+ # consume generator with command output
+ list(ftp.compress(make_url(params), params['path'], params['files'], params['archive']))
+ except ValueError as e:
+ return JsonResponse({'error': e.message}, status=400)
+
+ return JsonResponse({'success': True})
+
+
+class ExtractView(FTPView):
+ method = 'post'
+ form_class = ExtractForm
+
+ def handle(self, ftp, params):
+ try:
+ # consume generator with command output
+ list(ftp.extract(make_url(params), params['path'], params['dst']))
+ except ValueError as e:
+ return JsonResponse({'error': e.message}, status=400)
+
+ return JsonResponse({'success': True})
+
+
+def make_url(params, *parts):
+ return 'gsiftp://{}/{}'.format(params['host'], os.path.join(*[params[part] for part in parts]) if parts else '')
+
+
+@require_POST
+@with_ftp_upload_handler
+def upload(request):
+ return JsonResponse({'success': True})
+
+
+@require_POST
+@login_required
+def fav_add(request):
+ data = request.POST.copy()
+ data['owner'] = request.user.id
+
+ form = FavoriteForm(data)
+
+ if not form.is_valid():
+ return JsonResponse({'error': form.errors}, status=400)
+
+ try:
+ FTPOperation(request.session['proxy']).info(make_url(form.cleaned_data, 'path'))
+ except FTPError as e:
+ msg, status = parse_ftp_error(e)