diff --git a/opentech/apply/funds/models/mixins.py b/opentech/apply/funds/models/mixins.py index a907e669c187d393f19009930f956dcee14edb6e..3e99beab2861a56117c28e64d89df0ade73c9166 100644 --- a/opentech/apply/funds/models/mixins.py +++ b/opentech/apply/funds/models/mixins.py @@ -31,24 +31,37 @@ class AccessFormData: data[field_id] = response return data - def deserialise_file(self, file): + @classmethod + def stream_file(cls, file): if isinstance(file, StreamFieldFile): return file if isinstance(file, File): return StreamFieldFile(file.file, name=file.name) return StreamFieldFile(None, name=file['name'], filename=file.get('filename')) - @property - def deserialised_data(self): + @classmethod + def process_file(cls, file): + try: + return cls.stream_file(file) + except TypeError: + return [cls.stream_file(f) for f in file] + + @classmethod + def from_db(cls, db, field_names, values): + instance = super().from_db(db, field_names, values) + if 'form_data' in field_names: + # When the form_data is loaded from the DB deserialise it + instance.form_data = cls.deserialised_data(instance.form_data, instance.form_fields) + return instance + + @classmethod + def deserialised_data(cls, data, form_fields): # Converts the file dicts into actual file objects - data = self.raw_data.copy() - for field in self.form_fields: + data = data.copy() + for field in form_fields: if isinstance(field.block, UploadableMediaBlock): file = data.get(field.id, []) - try: - data[field.id] = self.deserialise_file(file) - except TypeError: - data[field.id] = [self.deserialise_file(f) for f in file] + data[field.id] = cls.process_file(file) return data def get_definitive_id(self, id): @@ -63,7 +76,7 @@ class AccessFormData: def data(self, id): definitive_id = self.get_definitive_id(id) try: - return self.deserialised_data[definitive_id] + return self.raw_data[definitive_id] except KeyError as e: # We have most likely progressed application forms so the data isnt in form_data return None diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py index 432ef41ec11ad4d0652bc486f984b1175d3fa00f..e6bb7b7d2a428aef64a705f73015a2c3abed1f9a 100644 --- a/opentech/apply/funds/models/submissions.py +++ b/opentech/apply/funds/models/submissions.py @@ -456,8 +456,8 @@ class ApplicationSubmission( # Will return True/False if the revision was created or not self.clean_submission() current_submission = ApplicationSubmission.objects.get(id=self.id) - current_data = current_submission.deserialised_data - if current_data != self.deserialised_data or force: + current_data = current_submission.form_data + if current_data != self.form_data or force: if self.live_revision == self.draft_revision: revision = ApplicationRevision.objects.create(submission=self, form_data=self.form_data, author=by) else: @@ -479,7 +479,7 @@ class ApplicationSubmission( def clean_submission(self): self.process_form_data() self.ensure_user_has_account() - self.process_file_data(self.deserialised_data) + self.process_file_data(self.form_data) def process_form_data(self): for field_name, field_id in self.must_include.items(): @@ -491,14 +491,14 @@ class ApplicationSubmission( files = {} for field in self.form_fields: if isinstance(field.block, UploadableMediaBlock): - files[field.id] = self.deserialised_data[field.id] + files[field.id] = self.data(field.id) or [] self.form_data.pop(field.id, None) return files def process_file_data(self, data): for field in self.form_fields: if isinstance(field.block, UploadableMediaBlock): - file = data.get(field.id, []) + file = self.process_file(data.get(field.id, [])) folder = os.path.join('submission', str(self.id), field.id) try: file.save(folder) diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py index be1fbddd81574d6f84a76d289cfba62bc5e8b5aa..702fbb8ca60f47df698dbb8409c3ecc0794b0c23 100644 --- a/opentech/apply/funds/tests/test_models.py +++ b/opentech/apply/funds/tests/test_models.py @@ -392,11 +392,11 @@ class TestApplicationSubmission(TestCase): def test_create_revision_on_data_change(self): submission = ApplicationSubmissionFactory() submission.form_data['title'] = 'My Awesome Title' - new_data = submission.deserialised_data + new_data = submission.form_data submission.create_revision() submission = self.refresh(submission) self.assertEqual(submission.revisions.count(), 2) - self.assertDictEqual(submission.live_revision.deserialised_data, new_data) + self.assertDictEqual(submission.live_revision.form_data, new_data) def test_dont_create_revision_on_data_same(self): submission = ApplicationSubmissionFactory() diff --git a/opentech/apply/funds/tests/test_views.py b/opentech/apply/funds/tests/test_views.py index ebc1659d22c2c412f87512c0849d582a730269b4..6131353fc2f6838764545666b11ff868342a4882 100644 --- a/opentech/apply/funds/tests/test_views.py +++ b/opentech/apply/funds/tests/test_views.py @@ -303,7 +303,7 @@ class TestApplicantSubmissionView(BaseSubmissionViewTestCase): self.draft_proposal_submission.save() response = self.get_page(self.draft_proposal_submission, 'edit') - self.assertDictEqual(response.context['object'].deserialised_data, draft_revision.deserialised_data) + self.assertDictEqual(response.context['object'].form_data, draft_revision.form_data) def test_cant_edit_submission_incorrect_state(self): submission = InvitedToProposalFactory(user=self.user) @@ -321,7 +321,7 @@ class TestRevisionsView(BaseSubmissionViewTestCase): def test_create_revisions_on_submit(self): submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user) - old_data = submission.deserialised_data.copy() + old_data = submission.form_data.copy() new_title = 'New title' new_data = prepare_form_data(submission, title=new_title) @@ -332,14 +332,14 @@ class TestRevisionsView(BaseSubmissionViewTestCase): self.assertEqual(submission.status, 'proposal_discussion') self.assertEqual(submission.revisions.count(), 2) - self.assertDictEqual(submission.revisions.last().deserialised_data, old_data) - self.assertDictEqual(submission.live_revision.deserialised_data, submission.deserialised_data) + self.assertDictEqual(submission.revisions.last().form_data, old_data) + self.assertDictEqual(submission.live_revision.form_data, submission.form_data) self.assertEqual(submission.live_revision.author, self.user) self.assertEqual(submission.title, new_title) def test_dont_update_live_revision_on_save(self): submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user) - old_data = submission.deserialised_data.copy() + old_data = submission.form_data.copy() new_data = prepare_form_data(submission, title='New title') @@ -349,9 +349,9 @@ class TestRevisionsView(BaseSubmissionViewTestCase): self.assertEqual(submission.status, 'draft_proposal') self.assertEqual(submission.revisions.count(), 2) - self.assertDictEqual(submission.draft_revision.deserialised_data, submission.from_draft().deserialised_data) + self.assertDictEqual(submission.draft_revision.form_data, submission.from_draft().form_data) self.assertEqual(submission.draft_revision.author, self.user) - self.assertDictEqual(submission.live_revision.deserialised_data, old_data) + self.assertDictEqual(submission.live_revision.form_data, old_data) def test_existing_draft_edit_and_submit(self): submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user)