Execute a signal once

 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 !', 'from@example.com', 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. Create multiple related objects at once by yaniv.haber 5 years ago
  2. Signal to notify new saved comments by arthurfurlan 4 years, 10 months ago
  3. PatchModelForm - A ModelForm subclass with the semantics of the PATCH HTTP method by gnrfan 1 year, 10 months ago
  4. Decorator to execute a method only once by atodorov-otb 4 months ago
  5. group_required decorator by msanders 4 years, 7 months ago

Comments

(Forgotten your password?)