0f5bfb3e38dfa095e00479ddfa9bce4446bca642
[qcg-portal.git] / filex / uploadhandler.py
1 from functools import wraps
2
3 from django.core.files.uploadedfile import UploadedFile
4 from django.core.files.uploadhandler import FileUploadHandler, StopUpload, StopFutureHandlers
5 from django.views.decorators.csrf import csrf_exempt, csrf_protect
6
7 from filex.ftp import FTPOperation
8
9
10 class FtpUploadHandler(FileUploadHandler):
11     ftp = None
12
13     def new_file(self, file_name, *args, **kwargs):
14         super(FtpUploadHandler, self).new_file(file_name, *args, **kwargs)
15
16         # TODO limit to selected request.path
17         # TODO validate host and path
18         host = self.request.GET.get('host')
19         path = self.request.GET.get('path')
20
21         if self.request.user.is_anonymous() or not host or not path:
22             raise StopUpload(connection_reset=True)
23
24         if self.ftp is None:
25             self.ftp = FTPOperation(self.request.session['proxy'], self.chunk_size)
26
27         self.ftp.put('gsiftp://' + host + path + self.file_name)
28
29         StopFutureHandlers()
30
31     def receive_data_chunk(self, raw_data, start):
32         self.ftp.stream.put(raw_data)
33
34     def file_complete(self, file_size):
35         # signal end of data and wait for finish
36         self.ftp.stream.put(None)
37         self.ftp.wait()
38
39         return UploadedFile(name=self.file_name, size=file_size, charset=self.charset,
40                             content_type=self.content_type, content_type_extra=self.content_type_extra)
41
42
43 def with_ftp_upload_handler(view_func):
44     @wraps(view_func)
45     def wrapped_view(request, *args, **kwargs):
46         request.upload_handlers = [FtpUploadHandler(request)]
47
48         return csrf_protect(view_func)(request, *args, **kwargs)
49
50     return csrf_exempt(wrapped_view)