Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #4879 -- Added 'created' arg to post_save signal. This is True …

…is a new object is created. Patch from George Vilches.

Fully backwards compatible, because signal receivers do not have to be able to accept all the arguments (thankyou, robust_apply()).


git-svn-id: http://code.djangoproject.com/svn/django/trunk@6269 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 1baae32e16e8eee5bc239bfea8674651b765a41f 1 parent 84e824f
Malcolm Tredinnick malcolmt authored
1  AUTHORS
View
@@ -296,6 +296,7 @@ answer newbie questions, and generally made Django that much better:
Amit Upadhyay
Geert Vanderkelen
viestards.lists@gmail.com
+ George Vilches <gav@thataddress.com>
Vlado <vlado@labath.org>
Milton Waddams
wam-djangobug@wamber.net
4 django/db/models/base.py
View
@@ -247,6 +247,7 @@ def save(self, raw=False):
qn(self._meta.order_with_respect_to.column))
cursor.execute(subsel, (getattr(self, self._meta.order_with_respect_to.attname),))
db_values.append(cursor.fetchone()[0])
+ record_exists = False
if db_values:
cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \
(qn(self._meta.db_table), ','.join(field_names),
@@ -261,7 +262,8 @@ def save(self, raw=False):
transaction.commit_unless_managed()
# Run any post-save hooks.
- dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self)
+ dispatcher.send(signal=signals.post_save, sender=self.__class__,
+ instance=self, created=(not record_exists))
save.alters_data = True
0  tests/modeltests/signals/__init__.py
View
No changes.
85 tests/modeltests/signals/models.py
View
@@ -0,0 +1,85 @@
+"""
+Testing signals before/after saving and deleting.
+"""
+
+from django.db import models
+from django.dispatch import dispatcher
+
+class Person(models.Model):
+ first_name = models.CharField(max_length=20)
+ last_name = models.CharField(max_length=20)
+
+ def __unicode__(self):
+ return u"%s %s" % (self.first_name, self.last_name)
+
+
+def pre_save_test(sender, instance, **kwargs):
+ print 'pre_save signal,', instance
+
+def post_save_test(sender, instance, **kwargs):
+ print 'post_save signal,', instance
+ if 'created' in kwargs:
+ if kwargs['created']:
+ print 'Is created'
+ else:
+ print 'Is updated'
+
+def pre_delete_test(sender, instance, **kwargs):
+ print 'pre_delete signal,', instance
+ print 'instance.id is not None: %s' % (instance.id != None)
+
+def post_delete_test(sender, instance, **kwargs):
+ print 'post_delete signal,', instance
+ print 'instance.id is None: %s' % (instance.id == None)
+
+__test__ = {'API_TESTS':"""
+>>> dispatcher.connect(pre_save_test, signal=models.signals.pre_save)
+>>> dispatcher.connect(post_save_test, signal=models.signals.post_save)
+>>> dispatcher.connect(pre_delete_test, signal=models.signals.pre_delete)
+>>> dispatcher.connect(post_delete_test, signal=models.signals.post_delete)
+
+>>> p1 = Person(first_name='John', last_name='Smith')
+>>> p1.save()
+pre_save signal, John Smith
+post_save signal, John Smith
+Is created
+
+>>> p1.first_name = 'Tom'
+>>> p1.save()
+pre_save signal, Tom Smith
+post_save signal, Tom Smith
+Is updated
+
+>>> p1.delete()
+pre_delete signal, Tom Smith
+instance.id is not None: True
+post_delete signal, Tom Smith
+instance.id is None: True
+
+>>> p2 = Person(first_name='James', last_name='Jones')
+>>> p2.id = 99999
+>>> p2.save()
+pre_save signal, James Jones
+post_save signal, James Jones
+Is created
+
+>>> p2.id = 99998
+>>> p2.save()
+pre_save signal, James Jones
+post_save signal, James Jones
+Is created
+
+>>> p2.delete()
+pre_delete signal, James Jones
+instance.id is not None: True
+post_delete signal, James Jones
+instance.id is None: True
+
+>>> Person.objects.all()
+[<Person: James Jones>]
+
+>>> dispatcher.disconnect(post_delete_test, signal=models.signals.post_delete)
+>>> dispatcher.disconnect(pre_delete_test, signal=models.signals.pre_delete)
+>>> dispatcher.disconnect(post_save_test, signal=models.signals.post_save)
+>>> dispatcher.disconnect(pre_save_test, signal=models.signals.pre_save)
+"""}
Please sign in to comment.
Something went wrong with that request. Please try again.