Django

Code

Ticket #4879: post_save_with_created_kw_r6184.patch

File post_save_with_created_kw_r6184.patch, 3.8 kB (added by George Vilches <gav@thataddress.com>, 1 year ago)

Post save patch + unit tests against r6184

  • django/db/models/base.py

    old new  
    245245                placeholders.append('(SELECT COUNT(*) FROM %s WHERE %s = %%s)' % \ 
    246246                    (qn(self._meta.db_table), qn(self._meta.order_with_respect_to.column))) 
    247247                db_values.append(getattr(self, self._meta.order_with_respect_to.attname)) 
     248            record_exists = False 
    248249            if db_values: 
    249250                cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \ 
    250251                    (qn(self._meta.db_table), ','.join(field_names), 
     
    259260        transaction.commit_unless_managed() 
    260261 
    261262        # Run any post-save hooks. 
    262         dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self
     263        dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self, created=(not record_exists)
    263264 
    264265    save.alters_data = True 
    265266 
  • tests/modeltests/signals/models.py

    old new  
     1""" 
     2Testing signals before/after saving and deleting. 
     3""" 
     4 
     5from django.db import models 
     6from django.dispatch import dispatcher 
     7 
     8class Person(models.Model): 
     9    first_name = models.CharField(max_length=20) 
     10    last_name = models.CharField(max_length=20) 
     11 
     12    def __unicode__(self): 
     13        return u"%s %s" % (self.first_name, self.last_name) 
     14 
     15 
     16def pre_save_test(sender, instance, **kwargs): 
     17    print 'pre_save signal,', instance 
     18 
     19def post_save_test(sender, instance, **kwargs): 
     20    print 'post_save signal,', instance 
     21    if 'created' in kwargs: 
     22        if kwargs['created']: 
     23            print 'Is created' 
     24        else: 
     25            print 'Is updated' 
     26 
     27def pre_delete_test(sender, instance, **kwargs): 
     28    print 'pre_delete signal,', instance 
     29    print 'instance.id is not None: %s' % (instance.id != None)   
     30 
     31def post_delete_test(sender, instance, **kwargs): 
     32    print 'post_delete signal,', instance 
     33    print 'instance.id is None: %s' % (instance.id == None)   
     34 
     35__test__ = {'API_TESTS':""" 
     36 
     37>>> dispatcher.connect(pre_save_test, signal=models.signals.pre_save) 
     38>>> dispatcher.connect(post_save_test, signal=models.signals.post_save) 
     39>>> dispatcher.connect(pre_delete_test, signal=models.signals.pre_delete) 
     40>>> dispatcher.connect(post_delete_test, signal=models.signals.post_delete) 
     41>>> p1 = Person(first_name='John', last_name='Smith') 
     42>>> p1.save() 
     43pre_save signal, John Smith 
     44post_save signal, John Smith 
     45Is created 
     46 
     47>>> p1.first_name = 'Tom' 
     48>>> p1.save() 
     49pre_save signal, Tom Smith 
     50post_save signal, Tom Smith 
     51Is updated 
     52 
     53>>> p1.delete() 
     54pre_delete signal, Tom Smith 
     55instance.id is not None: True 
     56post_delete signal, Tom Smith 
     57instance.id is None: True 
     58 
     59>>> p2 = Person(first_name='James', last_name='Jones') 
     60>>> p2.id = 99999 
     61>>> p2.save() 
     62pre_save signal, James Jones 
     63post_save signal, James Jones 
     64Is created 
     65 
     66>>> p2.id = 99998 
     67>>> p2.save() 
     68pre_save signal, James Jones 
     69post_save signal, James Jones 
     70Is created 
     71 
     72>>> p2.delete() 
     73pre_delete signal, James Jones 
     74instance.id is not None: True 
     75post_delete signal, James Jones 
     76instance.id is None: True 
     77 
     78>>> Person.objects.all() 
     79[<Person: James Jones>] 
     80 
     81>>> dispatcher.disconnect(post_delete_test, signal=models.signals.post_delete) 
     82>>> dispatcher.disconnect(pre_delete_test, signal=models.signals.pre_delete) 
     83>>> dispatcher.disconnect(post_save_test, signal=models.signals.post_save) 
     84>>> dispatcher.disconnect(pre_save_test, signal=models.signals.pre_save) 
     85"""}