Skip to content

Commit 12a03d2

Browse files
committed
Automatically send the Internal Review message that the secretary currently has to send manually
- Legacy-Id: 10063
1 parent ef2260e commit 12a03d2

6 files changed

Lines changed: 101 additions & 8 deletions

File tree

ietf/doc/mails.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# generation of mails
22

3+
import os
34
import textwrap, datetime
45

56
from django.template.loader import render_to_string
@@ -10,7 +11,7 @@
1011
from ietf.utils.mail import send_mail, send_mail_text
1112
from ietf.ipr.utils import iprs_from_docs, related_docs
1213
from ietf.doc.models import WriteupDocEvent, BallotPositionDocEvent, LastCallDocEvent, DocAlias, ConsensusDocEvent
13-
from ietf.doc.utils import needed_ballot_positions
14+
from ietf.doc.utils import needed_ballot_positions, get_document_content
1415
from ietf.person.models import Person
1516
from ietf.group.models import Role
1617
from ietf.doc.models import Document
@@ -513,3 +514,25 @@ def send_review_possibly_replaces_request(request, doc):
513514
possibly_replaces=doc.related_that_doc("possibly-replaces"),
514515
review_url=settings.IDTRACKER_BASE_URL + urlreverse("doc_review_possibly_replaces", kwargs={ "name": doc.name })),
515516
cc=list(cc),)
517+
518+
def email_charter_internal_review(request, charter):
519+
addrs = gather_address_lists('charter_internal_review',doc=charter,group=charter.group)
520+
filename = '%s-%s.txt' % (charter.canonical_name(),charter.rev)
521+
charter_text = get_document_content(
522+
filename,
523+
os.path.join(settings.CHARTER_PATH,filename),
524+
split=False,
525+
markup=False,
526+
)
527+
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
528+
'Internal WG Review: %s (%s)'%(charter.group.name,charter.group.acronym),
529+
'doc/mail/charter_internal_review.txt',
530+
dict(charter=charter,
531+
chairs=charter.group.role_set.filter(name='chair').values_list('person__name',flat=True),
532+
ads=charter.group.role_set.filter(name='ad').values_list('person__name',flat=True),
533+
charter_text=charter_text,
534+
milestones=charter.group.groupmilestone_set.filter(state="charter"),
535+
),
536+
cc=addrs.cc,
537+
extra={'Reply-To':"iesg@ietf.org"},
538+
)

ietf/doc/tests_charter.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ def test_change_state(self):
7878
for slug in ("intrev", "extrev", "iesgrev"):
7979
s = State.objects.get(used=True, type="charter", slug=slug)
8080
events_before = charter.docevent_set.count()
81-
mailbox_before = len(outbox)
81+
82+
empty_outbox()
8283

8384
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
8485
self.assertEqual(r.status_code, 302)
@@ -96,7 +97,11 @@ def find_event(t):
9697
if slug in ("intrev", "iesgrev"):
9798
self.assertTrue(find_event("created_ballot"))
9899

99-
self.assertEqual(len(outbox), mailbox_before + 2)
100+
self.assertEqual(len(outbox), 3 if slug=="intrev" else 2 )
101+
102+
if slug=="intrev":
103+
self.assertTrue("Internal WG Review" in outbox[-3]['Subject'])
104+
self.assertTrue(all([x in outbox[-3]['To'] for x in ['iab@','iesg@']]))
100105

101106
self.assertTrue("state changed" in outbox[-2]['Subject'].lower())
102107
self.assertTrue("iesg-secretary@" in outbox[-2]['To'])

ietf/doc/views_charter.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
2121
approved_revision, default_review_text, default_action_text,
2222
generate_ballot_writeup, generate_issue_ballot_mail, next_approved_revision, next_revision )
23-
from ietf.doc.mails import email_state_changed
23+
from ietf.doc.mails import email_state_changed, email_charter_internal_review
2424
from ietf.group.models import ChangeStateGroupEvent, MilestoneGroupEvent
2525
from ietf.group.utils import save_group_in_history, save_milestone_in_history, can_manage_group_type
2626
from ietf.ietfauth.utils import has_role, role_required
@@ -140,6 +140,9 @@ def change_state(request, name, option=None):
140140
charter.time = datetime.datetime.now()
141141
charter.save()
142142

143+
if charter_state.slug == 'intrev':
144+
email_charter_internal_review(request,charter)
145+
143146
if message or charter_state.slug == "intrev" or charter_state.slug == "extrev":
144147
email_admin_re_charter(request, group, "Charter state changed to %s" % charter_state.name, message,'charter_state_edit_admin_needed')
145148

@@ -204,9 +207,9 @@ def state_pk(slug):
204207

