From 0ce5037a9ce4802dcfe8e0a3c441572a2b6836da Mon Sep 17 00:00:00 2001 From: ariannedee Date: Wed, 14 Oct 2020 14:57:36 -0700 Subject: [PATCH 1/2] DIV-1168: Only one PDF can be uploaded per form --- edivorce/apps/core/models.py | 6 ++- edivorce/apps/core/serializer.py | 15 ++++-- edivorce/apps/core/tests/test_api.py | 69 +++++++++++++++++++++++++--- 3 files changed, 78 insertions(+), 12 deletions(-) diff --git a/edivorce/apps/core/models.py b/edivorce/apps/core/models.py index 7a643d89..a55430dc 100644 --- a/edivorce/apps/core/models.py +++ b/edivorce/apps/core/models.py @@ -213,7 +213,11 @@ class Document(models.Model): content_type = content_types.get(extension) if not content_type: return "application/unknown" - return content_type + return content_type + + @property + def is_pdf(self): + return self.filename.split('.')[-1].lower() == 'pdf' class DontLog: diff --git a/edivorce/apps/core/serializer.py b/edivorce/apps/core/serializer.py index 019e3542..4662d6a2 100644 --- a/edivorce/apps/core/serializer.py +++ b/edivorce/apps/core/serializer.py @@ -42,13 +42,20 @@ class CreateDocumentSerializer(serializers.ModelSerializer): filename = validated_data['file'].name size = validated_data['file'].size user = self.context['request'].user - order = Document.objects.filter(bceid_user=user, doc_type=validated_data['doc_type'], party_code=validated_data['party_code']).count() + 1 - response = Document(bceid_user=user, filename=filename, size=size, sort_order=order, **validated_data) + existing_docs = Document.objects.filter(bceid_user=user, doc_type=validated_data['doc_type'], party_code=validated_data['party_code']) + for other_doc in existing_docs: + if other_doc.is_pdf: + raise ValidationError("PDF documents cannot be combined with images. Only a single PDF or multiple images can be uploaded into one form.") + + sort_order = existing_docs.count() + 1 + document = Document(bceid_user=user, filename=filename, size=size, sort_order=sort_order, **validated_data) + if document.is_pdf and existing_docs.count() > 0: + raise ValidationError("Only one PDF is allowed per form, and PDF documents cannot be combined with images.") try: - response.save() + document.save() except IntegrityError: raise ValidationError("This file appears to have already been uploaded for this document. Duplicate filename: " + filename) - return response + return document class DocumentMetadataSerializer(serializers.ModelSerializer): diff --git a/edivorce/apps/core/tests/test_api.py b/edivorce/apps/core/tests/test_api.py index ad775003..a615de4b 100644 --- a/edivorce/apps/core/tests/test_api.py +++ b/edivorce/apps/core/tests/test_api.py @@ -40,7 +40,8 @@ class MockRedis: @mock.patch.object(Redis, 'get', MockRedis.get) @mock.patch.object(Redis, 'delete', MockRedis.delete) @mock.patch.object(Redis, 'exists', MockRedis.exists) -@modify_settings(MIDDLEWARE={'remove': 'edivorce.apps.core.middleware.bceid_middleware.BceidMiddleware', }) +@modify_settings(MIDDLEWARE={'remove': 'edivorce.apps.core.middleware.bceid_middleware.BceidMiddleware'}) +@override_settings(CLAMAV_ENABLED=False) class APITest(APITestCase): def setUp(self): self.user = BceidUser.objects.create(user_guid='1234') @@ -73,8 +74,7 @@ class APITest(APITestCase): } self.client.force_authenticate(self.user) - with self.settings(CLAMAV_ENABLED=False): - response = self.client.post(url, data) + response = self.client.post(url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) @@ -101,21 +101,76 @@ class APITest(APITestCase): } self.client.force_authenticate(self.user) - with self.settings(CLAMAV_ENABLED=False): - response = self.client.post(url, data) + response = self.client.post(url, data) self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertEqual(Document.objects.count(), 1) - file.seek(0) # + file.seek(0) - with self.settings(CLAMAV_ENABLED=False): + with self.settings(CLAMAV_ENABLED=True): response = self.client.post(url, data) self.assertContains(response, 'This file appears to have already been uploaded for this document.', status_code=status.HTTP_400_BAD_REQUEST) + def test_post_only_one_pdf(self): + url = reverse('documents') + + file = _create_file() + data = { + 'file': file, + 'doc_type': 'AAI', + 'party_code': 1 + } + self.client.force_authenticate(self.user) + response = self.client.post(url, data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(Document.objects.count(), 1) + + file = _create_file(extension='pdf') + data = { + 'file': file, + 'doc_type': 'AAI', + 'party_code': 1 + } + + response = self.client.post(url, data) + + self.assertContains(response, + "Only one PDF is allowed per form, and PDF documents cannot be combined with images.", + status_code=status.HTTP_400_BAD_REQUEST) + self.assertEqual(Document.objects.count(), 1) + + def test_post_no_existing_pdfs(self): + url = reverse('documents') + + file = _create_file(extension='pdf') + data = { + 'file': file, + 'doc_type': 'AAI', + 'party_code': 1 + } + self.client.force_authenticate(self.user) + response = self.client.post(url, data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(Document.objects.count(), 1) + + file = _create_file() + data = { + 'file': file, + 'doc_type': 'AAI', + 'party_code': 1 + } + + response = self.client.post(url, data) + + self.assertContains(response, + "PDF documents cannot be combined with images. Only a single PDF or multiple images can be uploaded into one form.", + status_code=status.HTTP_400_BAD_REQUEST) + self.assertEqual(Document.objects.count(), 1) + def test_post_field_validation(self): url = reverse('documents') From b6146ab3fe692ec04f6a68845429dbe02e54dc92 Mon Sep 17 00:00:00 2001 From: ariannedee Date: Wed, 14 Oct 2020 15:01:33 -0700 Subject: [PATCH 2/2] Fix test --- edivorce/apps/core/tests/test_api.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/edivorce/apps/core/tests/test_api.py b/edivorce/apps/core/tests/test_api.py index a615de4b..82eca245 100644 --- a/edivorce/apps/core/tests/test_api.py +++ b/edivorce/apps/core/tests/test_api.py @@ -108,8 +108,7 @@ class APITest(APITestCase): file.seek(0) - with self.settings(CLAMAV_ENABLED=True): - response = self.client.post(url, data) + response = self.client.post(url, data) self.assertContains(response, 'This file appears to have already been uploaded for this document.',