diff --git a/ietf/idrfc/testsREDESIGN.py b/ietf/idrfc/testsREDESIGN.py index 8a4df37f5..542f27f4c 100644 --- a/ietf/idrfc/testsREDESIGN.py +++ b/ietf/idrfc/testsREDESIGN.py @@ -795,7 +795,7 @@ class ApproveBallotTestCase(django.test.TestCase): # approve mailbox_before = len(outbox) - + r = self.client.post(url, dict()) self.assertEquals(r.status_code, 302) @@ -805,6 +805,7 @@ class ApproveBallotTestCase(django.test.TestCase): self.assertTrue("Protocol Action" in outbox[-2]['Subject']) # the IANA copy self.assertTrue("Protocol Action" in outbox[-1]['Subject']) + self.assertTrue("Protocol Action" in draft.message_set.order_by("-time")[0].subject) def test_disapprove_ballot(self): draft = make_test_data() @@ -859,6 +860,7 @@ class MakeLastCallTestCase(django.test.TestCase): self.assertTrue("Last Call" in outbox[-4]['Subject']) # the IANA copy self.assertTrue("Last Call" in outbox[-3]['Subject']) + self.assertTrue("Last Call" in draft.message_set.order_by("-time")[0].subject) class ExpireIDsTestCase(django.test.TestCase): fixtures = ['names'] diff --git a/ietf/idrfc/views_ballot.py b/ietf/idrfc/views_ballot.py index a7a240171..37666cce0 100644 --- a/ietf/idrfc/views_ballot.py +++ b/ietf/idrfc/views_ballot.py @@ -27,6 +27,7 @@ from ietf.idrfc.idrfc_wrapper import BallotWrapper from ietf.doc.models import * from ietf.name.models import BallotPositionName +from ietf.message.utils import infer_message BALLOT_CHOICES = (("yes", "Yes"), @@ -1248,11 +1249,17 @@ def approve_ballotREDESIGN(request, name): email_owner(request, doc, doc.ad, login, change_description) # send announcement + send_mail_preformatted(request, announcement) if action == "to_announcement_list": email_iana(request, doc, "drafts-approval@icann.org", announcement) + msg = infer_message(announcement) + msg.by = login + msg.save() + msg.related_docs.add(doc) + return HttpResponseRedirect(doc.get_absolute_url()) return render_to_response('idrfc/approve_ballot.html', @@ -1341,6 +1348,11 @@ def make_last_callREDESIGN(request, name): send_mail_preformatted(request, announcement) email_iana(request, doc, "drafts-lastcall@icann.org", announcement) + msg = infer_message(announcement) + msg.by = login + msg.save() + msg.related_docs.add(doc) + save_document_in_history(doc) prev = doc.get_state("draft-iesg") diff --git a/ietf/message/models.py b/ietf/message/models.py index de5a137b2..91b2f44f2 100644 --- a/ietf/message/models.py +++ b/ietf/message/models.py @@ -4,6 +4,7 @@ import datetime from ietf.person.models import Email, Person from ietf.group.models import Group +from ietf.doc.models import Document class Message(models.Model): time = models.DateTimeField(default=datetime.datetime.now) @@ -16,9 +17,10 @@ class Message(models.Model): bcc = models.CharField(max_length=255, blank=True) reply_to = models.CharField(max_length=255, blank=True) body = models.TextField() - content_type = models.CharField(max_length=255, blank=True) + content_type = models.CharField(default="text/plain", max_length=255, blank=True) related_groups = models.ManyToManyField(Group, blank=True) + related_docs = models.ManyToManyField(Document, blank=True) class Meta: ordering = ['time'] diff --git a/ietf/message/utils.py b/ietf/message/utils.py new file mode 100644 index 000000000..1fc2e5133 --- /dev/null +++ b/ietf/message/utils.py @@ -0,0 +1,16 @@ +from ietf.message.models import Message + +def infer_message(s): + from email import message_from_string + + parsed = message_from_string(s.encode("utf-8")) + + m = Message() + m.subject = parsed.get("Subject", "").decode("utf-8") + m.frm = parsed.get("From", "").decode("utf-8") + m.to = parsed.get("To", "").decode("utf-8") + m.bcc = parsed.get("Bcc", "").decode("utf-8") + m.reply_to = parsed.get("Reply-to", "").decode("utf-8") + m.body = parsed.get_payload().decode("utf-8") + + return m diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index de9c6a1da..cbe1b9caf 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -224,6 +224,7 @@ class SubmitTestCase(django.test.TestCase): self.assertEquals(draft.authors.all()[0].address, "testname@example.com") self.assertEquals(len(outbox), mailbox_before + 3) self.assertTrue((u"I-D Action: %s" % name) in outbox[-3]["Subject"]) + self.assertTrue((u"I-D Action: %s" % name) in draft.message_set.order_by("-time")[0].subject) self.assertTrue("Test Name" in unicode(outbox[-3])) self.assertTrue("New Version Notification" in outbox[-2]["Subject"]) self.assertTrue(name in unicode(outbox[-2])) diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 5a9807519..9671116c0 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -5,16 +5,18 @@ import datetime from django.conf import settings from django.contrib.sites.models import Site from django.core.urlresolvers import reverse as urlreverse +from django.template.loader import render_to_string from ietf.idtracker.models import (InternetDraft, PersonOrOrgInfo, IETFWG, IDAuthor, EmailAddress, IESGLogin, BallotInfo) from ietf.submit.models import TempIdAuthors -from ietf.utils.mail import send_mail +from ietf.utils.mail import send_mail, send_mail_message from ietf.utils import unaccent from ietf.doc.models import * from ietf.person.models import Person, Alias, Email from ietf.doc.utils import active_ballot_positions +from ietf.message.models import Message # Some useful states UPLOADED = 1 @@ -186,21 +188,38 @@ def send_announcements(submission, draft, state_change_msg): def announce_to_lists(request, submission): - subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) - from_email = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL - to_email = [settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL] authors = [] for i in submission.tempidauthors_set.order_by('author_order'): if not i.author_order: continue authors.append(i.get_full_name()) - if submission.group_acronym: - cc = [submission.group_acronym.email_address] + + if settings.USE_DB_REDESIGN_PROXY_CLASSES: + m = Message() + m.by = request.user.get_profile() if request.user.is_authenticated() else Person.objects.get(name="(System)") + m.subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) + m.frm = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL + m.to = settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL + if submission.group_acronym: + m.cc = submission.group_acronym.email_address + m.body = render_to_string('submit/announce_to_lists.txt', dict(submission=submission, + authors=authors)) + m.save() + m.related_docs.add(Document.objects.get(name=submission.filename)) + + send_mail_message(request, m) else: - cc = None - send_mail(request, to_email, from_email, subject, 'submit/announce_to_lists.txt', - {'submission': submission, - 'authors': authors}, cc=cc) + subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision) + from_email = settings.IDSUBMIT_ANNOUNCE_FROM_EMAIL + to_email = [settings.IDSUBMIT_ANNOUNCE_LIST_EMAIL] + if submission.group_acronym: + cc = [submission.group_acronym.email_address] + else: + cc = None + + send_mail(request, to_email, from_email, subject, 'submit/announce_to_lists.txt', + {'submission': submission, + 'authors': authors}, cc=cc, save_message=True) def announce_new_version(request, submission, draft, state_change_msg): diff --git a/ietf/utils/mail.py b/ietf/utils/mail.py index 6e18d01f7..29c3808e0 100644 --- a/ietf/utils/mail.py +++ b/ietf/utils/mail.py @@ -169,7 +169,8 @@ def send_mail_mime(request, to, frm, subject, msg, cc=None, extra=None, toUser=F msg['X-IETF-IDTracker'] = ietf.__version__ if extra: for k, v in extra.items(): - msg[k] = v + if v: + msg[k] = v if test_mode or settings.SERVER_MODE == 'production': send_smtp(msg, bcc) elif settings.SERVER_MODE == 'test': @@ -195,3 +196,7 @@ def send_mail_preformatted(request, preformatted): for key in ['To', 'From', 'Subject', ]: del extra[key] send_mail_text(request, msg['To'], msg["From"], msg["Subject"], msg.get_payload(), extra=extra) + +def send_mail_message(request, message): + # note that this doesn't handle MIME messages at the moment + send_mail_text(request, message.to, message.frm, message.subject, message.body, cc=message.cc, bcc=message.bcc, extra={ 'Reply-to': message.reply_to })