From ab3cbd8b9a315911248227208630a020cedca08f Mon Sep 17 00:00:00 2001 From: Hasan Ramezani Date: Sat, 25 Jan 2020 15:56:30 +0100 Subject: Refs #27852 -- Fixed object deletion to show all protected related objects rather than just the first one. Thanks Anton Samarchyan for the initial patch. --- tests/delete/models.py | 4 ++++ tests/delete/tests.py | 19 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/delete/models.py b/tests/delete/models.py index 7a38ecc777..618b36bda9 100644 --- a/tests/delete/models.py +++ b/tests/delete/models.py @@ -68,6 +68,10 @@ class A(models.Model): o2o_setnull = models.ForeignKey(R, models.SET_NULL, null=True, related_name="o2o_nullable_set") +class B(models.Model): + protect = models.ForeignKey(R, models.PROTECT) + + def create_a(name): a = A(name=name) for name in ('auto', 'auto_nullable', 'setvalue', 'setnull', 'setdefault', diff --git a/tests/delete/tests.py b/tests/delete/tests.py index b93bdd5265..5046afba17 100644 --- a/tests/delete/tests.py +++ b/tests/delete/tests.py @@ -1,12 +1,14 @@ from math import ceil from django.db import IntegrityError, connection, models -from django.db.models.deletion import Collector, RestrictedError +from django.db.models.deletion import ( + Collector, ProtectedError, RestrictedError, +) from django.db.models.sql.constants import GET_ITERATOR_CHUNK_SIZE from django.test import TestCase, skipIfDBFeature, skipUnlessDBFeature from .models import ( - B1, B2, MR, A, Avatar, Base, Child, DeleteBottom, DeleteTop, GenericB1, + B1, B2, MR, A, Avatar, B, Base, Child, DeleteBottom, DeleteTop, GenericB1, GenericB2, GenericDeleteBottom, HiddenUser, HiddenUserProfile, M, M2MFrom, M2MTo, MRNull, Origin, P, Parent, R, RChild, RChildChild, Referrer, S, T, User, create_a, get_default_r, @@ -72,11 +74,22 @@ class OnDeleteTests(TestCase): a = create_a('protect') msg = ( "Cannot delete some instances of model 'R' because they are " - "referenced through a protected foreign key: 'A.protect'" + "referenced through protected foreign keys: 'A.protect'." ) with self.assertRaisesMessage(IntegrityError, msg): a.protect.delete() + def test_protect_multiple(self): + a = create_a('protect') + B.objects.create(protect=a.protect) + msg = ( + "Cannot delete some instances of model 'R' because they are " + "referenced through protected foreign keys: 'A.protect', " + "'B.protect'." + ) + with self.assertRaisesMessage(ProtectedError, msg): + a.protect.delete() + def test_do_nothing(self): # Testing DO_NOTHING is a bit harder: It would raise IntegrityError for a normal model, # so we connect to pre_delete and set the fk to a known value. -- cgit v1.3