app/django/dispatch/robust.py
author Pawel Solyga <Pawel.Solyga@gmail.com>
Fri, 12 Sep 2008 16:33:04 +0000
changeset 135 a7ccde9d9eed
parent 54 03e267d67478
permissions -rw-r--r--
Fixed one typo in response_helpers which caused is_admin context variable not to work correctly. Created new checkLinkNameForId function that checks if link_name is correct when creating new user and modifying existing one. This is now used for validation instead of doesLinkNameBelongToId in UserForm clean_link_name function. The previous validation function didn't allow to create new users and modify linkname of existing ones. Additionally I created new doesLinkNameExist helper function.

"""Module implementing error-catching version of send (sendRobust)"""
from django.dispatch.dispatcher import Any, Anonymous, liveReceivers, getAllReceivers
from django.dispatch.robustapply import robustApply

def sendRobust(
    signal=Any, 
    sender=Anonymous, 
    *arguments, **named
):
    """Send signal from sender to all connected receivers catching errors
    
    signal -- (hashable) signal value, see connect for details

    sender -- the sender of the signal
    
        if Any, only receivers registered for Any will receive
        the message.

        if Anonymous, only receivers registered to receive
        messages from Anonymous or Any will receive the message

        Otherwise can be any python object (normally one
        registered with a connect if you actually want
        something to occur).

    arguments -- positional arguments which will be passed to
        *all* receivers. Note that this may raise TypeErrors
        if the receivers do not allow the particular arguments.
        Note also that arguments are applied before named
        arguments, so they should be used with care.

    named -- named arguments which will be filtered according
        to the parameters of the receivers to only provide those
        acceptable to the receiver.

    Return a list of tuple pairs [(receiver, response), ... ]

    if any receiver raises an error (specifically any subclass of Exception),
    the error instance is returned as the result for that receiver.
    """
    # Call each receiver with whatever arguments it can accept.
    # Return a list of tuple pairs [(receiver, response), ... ].
    responses = []
    for receiver in liveReceivers(getAllReceivers(sender, signal)):
        try:
            response = robustApply(
                receiver,
                signal=signal,
                sender=sender,
                *arguments,
                **named
            )
        except Exception, err:
            responses.append((receiver, err))
        else:
            responses.append((receiver, response))
    return responses