Skip to content

Commit 89f038a

Browse files
committed
checkpoint
- Legacy-Id: 10019
1 parent c39ebe4 commit 89f038a

11 files changed

Lines changed: 468 additions & 76 deletions

File tree

ietf/doc/expire.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88
from ietf.utils.mail import send_mail
99
from ietf.doc.models import Document, DocEvent, State, save_document_in_history, IESG_SUBSTATE_TAGS
10-
from ietf.person.models import Person, Email
10+
from ietf.person.models import Person
1111
from ietf.meeting.models import Meeting
1212
from ietf.doc.utils import add_state_change_event
13+
from ietf.mailtoken.utils import gather_address_list
1314

1415

1516

@@ -70,10 +71,8 @@ def send_expire_warning_for_draft(doc):
7071

7172
expiration = doc.expires.date()
7273

73-
to = [e.formatted_email() for e in doc.authors.all() if not e.address.startswith("unknown-email")]
74-
cc = None
75-
if doc.group.type_id in ("wg", "rg"):
76-
cc = [e.formatted_email() for e in Email.objects.filter(role__group=doc.group, role__name="chair") if not e.address.startswith("unknown-email")]
74+
to = gather_address_list('doc_expires_soon',doc=doc)
75+
cc = gather_address_list('doc_expires_soon_cc',doc=doc)
7776

7877
s = doc.get_state("draft-iesg")
7978
state = s.name if s else "I-D Exists"
@@ -91,21 +90,23 @@ def send_expire_warning_for_draft(doc):
9190
cc=cc)
9291

9392
def send_expire_notice_for_draft(doc):
94-
if not doc.ad or doc.get_state_slug("draft-iesg") == "dead":
93+
if doc.get_state_slug("draft-iesg") == "dead":
9594
return
9695

9796
s = doc.get_state("draft-iesg")
9897
state = s.name if s else "I-D Exists"
9998

10099
request = None
101-
to = doc.ad.role_email("ad").formatted_email()
100+
to = gather_address_list('doc_expired',doc=doc)
101+
cc = gather_address_list('doc_expired_cc',doc=doc)
102102
send_mail(request, to,
103103
"I-D Expiring System <ietf-secretariat-reply@ietf.org>",
104104
u"I-D was expired %s" % doc.file_tag(),
105105
"doc/draft/id_expired_email.txt",
106106
dict(doc=doc,
107107
state=state,
108-
))
108+
),
109+
cc=cc)
109110

110111
def move_draft_files_to_archive(doc, rev):
111112
def move_file(f):

ietf/doc/mails.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ def send_last_call_request(request, doc):
261261
cc=cc)
262262

263263
def email_resurrect_requested(request, doc, by):
264-
to = "I-D Administrator <internet-drafts@ietf.org>"
264+
to = gather_address_list('resurrection_requested',doc=doc)
265265

266266
if by.role_set.filter(name="secr", group__acronym="secretariat"):
267267
e = by.role_email("secr", group="secretariat")
@@ -277,12 +277,7 @@ def email_resurrect_requested(request, doc, by):
277277
url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url()))
278278

279279
def email_resurrection_completed(request, doc, requester):
280-
if requester.role_set.filter(name="secr", group__acronym="secretariat"):
281-
e = requester.role_email("secr", group="secretariat")
282-
else:
283-
e = requester.role_email("ad")
284-
285-
to = e.formatted_email()
280+
to = gather_address_list('resurrection_completed',doc=doc)
286281
frm = "I-D Administrator <internet-drafts-reply@ietf.org>"
287282
send_mail(request, to, frm,
288283
"I-D Resurrection Completed - %s" % doc.file_tag(),

ietf/doc/tests_draft.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ def test_warn_expirable_drafts(self):
524524

525525
self.assertEqual(len(outbox), mailbox_before + 1)
526526
self.assertTrue("aread@ietf.org" in str(outbox[-1])) # author
527-
self.assertTrue("marschairman@ietf.org" in str(outbox[-1]))
527+
self.assertTrue("mars-chairs@ietf.org" in str(outbox[-1]))
528528

529529
def test_expire_drafts(self):
530530
from ietf.doc.expire import get_expired_drafts, send_expire_notice_for_draft, expire_draft

ietf/group/mails.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from ietf.mailtoken.utils import gather_address_list
1616

1717
def email_iesg_secretary_re_charter(request, group, subject, text):
18-
to = ["iesg-secretary@ietf.org"]
18+
to = gather_address_list('charter_state_message_provided',group=group)
1919
full_subject = u"Regarding %s %s: %s" % (group.type.name, group.acronym, subject)
2020
text = strip_tags(text)
2121

ietf/mailtoken/migrations/0002_auto_20150809_1314.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,42 @@ def make_recipients(apps):
117117
desc="The document's group's responsible AD(s) or IRTF chair",
118118
template=None)
119119

