[pyar] DjangoPregunta! Al post_save signal de django no le creo nada :P

Emiliano Dalla Verde Marcozzi edvm en airtrack.com.ar
Mar Jul 26 16:59:22 ART 2011


Buenas querida lista!

Les comento, tengo la siguiente clase en mi models.py:

 class Incidencia(models.Model):

 asunto = models.CharField(max_length=100)

origen = models.ForeignKey(OrigenIncidencia)

asignado_a = models.ManyToManyField(User)

relacionado_con_cuenta = models.ForeignKey(Cuenta)

notificar_a_grupo = models.ManyToManyField(Group, blank=True, null=True)

notificar_a_usuarios = models.ManyToManyField(User, blank=True, null=True,

related_name='+')

estado = models.ForeignKey(EstadoIncidencia)

 sector = models.ForeignKey(Sector, blank=True, null=True)

prioridad = models.ForeignKey(Prioridad, blank=True, null=True)

tipo = models.ForeignKey(TipoIncidencia)

producto = models.ForeignKey(Producto, blank=True, null=True)

fecha_de_creacion = models.DateTimeField(auto_now_add=True,

editable=False)

fecha_de_vencimiento = models.DateField()

ultima_modificacion = models.DateTimeField(blank=True, null=True)

 descripcion = models.TextField()

solucion = models.TextField(blank=True, null=True)

owners_notified = models.NullBooleanField(blank=True, null=True)

 def __unicode__(self):

return self.asunto

 def assigned_to(self):

users = None

if self.pk is not None:

users = []

for user in self.asignado_a.all():

html = '<span> <strong>%s</strong></span><br />'

fullname = user.get_full_name()

if fullname != '':

html = html % fullname

users.append(html)

else:

html = html % user.username

users.append(html)

return ''.join([user for user in users])

assigned_to.allow_tags = True

assigned_to.func_name = 'Asignado a'

 def save(self, *args, **kwargs):

self.ultima_modificacion = datetime.datetime.now()

super(Incidencia, self).save(*args, **kwargs)

y tengo un signals.py lo siguiente:

 from twisted.python import log

from twisted.internet import reactor

from twisted.internet.threads import deferToThread

from django.db.models.signals import post_save

from django.db.models.fields import related

from django.core.mail import send_mail

from django.dispatch import receiver

from ncrm.models import Incidencia


@receiver(post_save)

def notify_by_email(sender, **kwargs):

 if not sender in [Incidencia]:

return

 recipients = []

instance = kwargs.get('instance')

obj = sender.objects.get(id=instance.id)

 if not obj.owners_notified:

for email in [user.email for user in obj.asignado_a.all()]:

recipients.append(email)

obj.owners_notified = True

obj.save()

 for user in obj.notificar_a_usuarios.all():

recipients.append(user.email)

 for group in obj.notificar_a_grupo.all():

for user in group.user_set.all():

recipients.append(user.email)

 print 'MAIL TO: %s' % ' '.join([rep for rep in recipients])


Mi problema es la siguiente, cuando entro con el admin y edito una

Incidencia, por ejemplo agregando un usuario utilizando el widget

de multiple selection cual en el signal obtengo mediante

obj.notificar_a_usuarios.all(), "no me toma los cambios sino hasta la

segunda vez que guardo la incidencia". Perdon pero se me complica

explicar esto, lo que quiero hacer es enviar un email cuando se crea

el objeto al owner o 'asignado_a', luego seteo el atributo owners_notified

a True, para que no vuelva a enviar email en las futuras veces que se

guarde el objeto. Tambien itero sobre notificar_a_grupo y
notificar_a_usuarios,

si existe algun registro, trato de obtener sus emails. Ahora, si mal no
entiendo,

cuando se da click a 'guardar' se guarda el obj en la base de datos (mysql
en mi caso),

se dispara la post_signal, recibo en sender el Model del obj guardado y como
kwarg

'instance' la instancia del mismo, cuales utilizo en estas lineas:


 recipients = []

instance = kwargs.get('instance')

obj = sender.objects.get(id=instance.id)


ahora, en obj.notificar_a_usuarios.all() no esta el usuario que acabo de
agregar,

cuando vuelvo a guardar el objeto, si "aparece" por lo que para que mande
email

a quienes tiene que notificar, por el momento tengo que darle click a
guardar "dos veces" :P,

que estoy haciendo mal ?

Muchas gracias de antemano,


-- 
*Emiliano Dalla Verde Marcozzi*
Encargado de IT y Python Ninja Developer



San Juan 4879
Rosario. Argentina
Tel. (+54) 341 437 6878
www.airtrack.com.ar

"Chuck Norris doesn't need a debugger, he just stares down the bug until the
code confesses."

- proyectos: https://bitbucket.org/edvm
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20110726/0ec79862/attachment.html>


More information about the pyar mailing list