Skip to content

Commit 78d9bff

Browse files
committed
Move send_scheduled_announcement functionality to messages/utils.py
- Legacy-Id: 6768
1 parent 35939cc commit 78d9bff

6 files changed

Lines changed: 47 additions & 146 deletions

File tree

ietf/announcements/send_scheduled.py

Lines changed: 0 additions & 68 deletions
This file was deleted.

ietf/announcements/tests.py

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -18,63 +18,3 @@ def doCanonicalize(self, url, content):
1818
return canonicalize_sitemap(content)
1919
else:
2020
return content
21-
22-
class SendScheduledAnnouncementsTestCase(TestCase):
23-
def test_send_plain_announcement(self):
24-
make_test_data()
25-
26-
msg = Message.objects.create(
27-
by=Person.objects.get(name="(System)"),
28-
subject="This is a test",
29-
to="test@example.com",
30-
frm="testmonkey@example.com",
31-
cc="cc.a@example.com, cc.b@example.com",
32-
bcc="bcc@example.com",
33-
body="Hello World!",
34-
content_type="",
35-
)
36-
37-
q = SendQueue.objects.create(
38-
by=Person.objects.get(name="(System)"),
39-
message=msg,
40-
send_at=datetime.datetime.now() + datetime.timedelta(hours=12)
41-
)
42-
43-
mailbox_before = len(outbox)
44-
45-
from ietf.announcements.send_scheduled import send_scheduled_announcement
46-
send_scheduled_announcement(q)
47-
48-
self.assertEquals(len(outbox), mailbox_before + 1)
49-
self.assertTrue("This is a test" in outbox[-1]["Subject"])
50-
self.assertTrue(SendQueue.objects.get(id=q.id).sent_at)
51-
52-
def test_send_mime_announcement(self):
53-
make_test_data()
54-
55-
msg = Message.objects.create(
56-
by=Person.objects.get(name="(System)"),
57-
subject="This is a test",
58-
to="test@example.com",
59-
frm="testmonkey@example.com",
60-
cc="cc.a@example.com, cc.b@example.com",
61-
bcc="bcc@example.com",
62-
body='--NextPart\r\n\r\nA New Internet-Draft is available from the on-line Internet-Drafts directories.\r\n--NextPart\r\nContent-Type: Message/External-body;\r\n\tname="draft-huang-behave-bih-01.txt";\r\n\tsite="ftp.ietf.org";\r\n\taccess-type="anon-ftp";\r\n\tdirectory="internet-drafts"\r\n\r\nContent-Type: text/plain\r\nContent-ID: <2010-07-30001541.I-D@ietf.org>\r\n\r\n--NextPart--',
63-
content_type='Multipart/Mixed; Boundary="NextPart"',
64-
)
65-
66-
q = SendQueue.objects.create(
67-
by=Person.objects.get(name="(System)"),
68-
message=msg,
69-
send_at=datetime.datetime.now() + datetime.timedelta(hours=12)
70-
)
71-
72-
mailbox_before = len(outbox)
73-
74-
from ietf.announcements.send_scheduled import send_scheduled_announcement
75-
send_scheduled_announcement(q)
76-
77-
self.assertEquals(len(outbox), mailbox_before + 1)
78-
self.assertTrue("This is a test" in outbox[-1]["Subject"])
79-
self.assertTrue("--NextPart" in outbox[-1].as_string())
80-
self.assertTrue(SendQueue.objects.get(id=q.id).sent_at)

ietf/announcements/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
urlpatterns = patterns('',
88
(r'^nomcom/$', 'ietf.announcements.views.nomcom'),
9-
(r'^nomcom/(?P<object_id>\d+)/$', 'ietf.announcements.views.message_detail'))
9+
(r'^nomcom/(?P<object_id>\d+)/$', 'ietf.announcements.views.message_detail'),
1010
)

ietf/bin/send-scheduled-mail

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,24 @@ management.setup_environ(settings)
1010
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
1111

1212

