models.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. """
  2. Testing signals before/after saving and deleting.
  3. """
  4. from django.db import models
  5. from django.dispatch import receiver
  6. class Person(models.Model):
  7. first_name = models.CharField(max_length=20)
  8. last_name = models.CharField(max_length=20)
  9. def __unicode__(self):
  10. return u"%s %s" % (self.first_name, self.last_name)
  11. class Car(models.Model):
  12. make = models.CharField(max_length=20)
  13. model = models.CharField(max_length=20)
  14. def __unicode__(self):
  15. return u"%s %s" % (self.make, self.model)
  16. def pre_save_test(signal, sender, instance, **kwargs):
  17. print 'pre_save signal,', instance
  18. if kwargs.get('raw'):
  19. print 'Is raw'
  20. def post_save_test(signal, sender, instance, **kwargs):
  21. print 'post_save signal,', instance
  22. if 'created' in kwargs:
  23. if kwargs['created']:
  24. print 'Is created'
  25. else:
  26. print 'Is updated'
  27. if kwargs.get('raw'):
  28. print 'Is raw'
  29. def pre_delete_test(signal, sender, instance, **kwargs):
  30. print 'pre_delete signal,', instance
  31. print 'instance.id is not None: %s' % (instance.id != None)
  32. # #8285: signals can be any callable
  33. class PostDeleteHandler(object):
  34. def __call__(self, signal, sender, instance, **kwargs):
  35. print 'post_delete signal,', instance
  36. print 'instance.id is None: %s' % (instance.id == None)
  37. post_delete_test = PostDeleteHandler()
  38. __test__ = {'API_TESTS':"""
  39. # Save up the number of connected signals so that we can check at the end
  40. # that all the signals we register get properly unregistered (#9989)
  41. >>> pre_signals = (len(models.signals.pre_save.receivers),
  42. ... len(models.signals.post_save.receivers),
  43. ... len(models.signals.pre_delete.receivers),
  44. ... len(models.signals.post_delete.receivers))
  45. >>> models.signals.pre_save.connect(pre_save_test)
  46. >>> models.signals.post_save.connect(post_save_test)
  47. >>> models.signals.pre_delete.connect(pre_delete_test)
  48. >>> models.signals.post_delete.connect(post_delete_test)
  49. # throw a decorator syntax receiver into the mix
  50. >>> @receiver(models.signals.pre_save)
  51. ... def pre_save_decorator_test(signal, sender, instance, **kwargs):
  52. ... print "pre_save signal decorator,", instance
  53. # throw a decorator syntax receiver into the mix
  54. >>> @receiver(models.signals.pre_save, sender=Car)
  55. ... def pre_save_decorator_sender_test(signal, sender, instance, **kwargs):
  56. ... print "pre_save signal decorator sender,", instance
  57. >>> p1 = Person(first_name='John', last_name='Smith')
  58. >>> p1.save()
  59. pre_save signal, John Smith
  60. pre_save signal decorator, John Smith
  61. post_save signal, John Smith
  62. Is created
  63. >>> p1.first_name = 'Tom'
  64. >>> p1.save()
  65. pre_save signal, Tom Smith
  66. pre_save signal decorator, Tom Smith
  67. post_save signal, Tom Smith
  68. Is updated
  69. # Car signal (sender defined)
  70. >>> c1 = Car(make="Volkswagon", model="Passat")
  71. >>> c1.save()
  72. pre_save signal, Volkswagon Passat
  73. pre_save signal decorator, Volkswagon Passat
  74. pre_save signal decorator sender, Volkswagon Passat
  75. post_save signal, Volkswagon Passat
  76. Is created
  77. # Calling an internal method purely so that we can trigger a "raw" save.
  78. >>> p1.save_base(raw=True)
  79. pre_save signal, Tom Smith
  80. Is raw
  81. pre_save signal decorator, Tom Smith
  82. post_save signal, Tom Smith
  83. Is updated
  84. Is raw
  85. >>> p1.delete()
  86. pre_delete signal, Tom Smith
  87. instance.id is not None: True
  88. post_delete signal, Tom Smith
  89. instance.id is None: False
  90. >>> p2 = Person(first_name='James', last_name='Jones')
  91. >>> p2.id = 99999
  92. >>> p2.save()
  93. pre_save signal, James Jones
  94. pre_save signal decorator, James Jones
  95. post_save signal, James Jones
  96. Is created
  97. >>> p2.id = 99998
  98. >>> p2.save()
  99. pre_save signal, James Jones
  100. pre_save signal decorator, James Jones
  101. post_save signal, James Jones
  102. Is created
  103. >>> p2.delete()
  104. pre_delete signal, James Jones
  105. instance.id is not None: True
  106. post_delete signal, James Jones
  107. instance.id is None: False
  108. >>> Person.objects.all()
  109. [<Person: James Jones>]
  110. >>> models.signals.post_delete.disconnect(post_delete_test)
  111. >>> models.signals.pre_delete.disconnect(pre_delete_test)
  112. >>> models.signals.post_save.disconnect(post_save_test)
  113. >>> models.signals.pre_save.disconnect(pre_save_test)
  114. >>> models.signals.pre_save.disconnect(pre_save_decorator_test)
  115. >>> models.signals.pre_save.disconnect(pre_save_decorator_sender_test, sender=Car)
  116. # Check that all our signals got disconnected properly.
  117. >>> post_signals = (len(models.signals.pre_save.receivers),
  118. ... len(models.signals.post_save.receivers),
  119. ... len(models.signals.pre_delete.receivers),
  120. ... len(models.signals.post_delete.receivers))
  121. >>> pre_signals == post_signals
  122. True
  123. """}