🐛(backend) Forbid restoring a non-deleted document

Catch RuntimeError raised by Document.restore() and translate it into a
DRF ValidationError so callers get a 400 instead of a 500, when trying
to restore a non-deleted document.
    
Signed-off-by: Mohamed El Amine BOUKERFA <boukerfa.ma@gmail.com>
This commit is contained in:
Mohamed El Amine BOUKERFA
2026-04-28 14:53:30 +00:00
committed by GitHub
parent ed663f2e1e
commit cfd1fd00da
3 changed files with 24 additions and 1 deletions
+1
View File
@@ -30,6 +30,7 @@ and this project adheres to
- 🛂(frontend) fix cannot manage member on small screen #2226
- 🐛(backend) load jwks url when OIDC_RS_PRIVATE_KEY_STR is set
- 🐛(backend) Prevent moving document to its own descendant or self #2208
- 🐛(backend) return 400 when restoring a non-deleted document #2225
### Removed
+4 -1
View File
@@ -996,7 +996,10 @@ class DocumentViewSet(
Restore a soft-deleted document if it was deleted less than x days ago.
"""
document = self.get_object()
document.restore()
try:
document.restore()
except RuntimeError as err:
raise drf.exceptions.ValidationError({"detail": str(err)}) from err
return drf_response.Response(
{"detail": "Document has been successfully restored."},
@@ -124,3 +124,22 @@ def test_api_documents_restore_authenticated_owner_expired():
assert response.status_code == 404
assert response.json() == {"detail": "Not found."}
def test_api_documents_restore_authenticated_owner_not_deleted():
"""Restoring a document that is not deleted should return a 400 error."""
user = factories.UserFactory()
client = APIClient()
client.force_login(user)
document = factories.DocumentFactory()
factories.UserDocumentAccessFactory(document=document, user=user, role="owner")
response = client.post(f"/api/v1.0/documents/{document.id!s}/restore/")
assert response.status_code == 400
assert response.json() == {"detail": "This document is not deleted."}
document.refresh_from_db()
assert document.deleted_at is None
assert document.ancestors_deleted_at is None