segunda-feira, 9 de abril de 2012

Django signals

Versão simplificada do método signal.connect do Django, mas ela insere o receiver como primeiro elemento da lista, ao contrário do comportamento padrão que insere no final. Para essa função funcionar sempre, ela deve ser chamada apenas uma vez por tipo de signal, então a use apenas em casos muito especiais.

Código:



def connect_as_first_signal(signal, receiver, sender=None, dispatch_uid=None):
"Similar to signal.connect(receiver, sender=sender), but put the receiver as the first element in the list."
from django.dispatch.dispatcher import _make_id
if dispatch_uid:
lookup_key = (dispatch_uid, _make_id(sender))
else:
lookup_key = (_make_id(receiver), _make_id(sender))
signal.lock.acquire()
try:
for r_key, _ in signal.receivers:
if r_key == lookup_key:
break
else:
signal.receivers.insert(0, (lookup_key, receiver))
finally:
signal.lock.release()


Uso:


from django.db.models.signals import pre_save
connect_as_first_signal(pre_save, SUA_FUNCAO_DE_CALL_BACK, sender=SEU_SENDER, dispatch_uid=SEU_ID)

Nenhum comentário:

Postar um comentário