diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 9782932bc..3b9b2062a 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -965,6 +965,20 @@ class DocumentSerializer( ).isoformat() return doc + def to_internal_value(self, data): + if ( + "created" in data + and isinstance(data["created"], str) + and ":" in data["created"] + ): + # Handle old format of isoformat datetime string + try: + data["created"] = datetime.fromisoformat(data["created"]).date() + except ValueError: # pragma: no cover + # Just pass, validation will catch it + pass + return super().to_internal_value(data) + def validate(self, attrs): if ( "archive_serial_number" in attrs diff --git a/src/documents/tests/test_api_documents.py b/src/documents/tests/test_api_documents.py index bb77f5818..dd4236718 100644 --- a/src/documents/tests/test_api_documents.py +++ b/src/documents/tests/test_api_documents.py @@ -203,6 +203,34 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.data["created"], "2023-01-01") + def test_document_update_legacy_created_format(self): + """ + GIVEN: + - Existing document + WHEN: + - Document is updated with created in datetime format + THEN: + - Document created field is updated as date + """ + doc = Document.objects.create( + title="none", + checksum="123", + mime_type="application/pdf", + created=date(2023, 1, 1), + ) + + created_datetime = datetime.datetime(2023, 2, 1, 12, 0, 0) + response = self.client.patch( + f"/api/documents/{doc.pk}/", + {"created": created_datetime}, + format="json", + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + doc.refresh_from_db() + self.assertEqual(doc.created, date(2023, 2, 1)) + def test_document_update_with_created_date(self): """ GIVEN: