From 6e89b39a15b440ad1ed0bd4f1f8045f1a17847fa Mon Sep 17 00:00:00 2001 From: Evgeny Fadeev Date: Fri, 5 Oct 2012 06:22:39 -0400 Subject: send email alert when PMs are sent --- group_messaging/models.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'group_messaging/models.py') diff --git a/group_messaging/models.py b/group_messaging/models.py index d84b202f..12fe3620 100644 --- a/group_messaging/models.py +++ b/group_messaging/models.py @@ -1,12 +1,16 @@ """models for the ``group_messaging`` app """ import datetime +from coffin.template.loader import get_template from django.db import models +from django.db.models import signals from django.contrib.auth.models import Group from django.contrib.auth.models import User +from django.utils.translation import ugettext as _ MAX_HEADLINE_LENGTH = 80 MAX_SENDERS_INFO_LENGTH = 64 +MAX_SUBJECT_LINE_LENGTH = 30 #dummy parse message function parse_message = lambda v: v @@ -167,6 +171,7 @@ class MessageManager(models.Manager): text=text, ) message.add_recipients(recipients) + message.send_email_alert() return message def create_response(self, sender=None, text=None, parent=None): @@ -192,6 +197,7 @@ class MessageManager(models.Manager): message.root.update_senders_info() #unarchive the thread for all recipients message.root.unarchive() + message.send_email_alert() return message @@ -261,6 +267,49 @@ class Message(models.Model): sender_list, created = SenderList.objects.get_or_create(recipient=recipient) sender_list.senders.add(self.sender) + def get_email_subject_line(self): + """forms subject line based on the root message + and prepends 'Re': if message is non-root + """ + subject = self.get_root_message().text[:MAX_SUBJECT_LINE_LENGTH] + if self.root: + subject = _('Re: ') + subject + return subject + + def get_root_message(self): + """returns root message or self + if current message is root + """ + return self.root or self + + def get_recipients_users(self): + """returns query set of users""" + groups = self.recipients.all() + return User.objects.filter( + groups__in=groups + ).exclude( + id=self.sender.id + ).distinct() + + def get_timeline(self): + """returns ordered query set of messages in the thread + with the newest first""" + root = self.get_root_message() + root_qs = Message.objects.filter(id=root.id) + return (root.descendants.all() | root_qs).order_by('-sent_at') + + + def send_email_alert(self): + """signal handler for the message post-save""" + subject = self.get_email_subject_line() + template = get_template('group_messaging/email_alert.html') + data = {'messages': self.get_timeline()} + body_text = template.render(data) + recipients = map(lambda v: v.email, self.get_recipients_users()) + from askbot.mail import send_mail + send_mail(recipient_list=recipients, subject_line=subject, body_text=body_text) + + def update_senders_info(self): """update the contributors info, meant to be used on a root message only -- cgit v1.2.3-1-g7c22