Login

Execute a signal once

Author:
johnnoone
Posted:
May 5, 2009
Language:
Python
Version:
1.0
Score:
3 (after 3 ratings)

Decorates signals for executing only one time

Exemple usage :

from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.contrib.auth.models import User

@one
def user_welcome(sender, instance, created, **kwargs):
    # Send a welcome email
    if created == True and isinstance(instance, User):
        instance.message_set.create(message=_(u"Ho, Welcome %s!" % instance))
        subject, from_email, to = 'Welcome !', '[email protected]', instance.email
        text_content = render_to_string('mail/welcome.html', { 'user': instance })
        msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
        msg.send()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from functools import wraps

def one(func=None):
    """decorates signals for executing only one time
    
    Exemple Usage --
    
    from django.core.mail import EmailMultiAlternatives
    from django.template.loader import render_to_string
    from django.contrib.auth.models import User
    
    @one
    def user_welcome(sender, instance, created, **kwargs):
        # Send a welcome email
        if created == True and isinstance(instance, User):
            instance.message_set.create(message=_(u"Ho, Welcome %s!" % instance))
            subject, from_email, to = 'Welcome !', '[email protected]', instance.email
            text_content = render_to_string('mail/welcome.html', { 'user': instance })
            msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
            msg.send()
    
    """
    
    E = '_exec_one_time'
    @wraps(func)
    def wrapper(*args, **kwargs):
        try:
            instance = kwargs['instance']
            e = getattr(instance, E, [])
            c = func.__name__
            if c not in e:
                e.append(c)
                setattr(instance, E, e)
                return func(*args, **kwargs)
        except:
            return func(*args, **kwargs)
    return wrapper

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 11 months, 2 weeks ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 3 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
  5. Help text hyperlinks by sa2812 1 year, 7 months ago

Comments

Please login first before commenting.