Skip to content

Commit e2d8e66

Browse files
committed
🐛(backend) create_for_owner: add accesses before saving doc content
We add the User Accesses before saving content so the user is sure to have access to the the first version when creating a doc through create_for_owner (fixes #2123)
1 parent f166e75 commit e2d8e66

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ and this project adheres to
4141
- 🐛(y-provider) destroy Y.Doc instances after each convert request #2129
4242
- 🐛(backend) remove deleted sub documents in favorite_list endpoint #2083
4343

44+
### Fixed
45+
46+
- 🐛(backend) create_for_owner: add accesses before saving doc content #2124
47+
4448
## [v4.8.3] - 2026-03-23
4549

4650
### Changed

src/backend/core/api/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,6 @@ def create(self, validated_data):
507507

508508
document = models.Document.add_root(
509509
title=validated_data["title"],
510-
content=document_content,
511510
creator=user,
512511
)
513512

@@ -526,6 +525,9 @@ def create(self, validated_data):
526525
role=models.RoleChoices.OWNER,
527526
)
528527

528+
document.content = document_content
529+
document.save()
530+
529531
self._send_email_notification(document, validated_data, email, language)
530532
return document
531533

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,43 @@ def test_api_documents_create_for_owner_with_converter_exception(
594594
assert response.json() == {"content": ["Could not convert content"]}
595595

596596

597+
@override_settings(SERVER_TO_SERVER_API_TOKENS=["DummyToken"])
598+
def test_api_documents_create_for_owner_access_before_content():
599+
"""
600+
Accesses must exist before content is saved to object storage so the owner
601+
has access to the very first version of the document.
602+
"""
603+
user = factories.UserFactory()
604+
accesses_at_save_time = []
605+
606+
original_save_content = Document.save_content
607+
608+
def capturing_save_content(self, content):
609+
accesses_at_save_time.extend(
610+
list(self.accesses.values_list("user__sub", "role"))
611+
)
612+
return original_save_content(self, content)
613+
614+
data = {
615+
"title": "My Document",
616+
"content": "Document content",
617+
"sub": str(user.sub),
618+
"email": user.email,
619+
}
620+
621+
with patch.object(Document, "save_content", capturing_save_content):
622+
response = APIClient().post(
623+
"/api/v1.0/documents/create-for-owner/",
624+
data,
625+
format="json",
626+
HTTP_AUTHORIZATION="Bearer DummyToken",
627+
)
628+
629+
assert response.status_code == 201
630+
# The owner access must already exist when save_content is called
631+
assert (str(user.sub), "owner") in accesses_at_save_time
632+
633+
597634
@override_settings(SERVER_TO_SERVER_API_TOKENS=["DummyToken"])
598635
def test_api_documents_create_for_owner_with_empty_content():
599636
"""The content should not be empty or a 400 error should be raised."""

0 commit comments

Comments
 (0)