Skip to content

Commit 479323a

Browse files
Ash-Crowlunika
authored andcommitted
🐛(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 c1e104a commit 479323a

3 files changed

Lines changed: 45 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ ctrl/command/middle-mouse click #2170
6969
- 🐛(y-provider) destroy Y.Doc instances after each convert request #2129
7070
- 🐛(backend) remove deleted sub documents in favorite_list endpoint #2083
7171

72+
### Fixed
73+
74+
- 🐛(backend) create_for_owner: add accesses before saving doc content #2124
75+
7276
## [v4.8.3] - 2026-03-23
7377

7478
### Changed

src/backend/core/api/serializers.py

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

517517
document = models.Document.add_root(
518518
title=validated_data["title"],
519-
content=document_content,
520519
creator=user,
521520
)
522521

@@ -535,6 +534,9 @@ def create(self, validated_data):
535534
role=models.RoleChoices.OWNER,
536535
)
537536

537+
document.content = document_content
538+
document.save()
539+
538540
self._send_email_notification(document, validated_data, email, language)
539541
return document
540542

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,44 @@ 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+
@pytest.mark.usefixtures("mock_convert_md")
599+
def test_api_documents_create_for_owner_access_before_content():
600+
"""
601+
Accesses must exist before content is saved to object storage so the owner
602+
has access to the very first version of the document.
603+
"""
604+
user = factories.UserFactory()
605+
accesses_at_save_time = []
606+
607+
original_save_content = Document.save_content
608+
609+
def capturing_save_content(self, content):
610+
accesses_at_save_time.extend(
611+
list(self.accesses.values_list("user__sub", "role"))
612+
)
613+
return original_save_content(self, content)
614+
615+
data = {
616+
"title": "My Document",
617+
"content": "Document content",
618+
"sub": str(user.sub),
619+
"email": user.email,
620+
}
621+
622+
with patch.object(Document, "save_content", capturing_save_content):
623+
response = APIClient().post(
624+
"/api/v1.0/documents/create-for-owner/",
625+
data,
626+
format="json",
627+
HTTP_AUTHORIZATION="Bearer DummyToken",
628+
)
629+
630+
assert response.status_code == 201
631+
# The owner access must already exist when save_content is called
632+
assert (str(user.sub), "owner") in accesses_at_save_time
633+
634+
597635
@override_settings(SERVER_TO_SERVER_API_TOKENS=["DummyToken"])
598636
def test_api_documents_create_for_owner_with_empty_content():
599637
"""The content should not be empty or a 400 error should be raised."""

0 commit comments

Comments
 (0)