diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index 0c2dd2c0..c6e3d640 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -7,8 +7,6 @@ from timezone_field.rest_framework import TimeZoneSerializerField from core import models -from .fields import JSONField - class UserSerializer(serializers.ModelSerializer): """Serialize users.""" @@ -136,7 +134,7 @@ class BaseResourceSerializer(serializers.ModelSerializer): 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 7ebf4dd2..1b5e16b0 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -344,7 +344,7 @@ class DocumentViewSet( 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 059e5f90..f17b61b2 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -35,7 +35,7 @@ class DocumentFactory(factory.django.DjangoModelFactory): 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 ad36b554..390ebee0 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -325,16 +325,15 @@ class Document(BaseModel): 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=""): @@ -349,7 +348,7 @@ class Document(BaseModel): 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 7d8eb51c..e995040e 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 de81b572..12d9b61b 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 467b2521..b747dd79 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(