Add "most of" support for truck dump receiving

still not complete, but conceptually it sort of is...
This commit is contained in:
Lance Edgar 2018-05-18 15:51:47 -05:00
parent 805a1afa3f
commit cd7922f204
8 changed files with 368 additions and 76 deletions

View file

@ -27,6 +27,7 @@ Model Master View
from __future__ import unicode_literals, absolute_import
import os
import tempfile
import logging
import six
@ -633,14 +634,39 @@ class MasterView(View):
return self.render_to_response('create', {'form': form}, mobile=True)
def save_create_form(self, form):
uploads = self.normalize_uploads(form)
self.before_create(form)
with self.Session().no_autoflush:
obj = self.objectify(form, self.form_deserialized)
self.before_create_flush(obj, form)
self.Session.add(obj)
self.Session.flush()
self.process_uploads(obj, form, uploads)
return obj
def normalize_uploads(self, form, skip=None):
uploads = {}
for node in form.schema:
if isinstance(node.typ, deform.FileData):
if skip and node.name in skip:
continue
filedict = self.form_deserialized.get(node.name)
if filedict:
tempdir = tempfile.mkdtemp()
filepath = os.path.join(tempdir, filedict['filename'])
tmpinfo = form.deform_form[node.name].widget.tmpstore.get(filedict['uid'])
tmpdata = tmpinfo['fp'].read()
with open(filepath, 'wb') as f:
f.write(tmpdata)
uploads[node.name] = {
'tempdir': tempdir,
'temp_path': filepath,
}
return uploads
def process_uploads(self, obj, form, uploads):
pass
def before_create_flush(self, obj, form):
pass
@ -1230,6 +1256,8 @@ class MasterView(View):
"""
obj = self.get_instance()
filename = self.request.GET.get('filename', None)
if not filename:
raise self.notfound()
path = self.download_path(obj, filename)
response = FileResponse(path, request=self.request)
response.content_length = os.path.getsize(path)
@ -2124,6 +2152,14 @@ class MasterView(View):
"""
return getattr(cls, 'mobile_row_form_factory', forms.Form)
def render_downloadable_file(self, obj, field):
filename = getattr(obj, field)
if not filename:
return ""
path = self.download_path(obj, filename)
url = self.get_action_url('download', obj, _query={'filename': filename})
return self.render_file_field(path, url)
def render_file_field(self, path, url=None, filename=None):
"""
Convenience for rendering a file with optional download link