From 7aa945be624772357972ad55a3789f845b2bca6c Mon Sep 17 00:00:00 2001 From: Anthony LC Date: Tue, 21 May 2024 14:46:23 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=B7=EF=B8=8F(backend)=20accept=20strin?= =?UTF-8?q?g=20as=20saved=20document?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Saved documents has to be a string now. Before it has to be a json object. --- src/backend/core/api/serializers.py | 4 +--- src/backend/core/api/viewsets.py | 2 +- src/backend/core/factories.py | 2 +- src/backend/core/models.py | 11 +++++------ .../tests/documents/test_api_documents_retrieve.py | 12 ++++++------ src/backend/core/tests/test_api_document_versions.py | 10 +++++----- src/backend/core/tests/test_models_documents.py | 4 ++-- 7 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 4318b14f2..da24a257e 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -7,8 +7,6 @@ from core import models -from .fields import JSONField - class UserSerializer(serializers.ModelSerializer): """Serialize users.""" @@ -136,7 +134,7 @@ def get_abilities(self, document) -> dict: class DocumentSerializer(BaseResourceSerializer): """Serialize documents.""" - content = JSONField(required=False) + content = serializers.CharField(required=False) class Meta: model = models.Document diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index e27c972a0..f112c5bcb 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -344,7 +344,7 @@ def versions_detail(self, request, pk, version_id, *args, **kwargs): return drf_response.Response( { - "content": json.loads(response["Body"].read()), + "content": response["Body"].read().decode("utf-8"), "last_modified": response["LastModified"], } ) diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index 3f6c00503..445d93871 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -35,7 +35,7 @@ class Meta: title = factory.Sequence(lambda n: f"document{n}") is_public = factory.Faker("boolean") - content = factory.LazyFunction(lambda: {"foo": fake.word()}) + content = factory.Sequence(lambda n: f"content{n}") @factory.post_generation def users(self, create, extracted, **kwargs): diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 0308cd3ac..abee3afd0 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -281,16 +281,15 @@ def content(self): except (FileNotFoundError, ClientError): pass else: - self._content = json.loads(response["Body"].read()) + self._content = response["Body"].read().decode('utf-8') return self._content @content.setter def content(self, content): """Cache the content, don't write to object storage yet""" - if isinstance(content, str): - content = json.loads(content) - if not isinstance(content, dict): - raise ValueError("content should be a json object.") + if not isinstance(content, str): + raise ValueError("content should be a string.") + self._content = content def get_content_response(self, version_id=""): @@ -305,7 +304,7 @@ def save(self, *args, **kwargs): if self._content: file_key = self.file_key - bytes_content = json.dumps(self._content).encode("utf-8") + bytes_content = self._content.encode("utf-8") if default_storage.exists(file_key): response = default_storage.connection.meta.client.head_object( diff --git a/src/backend/core/tests/documents/test_api_documents_retrieve.py b/src/backend/core/tests/documents/test_api_documents_retrieve.py index 7d8eb51c2..e995040e3 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -31,7 +31,7 @@ def test_api_documents_retrieve_anonymous_public(): "accesses": [], "title": document.title, "is_public": True, - "content": {"foo": document.content["foo"]}, + "content": document.content, } @@ -76,7 +76,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public(): "accesses": [], "title": document.title, "is_public": True, - "content": {"foo": document.content["foo"]}, + "content": document.content, } @@ -140,7 +140,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): assert response.json() == { "id": str(document.id), "title": document.title, - "content": {"foo": document.content["foo"]}, + "content": document.content, "abilities": document.get_abilities(user), "is_public": document.is_public, } @@ -255,7 +255,7 @@ def test_api_documents_retrieve_authenticated_related_team_members( assert response.json() == { "id": str(document.id), "title": document.title, - "content": {"foo": document.content["foo"]}, + "content": document.content, "abilities": document.get_abilities(user), "is_public": False, } @@ -353,7 +353,7 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( assert response.json() == { "id": str(document.id), "title": document.title, - "content": {"foo": document.content["foo"]}, + "content": document.content, "abilities": document.get_abilities(user), "is_public": False, } @@ -455,7 +455,7 @@ def test_api_documents_retrieve_authenticated_related_team_owners( assert response.json() == { "id": str(document.id), "title": document.title, - "content": {"foo": document.content["foo"]}, + "content": document.content, "abilities": document.get_abilities(user), "is_public": False, } diff --git a/src/backend/core/tests/test_api_document_versions.py b/src/backend/core/tests/test_api_document_versions.py index de81b572d..12d9b61bc 100644 --- a/src/backend/core/tests/test_api_document_versions.py +++ b/src/backend/core/tests/test_api_document_versions.py @@ -128,7 +128,7 @@ def test_api_document_versions_list_authenticated_related(via, mock_user_get_tea assert len(content["versions"]) == 0 # Add a new version to the document - document.content = {"foo": "bar"} + document.content = "new content" document.save() response = client.get( @@ -243,7 +243,7 @@ def test_api_document_versions_retrieve_authenticated_related(via, mock_user_get # Create a new version should make it available to the user time.sleep(1) # minio stores datetimes with the precision of a second - document.content = {"foo": "bar"} + document.content = "new content" document.save() version_id = document.get_versions_slice()["versions"][0]["version_id"] @@ -253,7 +253,7 @@ def test_api_document_versions_retrieve_authenticated_related(via, mock_user_get ) assert response.status_code == 200 - assert response.json()["content"] == {"foo": "bar"} + assert response.json()["content"] == "new content" def test_api_document_versions_create_anonymous(): @@ -459,7 +459,7 @@ def test_api_document_versions_delete_member(via, mock_user_get_teams): # Create a new version should make it available to the user time.sleep(1) # minio stores datetimes with the precision of a second - document.content = {"foo": "bar"} + document.content = "new content" document.save() versions = document.get_versions_slice()["versions"] @@ -503,7 +503,7 @@ def test_api_document_versions_delete_administrator_or_owner(via, mock_user_get_ # Create a new version should make it available to the user time.sleep(1) # minio stores datetimes with the precision of a second - document.content = {"foo": "bar"} + document.content = "new content" document.save() versions = document.get_versions_slice()["versions"] diff --git a/src/backend/core/tests/test_models_documents.py b/src/backend/core/tests/test_models_documents.py index 467b25210..b747dd796 100644 --- a/src/backend/core/tests/test_models_documents.py +++ b/src/backend/core/tests/test_models_documents.py @@ -196,7 +196,7 @@ def test_models_documents_get_versions_slice(settings): # Create a document with 7 versions document = factories.DocumentFactory() for i in range(6): - document.content = {"foo": f"bar{i:d}"} + document.content = f"bar{i:d}" document.save() # Add a version not related to the first document @@ -246,7 +246,7 @@ def test_models_documents_version_duplicate(): assert len(response["Versions"]) == 1 # Save modified content - document.content = {"foo": "spam"} + document.content = "new content" document.save() response = default_storage.connection.meta.client.list_object_versions(