From 8117866ce75bfe1057914f810a5eefeecc22ad8b Mon Sep 17 00:00:00 2001 From: Samuel Paccoud - DINUM Date: Wed, 18 Dec 2024 11:37:01 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(backend)=20remove=20content?= =?UTF-8?q?=20from=20list=20serializer=20and=20introduce=20excerpt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Including the content field in the list view is not efficient as we need to query the object storage to retrieve it. We want to display an excerpt of the content on the list view so we should store it in database. We let the frontend compute it and save it for us in the new "excerpt" field because we are not supposed to have access to the content (E2EE feature coming) --- CHANGELOG.md | 5 ++++ src/backend/core/api/serializers.py | 4 +++- src/backend/core/factories.py | 1 + .../migrations/0015_add_document_excerpt.py | 23 +++++++++++++++++++ src/backend/core/models.py | 1 + .../test_api_documents_children_create.py | 1 - .../documents/test_api_documents_list.py | 2 +- .../documents/test_api_documents_retrieve.py | 9 ++++++++ 8 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 src/backend/core/migrations/0015_add_document_excerpt.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cd8268b..22168164 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to ## Added - ✨(backend) allow organizing documents in a tree structure #516 +- ✨(backend) add "excerpt" field to document list serializer #516 - ✨(backend) add github actions to manage Crowdin workflow #559 & #563 - 📈Integrate Posthog #540 - 🏷️(backend) add content-type to uploaded files #552 @@ -22,6 +23,10 @@ and this project adheres to - 💄(frontend) add abilities on doc row #581 - 💄(frontend) improve DocsGridItem responsive padding #582 +## Removed + +- 🔥(backend) remove "content" field from list serializer # 516 + ## [2.0.1] - 2025-01-17 ## Fixed diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index a63841bb..28cd4efa 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -152,11 +152,11 @@ class ListDocumentSerializer(BaseResourceSerializer): model = models.Document fields = [ "id", - "content", "abilities", "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", @@ -172,6 +172,7 @@ class ListDocumentSerializer(BaseResourceSerializer): "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", @@ -196,6 +197,7 @@ class DocumentSerializer(ListDocumentSerializer): "created_at", "creator", "depth", + "excerpt", "is_favorite", "link_role", "link_reach", diff --git a/src/backend/core/factories.py b/src/backend/core/factories.py index 5a77ad09..2a6ad53a 100644 --- a/src/backend/core/factories.py +++ b/src/backend/core/factories.py @@ -74,6 +74,7 @@ class DocumentFactory(factory.django.DjangoModelFactory): parent = ParentNodeFactory() title = factory.Sequence(lambda n: f"document{n}") + excerpt = factory.Sequence(lambda n: f"excerpt{n}") content = factory.Sequence(lambda n: f"content{n}") creator = factory.SubFactory(UserFactory) link_reach = factory.fuzzy.FuzzyChoice( diff --git a/src/backend/core/migrations/0015_add_document_excerpt.py b/src/backend/core/migrations/0015_add_document_excerpt.py new file mode 100644 index 00000000..916e4be2 --- /dev/null +++ b/src/backend/core/migrations/0015_add_document_excerpt.py @@ -0,0 +1,23 @@ +# Generated by Django 5.1.4 on 2024-12-18 08:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_set_path_on_existing_documents'), + ] + + operations = [ + migrations.AddField( + model_name='document', + name='excerpt', + field=models.TextField(blank=True, max_length=300, null=True, verbose_name='excerpt'), + ), + migrations.AlterField( + model_name='user', + name='language', + field=models.CharField(choices="(('en-us', 'English'), ('fr-fr', 'French'), ('de-de', 'German'))", default='en-us', help_text='The language in which the user wants to see the interface.', max_length=10, verbose_name='language'), + ), + ] diff --git a/src/backend/core/models.py b/src/backend/core/models.py index e4449596..ec75922b 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -358,6 +358,7 @@ class Document(MP_Node, BaseModel): """Pad document carrying the content.""" title = models.CharField(_("title"), max_length=255, null=True, blank=True) + excerpt = models.TextField(_("excerpt"), max_length=300, null=True, blank=True) link_reach = models.CharField( max_length=20, choices=LinkReachChoices.choices, diff --git a/src/backend/core/tests/documents/test_api_documents_children_create.py b/src/backend/core/tests/documents/test_api_documents_children_create.py index ffac8f2b..775b132a 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_create.py +++ b/src/backend/core/tests/documents/test_api_documents_children_create.py @@ -2,7 +2,6 @@ Tests for Documents API endpoint in impress's core app: create """ -import random from uuid import uuid4 import pytest diff --git a/src/backend/core/tests/documents/test_api_documents_list.py b/src/backend/core/tests/documents/test_api_documents_list.py index 8217dd44..ca2de1b1 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -59,11 +59,11 @@ def test_api_documents_list_format(): assert len(results) == 1 assert results[0] == { "id": str(document.id), - "content": document.content, "abilities": document.get_abilities(user), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": True, "link_reach": document.link_reach, "link_role": document.link_role, 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 f1315e93..239c9acb 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -47,6 +47,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "public", "link_role": document.link_role, @@ -99,6 +100,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -184,6 +186,7 @@ def test_api_documents_retrieve_authenticated_unrelated_public_or_authenticated( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": reach, "link_role": document.link_role, @@ -243,6 +246,7 @@ def test_api_documents_retrieve_authenticated_public_or_authenticated_parent(rea "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -350,6 +354,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, "link_role": document.link_role, @@ -409,6 +414,7 @@ def test_api_documents_retrieve_authenticated_related_parent(): "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "depth": 3, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -558,6 +564,7 @@ def test_api_documents_retrieve_authenticated_related_team_members( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -617,6 +624,7 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role, @@ -677,6 +685,7 @@ def test_api_documents_retrieve_authenticated_related_team_owners( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 1, + "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", "link_role": document.link_role,