Skip to content

Commit 20e6501

Browse files
committed
🐛(back) duplicating a child should not create accesses
Children does not have accesses created for now, they inherit from their parent for now. We have to ignore access creation while owrk on the children accesses has not been made.
1 parent bced8d8 commit 20e6501

File tree

2 files changed

+65
-23
lines changed

2 files changed

+65
-23
lines changed

src/backend/core/api/viewsets.py

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -948,33 +948,34 @@ def duplicate(self, request, *args, **kwargs):
948948
**link_kwargs,
949949
)
950950

951-
# Always add the logged-in user as OWNER
952-
accesses_to_create = [
953-
models.DocumentAccess(
954-
document=duplicated_document,
955-
user=request.user,
956-
role=models.RoleChoices.OWNER,
957-
)
958-
]
959-
960-
# If accesses should be duplicated, add other users' accesses as per original document
961-
if with_accesses and is_owner_or_admin:
962-
original_accesses = models.DocumentAccess.objects.filter(
963-
document=document
964-
).exclude(user=request.user)
965-
966-
accesses_to_create.extend(
951+
# Always add the logged-in user as OWNER for root documents
952+
if document.is_root():
953+
accesses_to_create = [
967954
models.DocumentAccess(
968955
document=duplicated_document,
969-
user_id=access.user_id,
970-
team=access.team,
971-
role=access.role,
956+
user=request.user,
957+
role=models.RoleChoices.OWNER,
958+
)
959+
]
960+
961+
# If accesses should be duplicated, add other users' accesses as per original document
962+
if with_accesses and is_owner_or_admin:
963+
original_accesses = models.DocumentAccess.objects.filter(
964+
document=document
965+
).exclude(user=request.user)
966+
967+
accesses_to_create.extend(
968+
models.DocumentAccess(
969+
document=duplicated_document,
970+
user_id=access.user_id,
971+
team=access.team,
972+
role=access.role,
973+
)
974+
for access in original_accesses
972975
)
973-
for access in original_accesses
974-
)
975976

976-
# Bulk create all the duplicated accesses
977-
models.DocumentAccess.objects.bulk_create(accesses_to_create)
977+
# Bulk create all the duplicated accesses
978+
models.DocumentAccess.objects.bulk_create(accesses_to_create)
978979

979980
return drf_response.Response(
980981
{"id": str(duplicated_document.id)}, status=status.HTTP_201_CREATED

src/backend/core/tests/documents/test_api_documents_duplicate.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,3 +252,44 @@ def test_api_documents_duplicate_with_accesses_non_admin(role):
252252
duplicated_accesses = duplicated_document.accesses
253253
assert duplicated_accesses.count() == 1
254254
assert duplicated_accesses.get(user=user).role == "owner"
255+
256+
257+
@pytest.mark.parametrize("role", ["editor", "reader"])
258+
def test_api_documents_duplicate_non_root_document(role):
259+
"""
260+
Non-root documents can be duplicated but without accesses.
261+
"""
262+
user = factories.UserFactory()
263+
client = APIClient()
264+
client.force_login(user)
265+
266+
document = factories.DocumentFactory(users=[(user, "owner")])
267+
child = factories.DocumentFactory(
268+
parent=document, users=[(user, role)], title="document with accesses"
269+
)
270+
271+
assert child.accesses.count() == 1
272+
273+
# Duplicate the document via the API endpoint requesting to duplicate accesses
274+
response = client.post(
275+
f"/api/v1.0/documents/{child.id!s}/duplicate/",
276+
{"with_accesses": True},
277+
format="json",
278+
)
279+
280+
assert response.status_code == 201
281+
282+
duplicated_document = models.Document.objects.get(id=response.json()["id"])
283+
assert duplicated_document.title == "Copy of document with accesses"
284+
assert duplicated_document.content == child.content
285+
assert duplicated_document.link_reach == child.link_reach
286+
assert duplicated_document.link_role == child.link_role
287+
assert duplicated_document.creator == user
288+
assert duplicated_document.duplicated_from == child
289+
assert duplicated_document.attachments == []
290+
291+
# No access should be created for non root documents
292+
duplicated_accesses = duplicated_document.accesses
293+
assert duplicated_accesses.count() == 0
294+
assert duplicated_document.is_sibling_of(child)
295+
assert duplicated_document.is_child_of(document)

0 commit comments

Comments
 (0)