205208
info_msg = {}
206209
if group.type_id == "wg":
207-
info_msg[state_pk("infrev")] = 'The %s "%s" (%s) has been set to Informal IESG review by %s.' % (group.type.name, group.name, group.acronym, login.plain_name())
208-
info_msg[state_pk("intrev")] = 'The %s "%s" (%s) has been set to Internal review by %s.\nPlease place it on the next IESG telechat and inform the IAB.' % (group.type.name, group.name, group.acronym, login.plain_name())
209-
info_msg[state_pk("extrev")] = 'The %s "%s" (%s) has been set to External review by %s.\nPlease send out the external review announcement to the appropriate lists.\n\nSend the announcement to other SDOs: Yes\nAdditional recipients of the announcement: ' % (group.type.name, group.name, group.acronym, login.plain_name())
210+
info_msg[state_pk("infrev")] = 'The proposed charter for %s "%s" (%s) has been set to Informal IESG review by %s.' % (group.type.name, group.name, group.acronym, login.plain_name())
211+
info_msg[state_pk("intrev")] = 'The proposed charter for %s "%s" (%s) has been set to Internal review by %s.\nPlease place it on the next IESG telechat if it has not already been placed.' % (group.type.name, group.name, group.acronym, login.plain_name())
212+
info_msg[state_pk("extrev")] = 'The proposed charter for %s "%s" (%s) has been set to External review by %s.\nPlease send out the external review announcement to the appropriate lists.\n\nSend the announcement to other SDOs: Yes\nAdditional recipients of the announcement: ' % (group.type.name, group.name, group.acronym, login.plain_name())
210213

211214
states_for_ballot_wo_extern = State.objects.none()
212215
if group.type_id == "wg":

ietf/mailtoken/migrations/0002_auto_20150809_1314.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ def make_recipients(apps):
1313
desc='The IESG',
1414
template='The IESG <iesg@ietf.org>')
1515

16+
rc(slug='iab',
17+
desc='The IAB',
18+
template='The IAB <iab@iab.org>')
19+
1620
rc(slug='ietf_announce',
1721
desc='The IETF Announce list',
1822
template='IETF-Announce <ietf-announce@ietf.org>')
@@ -461,6 +465,7 @@ def mt_factory(slug,desc,to_slugs,cc_slugs=[]):
461465
'doc_shepherd',
462466
'doc_group_chairs',
463467
'doc_affecteddoc_authors',
468+
'doc_group_responsible_directors',
464469
'doc_affecteddoc_group_chairs',
465470
'doc_affecteddoc_notify',
466471
])
@@ -793,13 +798,21 @@ def mt_factory(slug,desc,to_slugs,cc_slugs=[]):
793798
])
794799

795800
mt_factory(slug='doc_intended_status_changed',
796-
desc="Recipients for a message when a document's intended publication status changes",
801+
desc="Recipients for a message when a document's intended "
802+
"publication status changes",
797803
to_slugs=['doc_authors',
798804
'doc_group_chairs',
799805
'doc_shepherd',
800806
'doc_group_responsible_directors',
801807
'doc_non_ietf_stream_manager',
802808
])
809+
810+
mt_factory(slug='charter_internal_review',
811+
desc="Recipients for message noting that internal review has "
812+
"started on a charter",
813+
to_slugs=['iesg',
814+
'iab',
815+
])
803816

804817
def forward(apps, schema_editor):
805818

ietf/name/fixtures/names.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4511,6 +4511,14 @@
45114511
"model": "mailtoken.recipient",
45124512
"pk": "group_steering_group"
45134513
},
4514+
{
4515+
"fields": {
4516+
"template": "The IAB <iab@iab.org>",
4517+
"desc": "The IAB"
4518+
},
4519+
"model": "mailtoken.recipient",
4520+
"pk": "iab"
4521+
},
45144522
{
45154523
"fields": {
45164524
"template": "<iana@iana.org>",
@@ -4922,6 +4930,18 @@
49224930
"model": "mailtoken.mailtoken",
49234931
"pk": "charter_external_review"
49244932
},
4933+
{
4934+
"fields": {
4935+
"cc": [],
4936+
"to": [
4937+
"iab",
4938+
"iesg"
4939+
],
4940+
"desc": "Recipients for message noting that internal review has started on a charter"
4941+
},
4942+
"model": "mailtoken.mailtoken",
4943+
"pk": "charter_internal_review"
4944+
},
49254945
{
49264946
"fields": {
49274947
"cc": [],
@@ -5116,6 +5136,7 @@
51165136
"doc_affecteddoc_notify",
51175137
"doc_authors",
51185138
"doc_group_chairs",
5139+
"doc_group_responsible_directors",
51195140
"doc_notify",
51205141
"doc_shepherd"
51215142
],
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{% autoescape off %}{% filter wordwrap:73 %}
2+
3+
A new IETF working group is being considered in the {{charter.group.parent.name}}. The draft charter for this working group is provided below for your review and comment.
4+
5+
Review time is one week.
6+
7+
The IETF Secretariat
8+
9+
{{charter.group.name}} ({{ charter.group.acronym }})
10+
--------------------------------------------------
11+
Current Status: {{ charter.group.state.name }} {% if charter.group.state_id != 'bof' %}Working Group{% endif %}
12+
13+
Chairs : {{ chairs|join:', '|default:'TBD' }}
14+
15+
Area Director: {{ ads|join:', '|default:'TBD' }}
16+
17+
Mailing List: {{ charter.group.list_email|default:'TBD' }}
18+
19+
{{ charter.name }}-{{ charter.rev }}
20+
21+
{{ charter_text }}
22+
23+
Proposed milestones
24+
25+
{%if milestones %}{% for milestone in milestones reversed %}{{ milestone.due|date:"M Y" }} {{ milestone.desc }}
26+
{% endfor %}{% else %}TBD{% endif %}
27+
28+
{% endfilter %}{% endautoescape%}

0 commit comments

Comments
 (0)