From 28340cf49d8011494d7a413290dbe72767c803a7 Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Tue, 4 Sep 2018 15:41:56 +0100 Subject: [PATCH] Handle the files better --- opentech/apply/funds/models/mixins.py | 13 +++++++++++-- opentech/apply/stream_forms/files.py | 14 ++++++-------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py index 8c768d156..d0da58924 100644 --- a/opentech/apply/funds/models/mixins.py +++ b/opentech/apply/funds/models/mixins.py @@ -1,4 +1,5 @@ from django.utils.text import mark_safe +from django.core.files import File from opentech.apply.stream_forms.blocks import FormFieldBlock from opentech.apply.utils.blocks import MustIncludeFieldBlock @@ -30,6 +31,14 @@ class AccessFormData: data[field_id] = response return data + def deserialise_file(self, file): + print(file) + if isinstance(file, StreamFieldFile): + return file + if isinstance(file, File): + return StreamFieldFile(file.file, name=file.name) + return StreamFieldFile(None, name=file['name']) + @property def deserialised_data(self): # Converts the file dicts into actual file objects @@ -38,9 +47,9 @@ class AccessFormData: if isinstance(field.block, UploadableMediaBlock): file = data.get(field.id, []) try: - data[field.id] = StreamFieldFile(file.file, name=file.name) + data[field.id] = self.deserialise_file(file) except AttributeError: - data[field.id] = [StreamFieldFile(f.file, name=f.name) for f in file] + data[field.id] = [self.deserialise_file(f) for f in file] return data def get_definitive_id(self, id): diff --git a/opentech/apply/stream_forms/files.py b/opentech/apply/stream_forms/files.py index 4dccf00cb..946609c1d 100644 --- a/opentech/apply/stream_forms/files.py +++ b/opentech/apply/stream_forms/files.py @@ -9,7 +9,8 @@ class StreamFieldDataEncoder(DjangoJSONEncoder): def default(self, o): if isinstance(o, StreamFieldFile): return { - 'path': o.name, + 'name': o.name, + 'path': o.path, } return super().default(o) @@ -59,15 +60,14 @@ class StreamFieldFile(File): else: self.file.open(mode) return self - # open() doesn't alter the file's contents, but it does reset the pointer - open.alters_data = True def save(self, folder): - file_path = os.path.join(folder, self.name) - name = self.storage.generate_filename(file_path) + name = self.name + if not name.startswith(folder): + name = os.path.join(folder, name) + name = self.storage.generate_filename(name) self.name = self.storage.save(name, self.file) self._committed = True - save.alters_data = True def delete(self, save=True): if not self: @@ -83,8 +83,6 @@ class StreamFieldFile(File): self.name = None self._committed = False - delete.alters_data = True - @property def closed(self): file = getattr(self, '_file', None) -- GitLab