13-
from ietf.announcements.send_scheduled import *
14-
from django.db.models import Q
15-
1613
if len(sys.argv) != 2 or sys.argv[1] not in ('all', 'rsync', 'specific'):
17-
print "USAGE: %s <all | rsync | specific>" % os.path.basename(__file__)
14+
print "USAGE: %s <all | specific>" % os.path.basename(__file__)
1815
print "'all' means all not sent"
19-
print "'rsync' means all not sent where to-be-sent-date is null"
2016
print "'specific' means all not sent that are due to be sent"
2117
sys.exit(1)
2218

19+
from ietf.message.utils import send_scheduled_message_from_send_queue
20+
from ietf.message.models import SendQueue
21+
2322
mode = sys.argv[1]
2423

2524
now = datetime.datetime.now()
2625

27-
from ietf.message.models import SendQueue
2826
needs_sending = SendQueue.objects.filter(sent_at=None).select_related("message")
29-
if mode == "rsync":
30-
needs_sending = needs_sending.filter(send_at=None)
31-
elif mode == "specific":
27+
if mode == "specific":
3228
needs_sending = needs_sending.exclude(send_at=None).filter(send_at__lte=now)
3329

3430
for s in needs_sending:
35-
send_scheduled_announcement(s)
31+
send_scheduled_message_from_send_queue(s)
3632

37-
subject = s.message.subject
38-
syslog.syslog(u'Sent scheduled announcement %s "%s"' % (s.id, subject))
33+
syslog.syslog(u'Sent scheduled message %s "%s"' % (s.id, s.message.subject))

ietf/message/utils.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
import re, datetime, email
2+
3+
from django.conf import settings
4+
5+
from ietf.utils.mail import send_mail_text, send_mail_mime
16
from ietf.message.models import Message
27

3-
def infer_message(s):
4-
from email import message_from_string
8+
first_dot_on_line_re = re.compile(r'^\.', re.MULTILINE)
59

6-
parsed = message_from_string(s.encode("utf-8"))
10+
def infer_message(s):
11+
parsed = email.message_from_string(s.encode("utf-8"))
712

813
m = Message()
914
m.subject = parsed.get("Subject", "").decode("utf-8")
@@ -14,3 +19,32 @@ def infer_message(s):
1419
m.body = parsed.get_payload().decode("utf-8")
1520

1621
return m
22+
23+
def send_scheduled_message_from_send_queue(send_queue):
24+
message = send_queue.message
25+
26+
# for some reason, the old Perl code base substituted away . on line starts
27+
body = first_dot_on_line_re.sub("", message.body)
28+
29+
extra = {}
30+
if message.reply_to:
31+
extra['Reply-To'] = message.reply_to
32+
33+
# announcement.content_type can contain a case-sensitive parts separator,
34+
# so we need to keep it as is, not lowercased, but we want a lowercased
35+
# version for the coming comparisons.
36+
content_type_lowercase = message.content_type.lower()
37+
if not content_type_lowercase or 'text/plain' in content_type_lowercase:
38+
send_mail_text(None, message.to, message.frm, message.subject,
39+
body, cc=message.cc, bcc=message.bcc)
40+
elif 'multipart' in content_type_lowercase:
41+
# make body a real message so we can parse it
42+
body = ("MIME-Version: 1.0\r\nContent-Type: %s\r\n" % message.content_type) + body
43+
44+
msg = email.message_from_string(body.encode("utf-8"))
45+
send_mail_mime(None, message.to, message.frm, message.subject,
46+
msg, cc=message.cc, bcc=message.bcc)
47+
48+
send_queue.sent_at = datetime.datetime.now()
49+
send_queue.save()
50+

ietf/secr/drafts/email.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.template.loader import render_to_string
44

55
from ietf.message.models import Message, SendQueue
6-
from ietf.announcements.send_scheduled import send_scheduled_announcement
6+
from ietf.message.utils import send_scheduled_message_from_send_queue
77
from ietf.doc.models import DocumentAuthor
88
from ietf.person.models import Person
99
from ietf.secr.utils.document import get_start_date
@@ -41,7 +41,7 @@ def announcement_from_form(data, **kwargs):
4141
send_queue = SendQueue.objects.create(by=by,message=message)
4242

4343
# uncomment for testing
44-
send_scheduled_announcement(send_queue)
44+
send_scheduled_message_from_send_queue(send_queue)
4545

4646
return message
4747

0 commit comments

Comments
 (0)