[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 17:02:17 ART 2011
El 26 de julio de 2011 16:59, Emiliano Dalla Verde Marcozzi <
edvm en airtrack.com.ar> escribió:
> 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
>
>
Ufff, perdon pero salio feo feo el paste, por aca dejo el code en pastebin:
http://pastebin.com/JdNJQrDK
--
*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/dac95144/attachment.html>
More information about the pyar
mailing list