120+
rc(slug='internet_drafts',
121+
desc="The internet drafts ticketing system",
122+
template='internet-drafts@ietf.org')
123+
124+
rc(slug='submission_submitter',
125+
desc="The person that submitted a draft",
126+
template='{{submission.submitter}}')
127+
128+
rc(slug='submission_authors',
129+
desc="The authors of a submitted draft",
130+
template=None)
131+
132+
rc(slug='submission_group_chairs',
133+
desc="The chairs of a submitted draft belonging to a group",
134+
template=None)
135+
136+
rc(slug='submission_confirmers',
137+
desc="The people who can confirm a draft submission",
138+
template=None)
139+
140+
rc(slug='submission_group_mail_list',
141+
desc="The people who can confirm a draft submission",
142+
template=None)
143+
144+
rc(slug='doc_non_ietf_stream_manager',
145+
desc="The document's stream manager if the document is not in the IETF stream",
146+
template=None)
147+
148+
rc(slug='rfc_editor_if_doc_in_queue',
149+
desc="The RFC Editor if a document is in the RFC Editor queue",
150+
template=None)
151+
152+
rc(slug='doc_discussing_ads',
153+
desc="Any ADs holding an active DISCUSS position on a given document",
154+
template=None)
155+
120156
def make_mailtokens(apps):
121157

122158
Recipient=apps.get_model('mailtoken','Recipient')
@@ -393,6 +429,94 @@ def mt_factory(slug,desc,recipient_slugs):
393429
'doc_group_responsible_directors',
394430
])
395431

432+
mt_factory(slug='charter_state_message_provided',
433+
desc="Recipients for extra message when provided on the charter state editing form",
434+
recipient_slugs=['iesg_secretary'])
435+
436+
mt_factory(slug='doc_expires_soon',
437+
desc="Recipients for notification of impending expiration of a document",
438+
recipient_slugs=['doc_authors'])
439+
440+
mt_factory(slug='doc_expires_soon_cc',
441+
desc="Copied on notification of impending expiration of a document",
442+
recipient_slugs=['doc_notify',
443+
'doc_shepherd',
444+
'doc_group_chairs',
445+
'doc_group_responsible_directors',
446+
])
447+
448+
mt_factory(slug='doc_expired',
449+
desc="Recipients for notification of a document's expiration",
450+
recipient_slugs=['doc_authors'])
451+
452+
mt_factory(slug='doc_expired_cc',
453+
desc="Copied on notification of a document's expiration",
454+
recipient_slugs=['doc_notify',
455+
'doc_shepherd',
456+
'doc_group_chairs',
457+
'doc_group_responsible_directors',
458+
])
459+
460+
mt_factory(slug='resurrection_requested',
461+
desc="Recipients of a request to change the state of a draft away from 'Dead'",
462+
recipient_slugs=['internet_drafts',])
463+
464+
mt_factory(slug='resurrection_completed',
465+
desc="Recipients when a draft resurrection request has been completed",
466+
recipient_slugs=['iesg_secretary',
467+
'doc_ad',
468+
])
469+
470+
mt_factory(slug='sub_manual_post_requested',
471+
desc="Recipients for a manual post request for a draft submission",
472+
recipient_slugs=['internet_drafts',
473+
])
474+
475+
mt_factory(slug='sub_manual_post_requested_cc',
476+
desc="Copied on a manual post request for a draft submission",
477+
recipient_slugs=['submission_submitter',
478+
'submission_authors',
479+
'submission_group_chairs',
480+
])
481+
482+
mt_factory(slug='sub_chair_approval_requested',
483+
desc="Recipients for a message requesting group chair approval of a draft submission",
484+
recipient_slugs=['submission_group_chairs',])
485+
486+
mt_factory(slug='sub_confirmation_requested',
487+
desc="Recipients for a message requesting confirmation of a draft submission",
488+
recipient_slugs=['submission_confirmers',])
489+
490+
mt_factory(slug='sub_management_url_requested',
491+
desc="Recipients for a message with the full URL for managing a draft submission",
492+
recipient_slugs=['submission_confirmers',])
493+
494+
mt_factory(slug='sub_announced',
495+
desc="Recipients for the announcement of a successfully submitted draft",
496+
recipient_slugs=['ietf_announce',
497+
])
498+
499+
mt_factory(slug='sub_announced_cc',
500+
desc="Copied on the announcement of a successfully submitted draft",
501+
recipient_slugs=['submission_group_mail_list',
502+
])
503+
504+
mt_factory(slug='sub_announced_to_authors',
505+
desc="Recipients for the announcement to the authors of a successfully submitted draft",
506+
recipient_slugs=['submission_authors',
507+
'submission_confirmers',
508+
])
509+
510+
mt_factory(slug='sub_new_version',
511+
desc="Recipient for notification of a new version of an existing document",
512+
recipient_slugs=['doc_notify',
513+
'doc_ad',
514+
'non_ietf_stream_manager',
515+
'rfc_editor_if_doc_in_queue',
516+
'doc_discussing_ads',
517+
])
518+
519+
396520
def forward(apps, schema_editor):
397521

