Merge branch 'devel'
[qcg-portal.git] / filex / uploadhandler.py
1 import os
2
3 from django.core.files.uploadedfile import UploadedFile
4 from django.core.files.uploadhandler import FileUploadHandler, StopUpload, StopFutureHandlers
5
6 from filex.forms import HostPathForm
7 from filex.ftp import FTPOperation
8
9
10 class FtpUploadHandler(FileUploadHandler):
11     ftp = None
12     url = None
13     tmp_url = None
14
15     def new_file(self, file_name, *args, **kwargs):
16         super(FtpUploadHandler, self).new_file(file_name, *args, **kwargs)
17
18         form = HostPathForm(self.request.GET)
19
20         if self.request.user.is_anonymous() or not form.is_valid():
21             raise StopUpload(connection_reset=True)
22
23         if self.ftp is None:
24             self.ftp = FTPOperation(self.request.session['proxy'], self.chunk_size)
25
26         self.url = 'gsiftp://{}/{}'.format(form.cleaned_data['host'],
27                                            os.path.join(form.cleaned_data['path'], self.file_name))
28         self.tmp_url = self.url + '.part'
29
30         self.ftp.put(self.tmp_url)
31
32         StopFutureHandlers()
33
34     def receive_data_chunk(self, raw_data, start):
35         self.ftp.stream.put(raw_data)
36
37     def file_complete(self, file_size):
38         # signal end of data and wait for finish
39         self.ftp.stream.put(None)
40         self.ftp.wait()
41
42         self.ftp.move(self.tmp_url, self.url)
43
44         return UploadedFile(name=self.file_name, size=file_size, charset=self.charset,
45                             content_type=self.content_type, content_type_extra=self.content_type_extra)