Skip to content

✨(frontend) Can mask a document from the list view #1233

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ and this project adheres to
- ✨(frontend) subdocs can manage link reach #1190
- ✨(frontend) add duplicate action to doc tree #1175
- ✨(frontend) add multi columns support for editor #1219
- ✨(frontend) Can mask a document from the list view #1233

### Changed

Expand Down
4 changes: 4 additions & 0 deletions src/backend/core/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ class ListDocumentSerializer(serializers.ModelSerializer):
"""Serialize documents with limited fields for display in lists."""

is_favorite = serializers.BooleanField(read_only=True)
is_masked = serializers.BooleanField(read_only=True)
nb_accesses_ancestors = serializers.IntegerField(read_only=True)
nb_accesses_direct = serializers.IntegerField(read_only=True)
user_role = serializers.SerializerMethodField(read_only=True)
Expand All @@ -85,6 +86,7 @@ class Meta:
"depth",
"excerpt",
"is_favorite",
"is_masked",
"link_role",
"link_reach",
"nb_accesses_ancestors",
Expand All @@ -107,6 +109,7 @@ class Meta:
"depth",
"excerpt",
"is_favorite",
"is_masked",
"link_role",
"link_reach",
"nb_accesses_ancestors",
Expand Down Expand Up @@ -176,6 +179,7 @@ class Meta:
"depth",
"excerpt",
"is_favorite",
"is_masked",
"link_role",
"link_reach",
"nb_accesses_ancestors",
Expand Down
4 changes: 3 additions & 1 deletion src/backend/core/api/viewsets.py
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
user = self.request.user
queryset = queryset.annotate_is_favorite(user)
queryset = queryset.annotate_is_masked(user)
queryset = queryset.annotate_user_roles(user)
return queryset

Expand Down Expand Up @@ -453,8 +454,9 @@ def list(self, request, *args, **kwargs):
)
queryset = queryset.filter(path__in=root_paths)

# Annotate favorite status and filter if applicable as late as possible
# Annotate favorite and masked status and filter if applicable as late as possible
queryset = queryset.annotate_is_favorite(user)
queryset = queryset.annotate_is_masked(user)
for field in ["is_favorite", "is_masked"]:
queryset = filterset.filters[field].filter(queryset, filter_data[field])

Expand Down
12 changes: 12 additions & 0 deletions src/backend/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,18 @@ def annotate_is_favorite(self, user):

return self.annotate(is_favorite=models.Value(False))

def annotate_is_masked(self, user):
"""
Annotate document queryset with the masked status for the current user.
"""
if user.is_authenticated:
masked_exists_subquery = LinkTrace.objects.filter(
document_id=models.OuterRef("pk"), user=user, is_masked=True
)
return self.annotate(is_masked=models.Exists(masked_exists_subquery))

return self.annotate(is_masked=models.Value(False))

def annotate_user_roles(self, user):
"""
Annotate document queryset with the roles of the current user
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ def test_api_documents_children_list_anonymous_public_standalone(
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -67,6 +68,7 @@ def test_api_documents_children_list_anonymous_public_standalone(
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -119,6 +121,7 @@ def test_api_documents_children_list_anonymous_public_parent(django_assert_num_q
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -141,6 +144,7 @@ def test_api_documents_children_list_anonymous_public_parent(django_assert_num_q
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -212,6 +216,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -234,6 +239,7 @@ def test_api_documents_children_list_authenticated_unrelated_public_or_authentic
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -291,6 +297,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -313,6 +320,7 @@ def test_api_documents_children_list_authenticated_public_or_authenticated_paren
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -397,6 +405,7 @@ def test_api_documents_children_list_authenticated_related_direct(
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -419,6 +428,7 @@ def test_api_documents_children_list_authenticated_related_direct(
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -479,6 +489,7 @@ def test_api_documents_children_list_authenticated_related_parent(
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -501,6 +512,7 @@ def test_api_documents_children_list_authenticated_related_parent(
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -613,6 +625,7 @@ def test_api_documents_children_list_authenticated_related_team_members(
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 0,
Expand All @@ -635,6 +648,7 @@ def test_api_documents_children_list_authenticated_related_team_members(
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down
21 changes: 21 additions & 0 deletions src/backend/core/tests/documents/test_api_documents_descendants.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone():
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -66,6 +67,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone():
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -88,6 +90,7 @@ def test_api_documents_descendants_list_anonymous_public_standalone():
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -139,6 +142,7 @@ def test_api_documents_descendants_list_anonymous_public_parent():
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -161,6 +165,7 @@ def test_api_documents_descendants_list_anonymous_public_parent():
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -183,6 +188,7 @@ def test_api_documents_descendants_list_anonymous_public_parent():
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -255,6 +261,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -277,6 +284,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -299,6 +307,7 @@ def test_api_documents_descendants_list_authenticated_unrelated_public_or_authen
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -356,6 +365,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -378,6 +388,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -400,6 +411,7 @@ def test_api_documents_descendants_list_authenticated_public_or_authenticated_pa
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -478,6 +490,7 @@ def test_api_documents_descendants_list_authenticated_related_direct():
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -500,6 +513,7 @@ def test_api_documents_descendants_list_authenticated_related_direct():
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -522,6 +536,7 @@ def test_api_documents_descendants_list_authenticated_related_direct():
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -580,6 +595,7 @@ def test_api_documents_descendants_list_authenticated_related_parent():
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -602,6 +618,7 @@ def test_api_documents_descendants_list_authenticated_related_parent():
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -624,6 +641,7 @@ def test_api_documents_descendants_list_authenticated_related_parent():
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down Expand Up @@ -728,6 +746,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members(
"excerpt": child1.excerpt,
"id": str(child1.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child1.link_reach,
"link_role": child1.link_role,
"numchild": 1,
Expand All @@ -750,6 +769,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members(
"excerpt": grand_child.excerpt,
"id": str(grand_child.id),
"is_favorite": False,
"is_masked": False,
"link_reach": grand_child.link_reach,
"link_role": grand_child.link_role,
"numchild": 0,
Expand All @@ -772,6 +792,7 @@ def test_api_documents_descendants_list_authenticated_related_team_members(
"excerpt": child2.excerpt,
"id": str(child2.id),
"is_favorite": False,
"is_masked": False,
"link_reach": child2.link_reach,
"link_role": child2.link_role,
"numchild": 0,
Expand Down
4 changes: 4 additions & 0 deletions src/backend/core/tests/documents/test_api_documents_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ def test_api_documents_list_format():
"depth": 1,
"excerpt": document.excerpt,
"is_favorite": True,
"is_masked": False,
"link_reach": document.link_reach,
"link_role": document.link_role,
"nb_accesses_ancestors": 3,
Expand Down Expand Up @@ -408,6 +409,7 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries
assert len(results) == 5

assert all(result["is_favorite"] is False for result in results)
assert all(result["is_masked"] is False for result in results)

# Mark documents as favorite and check results again
for document in special_documents:
Expand All @@ -427,3 +429,5 @@ def test_api_documents_list_favorites_no_extra_queries(django_assert_num_queries
assert result["is_favorite"] is True
else:
assert result["is_favorite"] is False
# All documents should be unmasked in this test
assert result["is_masked"] is False
Loading
Loading