398522
make_recipients(apps)

ietf/mailtoken/models.py

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
from django.db import models
44
from django.template import Template, Context
55

6-
from ietf.group.models import Role
7-
86
class MailToken(models.Model):
97
slug = models.CharField(max_length=32, primary_key=True)
108
desc = models.TextField(blank=True)
@@ -52,7 +50,7 @@ def gather_doc_group_delegates(self, **kwargs):
5250
if 'doc' in kwargs:
5351
doc=kwargs['doc']
5452
if doc.group and doc.group.type.slug in ['wg','rg']:
55-
addrs.extend(Role.objects.filter(group=doc.group,name='delegate').values_list('email__address',flat=True))
53+
addrs.extend(doc.group.role_set.filter(name='delegate').values_list('email__address',flat=True))
5654
return addrs
5755

5856
def gather_doc_group_mail_list(self, **kwargs):
@@ -125,11 +123,19 @@ def gather_doc_stream_manager(self, **kwargs):
125123
addrs.extend(Recipient.objects.get(slug='stream_managers').gather(**{'streams':[kwargs['doc'].stream_id]}))
126124
return addrs
127125

126+
def gather_doc_non_ietf_stream_manager(self, **kwargs):
127+
addrs = []
128+
if 'doc' in kwargs:
129+
doc = kwargs['doc']
130+
if doc.stream_id and doc.stream_id != 'ietf':
131+
addrs.extend(Recipient.objects.get(slug='stream_managers').gather(**{'streams':[doc.stream_id,]}))
132+
return addrs
133+
128134
def gather_group_responsible_directors(self, **kwargs):
129135
addrs = []
130136
if 'group' in kwargs:
131137
group = kwargs['group']
132-
addrs.extend(Role.objects.filter(group=group,name='ad').values_list('email__address',flat=True))
138+
addrs.extend(group.role_set.filter(name='ad').values_list('email__address',flat=True))
133139
if group.type_id=='rg':
134140
addrs.extend(Recipient.objects.get(slug='stream_managers').gather(**{'streams':['irtf']}))
135141
return addrs
@@ -141,3 +147,62 @@ def gather_doc_group_responsible_directors(self, **kwargs):
141147
if group:
142148
addrs.extend(Recipient.objects.get(slug='group_responsible_directors').gather(**{'group':group}))
143149
return addrs
150+
151+
def gather_submission_authors(self, **kwargs):
152+
addrs = []
153+
if 'submission' in kwargs:
154+
submission = kwargs['submission']
155+
addrs.extend(["%s <%s>" % (author["name"], author["email"]) for author in submission.authors_parsed() if author["email"]])
156+
return addrs
157+
158+
def gather_submission_group_chairs(self, **kwargs):
159+
addrs = []
160+
if 'submission' in kwargs:
161+
submission = kwargs['submission']
162+
if submission.group:
163+
addrs.extend(Recipient.objects.get(slug='group_chairs').gather(**{'group':submission.group}))
164+
return addrs
165+
166+
def gather_submission_confirmers(self, **kwargs):
167+
"""If a submitted document is revising an existing document, the confirmers
168+
are the authors of that existing document. Otherwise, the confirmers
169+
are the authors and submitter of the submitted document."""
170+
171+
addrs=[]
172+
if 'submission' in kwargs:
173+
submission = kwargs['submission']
174+
doc=submission.existing_document()
175+
if doc:
176+
addrs.extend([i.author.formatted_email() for i in doc.documentauthor_set.all() if not i.author.invalid_address()])
177+
else:
178+
addrs.extend([u"%s <%s>" % (author["name"], author["email"]) for author in submission.authors_parsed() if author["email"]])
179+
if submission.submitter_parsed()["email"]:
180+
addrs.append(submission.submitter)
181+
return addrs
182+
183+
def gather_submission_group_mail_list(self, **kwargs):
184+
addrs=[]
185+
if 'submission' in kwargs:
186+
submission = kwargs['submission']
187+
if submission.group:
188+
addrs.extend(Recipient.objects.get(slug='group_mail_list').gather(**{'group':submission.group}))
189+
return addrs
190+
191+
def gather_rfc_editor_if_doc_in_queue(self, **kwargs):
192+
addrs=[]
193+
if 'doc' in kwargs:
194+
doc = kwargs['doc']
195+
if doc.get_state_slug("draft-rfceditor") is not None:
196+
addrs.extend(Recipient.objects.get(slug='rfc_editor').gather(**{}))
197+
return addrs
198+
199+
def gather_doc_discussing_ads(self, **kwargs):
200+
addrs=[]
201+
if 'doc' in kwargs:
202+
doc = kwargs['doc']
203+
active_ballot = doc.active_ballot()
204+
if active_ballot:
205+
for ad, pos in active_ballot.active_ad_positions().iteritems():
206+
if pos and pos.pos_id == "discuss":
207+
addrs.append(ad.role_email("ad").address)
208+
return addrs

0 commit comments

Comments
 (0)