[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