| 1 |
"""Module implementing error-catching version of send (sendRobust)""" |
|---|
| 2 |
from django.dispatch.dispatcher import Any, Anonymous, liveReceivers, getAllReceivers |
|---|
| 3 |
from django.dispatch.robustapply import robustApply |
|---|
| 4 |
|
|---|
| 5 |
def sendRobust( |
|---|
| 6 |
signal=Any, |
|---|
| 7 |
sender=Anonymous, |
|---|
| 8 |
*arguments, **named |
|---|
| 9 |
): |
|---|
| 10 |
"""Send signal from sender to all connected receivers catching errors |
|---|
| 11 |
|
|---|
| 12 |
signal -- (hashable) signal value, see connect for details |
|---|
| 13 |
|
|---|
| 14 |
sender -- the sender of the signal |
|---|
| 15 |
|
|---|
| 16 |
if Any, only receivers registered for Any will receive |
|---|
| 17 |
the message. |
|---|
| 18 |
|
|---|
| 19 |
if Anonymous, only receivers registered to receive |
|---|
| 20 |
messages from Anonymous or Any will receive the message |
|---|
| 21 |
|
|---|
| 22 |
Otherwise can be any python object (normally one |
|---|
| 23 |
registered with a connect if you actually want |
|---|
| 24 |
something to occur). |
|---|
| 25 |
|
|---|
| 26 |
arguments -- positional arguments which will be passed to |
|---|
| 27 |
*all* receivers. Note that this may raise TypeErrors |
|---|
| 28 |
if the receivers do not allow the particular arguments. |
|---|
| 29 |
Note also that arguments are applied before named |
|---|
| 30 |
arguments, so they should be used with care. |
|---|
| 31 |
|
|---|
| 32 |
named -- named arguments which will be filtered according |
|---|
| 33 |
to the parameters of the receivers to only provide those |
|---|
| 34 |
acceptable to the receiver. |
|---|
| 35 |
|
|---|
| 36 |
Return a list of tuple pairs [(receiver, response), ... ] |
|---|
| 37 |
|
|---|
| 38 |
if any receiver raises an error (specifically any subclass of Exception), |
|---|
| 39 |
the error instance is returned as the result for that receiver. |
|---|
| 40 |
""" |
|---|
| 41 |
# Call each receiver with whatever arguments it can accept. |
|---|
| 42 |
# Return a list of tuple pairs [(receiver, response), ... ]. |
|---|
| 43 |
responses = [] |
|---|
| 44 |
for receiver in liveReceivers(getAllReceivers(sender, signal)): |
|---|
| 45 |
try: |
|---|
| 46 |
response = robustApply( |
|---|
| 47 |
receiver, |
|---|
| 48 |
signal=signal, |
|---|
| 49 |
sender=sender, |
|---|
| 50 |
*arguments, |
|---|
| 51 |
**named |
|---|
| 52 |
) |
|---|
| 53 |
except Exception, err: |
|---|
| 54 |
responses.append((receiver, err)) |
|---|
| 55 |
else: |
|---|
| 56 |
responses.append((receiver, response)) |
|---|
| 57 |
return responses |
|---|