From 390a615f488b138fd810a82279c5bd7558506123 Mon Sep 17 00:00:00 2001 From: Manuel Raynaud Date: Mon, 6 Oct 2025 08:38:40 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(backend)=20expose=20deleted=5Fat=20in?= =?UTF-8?q?formation=20in=20serializer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The front needs to know when a document has been deleted. We expose the deleted_at property on a document object, --- src/backend/core/api/serializers.py | 9 +++++ src/backend/core/api/viewsets.py | 2 +- .../test_api_documents_children_list.py | 14 ++++++++ .../test_api_documents_descendants.py | 21 +++++++++++ .../test_api_documents_favorite_list.py | 1 + .../documents/test_api_documents_list.py | 1 + .../documents/test_api_documents_retrieve.py | 9 +++++ .../documents/test_api_documents_trashbin.py | 3 +- .../documents/test_api_documents_tree.py | 35 +++++++++++++++++++ 9 files changed, 93 insertions(+), 2 deletions(-) diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index fe94cd5f..6c09cf18 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -90,6 +90,7 @@ class ListDocumentSerializer(serializers.ModelSerializer): nb_accesses_direct = serializers.IntegerField(read_only=True) user_role = serializers.SerializerMethodField(read_only=True) abilities = serializers.SerializerMethodField(read_only=True) + deleted_at = serializers.SerializerMethodField(read_only=True) class Meta: model = models.Document @@ -102,6 +103,7 @@ class ListDocumentSerializer(serializers.ModelSerializer): "computed_link_role", "created_at", "creator", + "deleted_at", "depth", "excerpt", "is_favorite", @@ -124,6 +126,7 @@ class ListDocumentSerializer(serializers.ModelSerializer): "computed_link_role", "created_at", "creator", + "deleted_at", "depth", "excerpt", "is_favorite", @@ -165,6 +168,10 @@ class ListDocumentSerializer(serializers.ModelSerializer): request = self.context.get("request") return instance.get_role(request.user) if request else None + def get_deleted_at(self, instance): + """Return the deleted_at of the current document.""" + return instance.ancestors_deleted_at + class DocumentLightSerializer(serializers.ModelSerializer): """Minial document serializer for nesting in document accesses.""" @@ -193,6 +200,7 @@ class DocumentSerializer(ListDocumentSerializer): "content", "created_at", "creator", + "deleted_at", "depth", "excerpt", "is_favorite", @@ -216,6 +224,7 @@ class DocumentSerializer(ListDocumentSerializer): "computed_link_role", "created_at", "creator", + "deleted_at", "depth", "is_favorite", "link_role", diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index 3897fa1f..1455f216 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -2157,7 +2157,7 @@ class ConfigView(drf.views.APIView): "LANGUAGES", "LANGUAGE_CODE", "SENTRY_DSN", - "TRASHBIN_CUTOFF_DAYS" + "TRASHBIN_CUTOFF_DAYS", ] dict_settings = {} for setting in array_settings: diff --git a/src/backend/core/tests/documents/test_api_documents_children_list.py b/src/backend/core/tests/documents/test_api_documents_children_list.py index 19bcfd19..e9a5cff3 100644 --- a/src/backend/core/tests/documents/test_api_documents_children_list.py +++ b/src/backend/core/tests/documents/test_api_documents_children_list.py @@ -41,6 +41,7 @@ def test_api_documents_children_list_anonymous_public_standalone( "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -63,6 +64,7 @@ def test_api_documents_children_list_anonymous_public_standalone( "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -115,6 +117,7 @@ def test_api_documents_children_list_anonymous_public_parent(django_assert_num_q "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -137,6 +140,7 @@ def test_api_documents_children_list_anonymous_public_parent(django_assert_num_q "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -208,6 +212,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -230,6 +235,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -287,6 +293,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -309,6 +316,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -393,6 +401,7 @@ def test_api_documents_children_list_authenticated_related_direct( "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -415,6 +424,7 @@ def test_api_documents_children_list_authenticated_related_direct( "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -475,6 +485,7 @@ def test_api_documents_children_list_authenticated_related_parent( "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -497,6 +508,7 @@ def test_api_documents_children_list_authenticated_related_parent( "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -609,6 +621,7 @@ def test_api_documents_children_list_authenticated_related_team_members( "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -631,6 +644,7 @@ def test_api_documents_children_list_authenticated_related_team_members( "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), diff --git a/src/backend/core/tests/documents/test_api_documents_descendants.py b/src/backend/core/tests/documents/test_api_documents_descendants.py index bd2785a7..f320b070 100644 --- a/src/backend/core/tests/documents/test_api_documents_descendants.py +++ b/src/backend/core/tests/documents/test_api_documents_descendants.py @@ -38,6 +38,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone(): "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -62,6 +63,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone(): "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 3, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -84,6 +86,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone(): "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -135,6 +138,7 @@ def test_api_documents_descendants_list_anonymous_public_parent(): "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -157,6 +161,7 @@ def test_api_documents_descendants_list_anonymous_public_parent(): "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 5, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -179,6 +184,7 @@ def test_api_documents_descendants_list_anonymous_public_parent(): "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -251,6 +257,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -273,6 +280,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 3, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -295,6 +303,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -352,6 +361,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -374,6 +384,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 5, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -396,6 +407,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -474,6 +486,7 @@ def test_api_documents_descendants_list_authenticated_related_direct(): "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -496,6 +509,7 @@ def test_api_documents_descendants_list_authenticated_related_direct(): "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 3, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -518,6 +532,7 @@ def test_api_documents_descendants_list_authenticated_related_direct(): "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), @@ -576,6 +591,7 @@ def test_api_documents_descendants_list_authenticated_related_parent(): "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child1.excerpt, "id": str(child1.id), @@ -598,6 +614,7 @@ def test_api_documents_descendants_list_authenticated_related_parent(): "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 5, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -620,6 +637,7 @@ def test_api_documents_descendants_list_authenticated_related_parent(): "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 4, "excerpt": child2.excerpt, "id": str(child2.id), @@ -724,6 +742,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members( "computed_link_role": child1.computed_link_role, "created_at": child1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child1.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child1.excerpt, "id": str(child1.id), @@ -746,6 +765,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members( "computed_link_role": grand_child.computed_link_role, "created_at": grand_child.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_child.creator.id), + "deleted_at": None, "depth": 3, "excerpt": grand_child.excerpt, "id": str(grand_child.id), @@ -768,6 +788,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members( "computed_link_role": child2.computed_link_role, "created_at": child2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(child2.creator.id), + "deleted_at": None, "depth": 2, "excerpt": child2.excerpt, "id": str(child2.id), diff --git a/src/backend/core/tests/documents/test_api_documents_favorite_list.py b/src/backend/core/tests/documents/test_api_documents_favorite_list.py index 3ac9170a..f93e95e0 100644 --- a/src/backend/core/tests/documents/test_api_documents_favorite_list.py +++ b/src/backend/core/tests/documents/test_api_documents_favorite_list.py @@ -65,6 +65,7 @@ def test_api_document_favorite_list_authenticated_with_favorite(): "computed_link_role": document.computed_link_role, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "content": document.content, "depth": document.depth, "excerpt": document.excerpt, 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 1fe23594..bb422a0c 100644 --- a/src/backend/core/tests/documents/test_api_documents_list.py +++ b/src/backend/core/tests/documents/test_api_documents_list.py @@ -69,6 +69,7 @@ def test_api_documents_list_format(): "computed_link_role": document.computed_link_role, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": True, 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 d1f8e1f0..fa8b1e2e 100644 --- a/src/backend/core/tests/documents/test_api_documents_retrieve.py +++ b/src/backend/core/tests/documents/test_api_documents_retrieve.py @@ -70,6 +70,7 @@ def test_api_documents_retrieve_anonymous_public_standalone(): "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": False, @@ -144,6 +145,7 @@ def test_api_documents_retrieve_anonymous_public_parent(): "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 3, "excerpt": document.excerpt, "is_favorite": False, @@ -252,6 +254,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, + "deleted_at": None, "excerpt": document.excerpt, "is_favorite": False, "link_reach": reach, @@ -333,6 +336,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, + "deleted_at": None, "excerpt": document.excerpt, "is_favorite": False, "link_reach": document.link_reach, @@ -446,6 +450,7 @@ def test_api_documents_retrieve_authenticated_related_direct(): "content": document.content, "creator": str(document.creator.id), "created_at": document.created_at.isoformat().replace("+00:00", "Z"), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": False, @@ -528,6 +533,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, + "deleted_at": None, "excerpt": document.excerpt, "is_favorite": False, "link_reach": "restricted", @@ -683,6 +689,7 @@ def test_api_documents_retrieve_authenticated_related_team_members( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": False, @@ -749,6 +756,7 @@ def test_api_documents_retrieve_authenticated_related_team_administrators( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": False, @@ -815,6 +823,7 @@ def test_api_documents_retrieve_authenticated_related_team_owners( "content": document.content, "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), + "deleted_at": None, "depth": 1, "excerpt": document.excerpt, "is_favorite": False, diff --git a/src/backend/core/tests/documents/test_api_documents_trashbin.py b/src/backend/core/tests/documents/test_api_documents_trashbin.py index 28ea6a01..0d82602b 100644 --- a/src/backend/core/tests/documents/test_api_documents_trashbin.py +++ b/src/backend/core/tests/documents/test_api_documents_trashbin.py @@ -48,11 +48,11 @@ def test_api_documents_trashbin_format(): other_users = factories.UserFactory.create_batch(3) document = factories.DocumentFactory( - deleted_at=timezone.now(), users=factories.UserFactory.create_batch(2), favorited_by=[user, *other_users], link_traces=other_users, ) + document.soft_delete() factories.UserDocumentAccessFactory(document=document, user=user, role="owner") response = client.get("/api/v1.0/documents/trashbin/") @@ -113,6 +113,7 @@ def test_api_documents_trashbin_format(): "creator": str(document.creator.id), "depth": 1, "excerpt": document.excerpt, + "deleted_at": document.ancestors_deleted_at.isoformat().replace("+00:00", "Z"), "link_reach": document.link_reach, "link_role": document.link_role, "nb_accesses_ancestors": 0, diff --git a/src/backend/core/tests/documents/test_api_documents_tree.py b/src/backend/core/tests/documents/test_api_documents_tree.py index 0124b507..bf0221e5 100644 --- a/src/backend/core/tests/documents/test_api_documents_tree.py +++ b/src/backend/core/tests/documents/test_api_documents_tree.py @@ -50,6 +50,7 @@ def test_api_documents_tree_list_anonymous_public_standalone(django_assert_num_q ), "creator": str(child.creator.id), "depth": 3, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -73,6 +74,7 @@ def test_api_documents_tree_list_anonymous_public_standalone(django_assert_num_q "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 2, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -96,6 +98,7 @@ def test_api_documents_tree_list_anonymous_public_standalone(django_assert_num_q "created_at": sibling1.created_at.isoformat().replace("+00:00", "Z"), "creator": str(sibling1.creator.id), "depth": 2, + "deleted_at": None, "excerpt": sibling1.excerpt, "id": str(sibling1.id), "is_favorite": False, @@ -119,6 +122,7 @@ def test_api_documents_tree_list_anonymous_public_standalone(django_assert_num_q "created_at": sibling2.created_at.isoformat().replace("+00:00", "Z"), "creator": str(sibling2.creator.id), "depth": 2, + "deleted_at": None, "excerpt": sibling2.excerpt, "id": str(sibling2.id), "is_favorite": False, @@ -138,6 +142,7 @@ def test_api_documents_tree_list_anonymous_public_standalone(django_assert_num_q "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 1, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -210,6 +215,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): ), "creator": str(child.creator.id), "depth": 5, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -233,6 +239,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): ), "creator": str(document.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -260,6 +267,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): ), "creator": str(document_sibling.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document_sibling.excerpt, "id": str(document_sibling.id), "is_favorite": False, @@ -281,6 +289,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -306,6 +315,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): ), "creator": str(parent_sibling.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent_sibling.excerpt, "id": str(parent_sibling.id), "is_favorite": False, @@ -327,6 +337,7 @@ def test_api_documents_tree_list_anonymous_public_parent(): "created_at": grand_parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_parent.creator.id), "depth": 2, + "deleted_at": None, "excerpt": grand_parent.excerpt, "id": str(grand_parent.id), "is_favorite": False, @@ -406,6 +417,7 @@ def test_api_documents_tree_list_authenticated_unrelated_public_or_authenticated ), "creator": str(child.creator.id), "depth": 3, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -427,6 +439,7 @@ def test_api_documents_tree_list_authenticated_unrelated_public_or_authenticated "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 2, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -450,6 +463,7 @@ def test_api_documents_tree_list_authenticated_unrelated_public_or_authenticated "created_at": sibling.created_at.isoformat().replace("+00:00", "Z"), "creator": str(sibling.creator.id), "depth": 2, + "deleted_at": None, "excerpt": sibling.excerpt, "id": str(sibling.id), "is_favorite": False, @@ -469,6 +483,7 @@ def test_api_documents_tree_list_authenticated_unrelated_public_or_authenticated "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 1, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -546,6 +561,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( ), "creator": str(child.creator.id), "depth": 5, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -569,6 +585,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( ), "creator": str(document.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -596,6 +613,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( ), "creator": str(document_sibling.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document_sibling.excerpt, "id": str(document_sibling.id), "is_favorite": False, @@ -617,6 +635,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -642,6 +661,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( ), "creator": str(parent_sibling.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent_sibling.excerpt, "id": str(parent_sibling.id), "is_favorite": False, @@ -663,6 +683,7 @@ def test_api_documents_tree_list_authenticated_public_or_authenticated_parent( "created_at": grand_parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_parent.creator.id), "depth": 2, + "deleted_at": None, "excerpt": grand_parent.excerpt, "id": str(grand_parent.id), "is_favorite": False, @@ -744,6 +765,7 @@ def test_api_documents_tree_list_authenticated_related_direct(): ), "creator": str(child.creator.id), "depth": 3, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -765,6 +787,7 @@ def test_api_documents_tree_list_authenticated_related_direct(): "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 2, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -788,6 +811,7 @@ def test_api_documents_tree_list_authenticated_related_direct(): "created_at": sibling.created_at.isoformat().replace("+00:00", "Z"), "creator": str(sibling.creator.id), "depth": 2, + "deleted_at": None, "excerpt": sibling.excerpt, "id": str(sibling.id), "is_favorite": False, @@ -807,6 +831,7 @@ def test_api_documents_tree_list_authenticated_related_direct(): "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 1, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -888,6 +913,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): ), "creator": str(child.creator.id), "depth": 5, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -911,6 +937,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): ), "creator": str(document.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -938,6 +965,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): ), "creator": str(document_sibling.creator.id), "depth": 4, + "deleted_at": None, "excerpt": document_sibling.excerpt, "id": str(document_sibling.id), "is_favorite": False, @@ -959,6 +987,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False, @@ -984,6 +1013,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): ), "creator": str(parent_sibling.creator.id), "depth": 3, + "deleted_at": None, "excerpt": parent_sibling.excerpt, "id": str(parent_sibling.id), "is_favorite": False, @@ -1005,6 +1035,7 @@ def test_api_documents_tree_list_authenticated_related_parent(): "created_at": grand_parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(grand_parent.creator.id), "depth": 2, + "deleted_at": None, "excerpt": grand_parent.excerpt, "id": str(grand_parent.id), "is_favorite": False, @@ -1094,6 +1125,7 @@ def test_api_documents_tree_list_authenticated_related_team_members( ), "creator": str(child.creator.id), "depth": 3, + "deleted_at": None, "excerpt": child.excerpt, "id": str(child.id), "is_favorite": False, @@ -1115,6 +1147,7 @@ def test_api_documents_tree_list_authenticated_related_team_members( "created_at": document.created_at.isoformat().replace("+00:00", "Z"), "creator": str(document.creator.id), "depth": 2, + "deleted_at": None, "excerpt": document.excerpt, "id": str(document.id), "is_favorite": False, @@ -1138,6 +1171,7 @@ def test_api_documents_tree_list_authenticated_related_team_members( "created_at": sibling.created_at.isoformat().replace("+00:00", "Z"), "creator": str(sibling.creator.id), "depth": 2, + "deleted_at": None, "excerpt": sibling.excerpt, "id": str(sibling.id), "is_favorite": False, @@ -1157,6 +1191,7 @@ def test_api_documents_tree_list_authenticated_related_team_members( "created_at": parent.created_at.isoformat().replace("+00:00", "Z"), "creator": str(parent.creator.id), "depth": 1, + "deleted_at": None, "excerpt": parent.excerpt, "id": str(parent.id), "is_favorite": False,