Skip to content
Snippets Groups Projects
Commit 744b2456 authored by Bastien Abadie's avatar Bastien Abadie
Browse files

Merge branch 'fix-corpus-deletion' into 'master'

Delete elements before types when removing a corpus

See merge request !488
parents 82613d89 a3bbb497
No related branches found
No related tags found
1 merge request!488Delete elements before types when removing a corpus
......@@ -44,6 +44,15 @@ class Corpus(models.Model):
def __str__(self):
return self.name
def delete(self):
"""
Override the normal deletion process to delete elements before deleting the corpus:
prevents a ProtectedError when element types are being deleted before elements.
"""
with transaction.atomic():
self.elements.all().delete()
super().delete()
def get_acl_rights(self, user):
'''
List Access rights on this corpus for this user
......
from django.contrib.auth.models import AnonymousUser
from django.db.models import Model, ProtectedError
from django.urls import reverse
from rest_framework import status
......@@ -342,3 +343,22 @@ class TestCorpus(FixtureAPITestCase):
def test_delete_requires_login(self):
response = self.client.delete(reverse('api:corpus-retrieve', kwargs={'pk': self.corpus_private.id}))
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
def test_delete_elements_first(self):
"""
Ensure corpus deletion deletes elements first to prevent a ProtectedError
"""
self.assertEqual(Corpus.objects.count(), 3)
self.assertEqual(Element.objects.count(), 19)
# Use Django's default deletion method and expect a ProtectedError
with self.assertRaises(ProtectedError):
Model.delete(self.corpus)
self.assertEqual(Corpus.objects.count(), 3)
self.assertEqual(Element.objects.count(), 19)
# Use the corpus deletion method and it works!
self.corpus.delete()
self.assertEqual(Corpus.objects.count(), 2)
self.assertEqual(Element.objects.count(), 0)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment