mirror of
https://github.com/django/django.git
synced 2025-08-03 18:38:50 +00:00
Fixed #21391 -- Allow model signals to lazily reference their senders.
This commit is contained in:
parent
03bc0a8ac5
commit
eb38257e51
7 changed files with 197 additions and 15 deletions
|
@ -1,5 +1,6 @@
|
|||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models
|
||||
from django.db.models import signals
|
||||
from django.dispatch import receiver
|
||||
from django.test import TestCase
|
||||
|
@ -8,8 +9,7 @@ from django.utils import six
|
|||
from .models import Author, Book, Car, Person
|
||||
|
||||
|
||||
class SignalTests(TestCase):
|
||||
|
||||
class BaseSignalTest(TestCase):
|
||||
def setUp(self):
|
||||
# Save up the number of connected signals so that we can check at the
|
||||
# end that all the signals we register get properly unregistered (#9989)
|
||||
|
@ -30,6 +30,8 @@ class SignalTests(TestCase):
|
|||
)
|
||||
self.assertEqual(self.pre_signals, post_signals)
|
||||
|
||||
|
||||
class SignalTests(BaseSignalTest):
|
||||
def test_save_signals(self):
|
||||
data = []
|
||||
|
||||
|
@ -239,3 +241,48 @@ class SignalTests(TestCase):
|
|||
self.assertTrue(a._run)
|
||||
self.assertTrue(b._run)
|
||||
self.assertEqual(signals.post_save.receivers, [])
|
||||
|
||||
|
||||
class LazyModelRefTest(BaseSignalTest):
|
||||
def setUp(self):
|
||||
super(LazyModelRefTest, self).setUp()
|
||||
self.received = []
|
||||
|
||||
def receiver(self, **kwargs):
|
||||
self.received.append(kwargs)
|
||||
|
||||
def test_invalid_sender_model_name(self):
|
||||
with self.assertRaisesMessage(ValueError,
|
||||
"Specified sender must either be a model or a "
|
||||
"model name of the 'app_label.ModelName' form."):
|
||||
signals.post_init.connect(self.receiver, sender='invalid')
|
||||
|
||||
def test_already_loaded_model(self):
|
||||
signals.post_init.connect(
|
||||
self.receiver, sender='signals.Book', weak=False
|
||||
)
|
||||
try:
|
||||
instance = Book()
|
||||
self.assertEqual(self.received, [{
|
||||
'signal': signals.post_init,
|
||||
'sender': Book,
|
||||
'instance': instance
|
||||
}])
|
||||
finally:
|
||||
signals.post_init.disconnect(self.receiver, sender=Book)
|
||||
|
||||
def test_not_loaded_model(self):
|
||||
signals.post_init.connect(
|
||||
self.receiver, sender='signals.Created', weak=False
|
||||
)
|
||||
|
||||
try:
|
||||
class Created(models.Model):
|
||||
pass
|
||||
|
||||
instance = Created()
|
||||
self.assertEqual(self.received, [{
|
||||
'signal': signals.post_init, 'sender': Created, 'instance': instance
|
||||
}])
|
||||
finally:
|
||||
signals.post_init.disconnect(self.receiver, sender=Created)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue