diff --git a/opentech/apply/funds/models/submissions.py b/opentech/apply/funds/models/submissions.py index 10acf228efcca7c6445694c37c51f94a4e41bdd6..432ef41ec11ad4d0652bc486f984b1175d3fa00f 100644 --- a/opentech/apply/funds/models/submissions.py +++ b/opentech/apply/funds/models/submissions.py @@ -492,7 +492,7 @@ class ApplicationSubmission( for field in self.form_fields: if isinstance(field.block, UploadableMediaBlock): files[field.id] = self.deserialised_data[field.id] - self.form_data.pop(field.id) + self.form_data.pop(field.id, None) return files def process_file_data(self, data): @@ -649,7 +649,7 @@ def log_status_update(sender, **kwargs): ) -class ApplicationRevision(models.Model): +class ApplicationRevision(models.Model, AccessFormData): submission = models.ForeignKey(ApplicationSubmission, related_name='revisions', on_delete=models.CASCADE) form_data = JSONField(encoder=StreamFieldDataEncoder) timestamp = models.DateTimeField(auto_now=True) @@ -658,6 +658,10 @@ class ApplicationRevision(models.Model): class Meta: ordering = ['-timestamp'] + @property + def form_fields(self): + return self.submission.form_fields + def get_compare_url_to_latest(self): return reverse("funds:submissions:revisions:compare", kwargs={ 'submission_pk': self.submission.id, diff --git a/opentech/apply/funds/tests/test_models.py b/opentech/apply/funds/tests/test_models.py index 2036480031e88e2a6ad8b450bbf1524869616aa4..be1fbddd81574d6f84a76d289cfba62bc5e8b5aa 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.form_data.copy() + new_data = submission.deserialised_data submission.create_revision() submission = self.refresh(submission) self.assertEqual(submission.revisions.count(), 2) - self.assertDictEqual(submission.live_revision.form_data, new_data) + self.assertDictEqual(submission.live_revision.deserialised_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 6131353fc2f6838764545666b11ff868342a4882..ebc1659d22c2c412f87512c0849d582a730269b4 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'].form_data, draft_revision.form_data) + self.assertDictEqual(response.context['object'].deserialised_data, draft_revision.deserialised_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.form_data.copy() + old_data = submission.deserialised_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().form_data, old_data) - self.assertDictEqual(submission.live_revision.form_data, submission.form_data) + self.assertDictEqual(submission.revisions.last().deserialised_data, old_data) + self.assertDictEqual(submission.live_revision.deserialised_data, submission.deserialised_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.form_data.copy() + old_data = submission.deserialised_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.form_data, submission.from_draft().form_data) + self.assertDictEqual(submission.draft_revision.deserialised_data, submission.from_draft().deserialised_data) self.assertEqual(submission.draft_revision.author, self.user) - self.assertDictEqual(submission.live_revision.form_data, old_data) + self.assertDictEqual(submission.live_revision.deserialised_data, old_data) def test_existing_draft_edit_and_submit(self): submission = ApplicationSubmissionFactory(status='draft_proposal', workflow_stages=2, user=self.user) diff --git a/opentech/apply/stream_forms/files.py b/opentech/apply/stream_forms/files.py index 5ec5d25932cf845a8300210fbb3e44c0228e95af..836e95877f65e1e501fdab30668183530065ef51 100644 --- a/opentech/apply/stream_forms/files.py +++ b/opentech/apply/stream_forms/files.py @@ -38,6 +38,10 @@ class StreamFieldFile(File): file = property(_get_file, _set_file, _del_file) + def read(self): + self.file.seek(0) + return super().read() + @property def path(self): return self.storage.path(self.name) diff --git a/opentech/apply/stream_forms/testing/factories.py b/opentech/apply/stream_forms/testing/factories.py index f742d6c50628280aacbf96197134fb594abe6566..b60588aef0a00318fc67b126b3e50cedbb2ae843 100644 --- a/opentech/apply/stream_forms/testing/factories.py +++ b/opentech/apply/stream_forms/testing/factories.py @@ -2,7 +2,7 @@ from collections import defaultdict import json import uuid -from django.core.files.uploadedfile import InMemoryUploadedFile +from django.core.files.uploadedfile import SimpleUploadedFile import factory from wagtail.core.blocks import RichTextBlock @@ -138,7 +138,7 @@ class UploadableMediaFactory(FormFieldBlockFactory): params = params.copy() params.setdefault('data', b'this is some content') file_name, file = cls.default_value()._make_content(params) - return InMemoryUploadedFile(file, 'file', file_name, None, file.tell(), None) + return SimpleUploadedFile(file_name, file.read()) class ImageFieldBlockFactory(UploadableMediaFactory):