diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py index 8c768d156bff230ca83228f349b02b06756bbefd..d0da58924f6f1d3c3ee4b38153262692615a7390 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 4dccf00cbbb0e51a4aa8b67649af51a4d6227ccf..946609c1d9754bdf27c6a15d3f2cf1f60d6f0a3f 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)