Skip to content

Commit 517ebfa

Browse files
committed
Merged in [18616] from rjsparks@nostrum.com:
Email requesters when an interim moves into the announcement queue. Partially addresses ietf-tools#3016 and ietf-tools#3099. - Legacy-Id: 18630 Note: SVN reference [18616] has been migrated to Git commit ff3f3bd
2 parents 7475ef9 + ff3f3bd commit 517ebfa

6 files changed

Lines changed: 154 additions & 27 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Copyright The IETF Trust 2020 All Rights Reserved
2+
3+
from django.db import migrations
4+
5+
def forward(apps,schema_editor):
6+
MailTrigger = apps.get_model('mailtrigger', 'MailTrigger')
7+
Recipient = apps.get_model('mailtrigger', 'Recipient')
8+
9+
interim_approved = MailTrigger.objects.get(slug='interim_approved')
10+
interim_approved.desc = 'Recipients when an interim meeting is approved'
11+
interim_approved.save()
12+
interim_approved.to.set(Recipient.objects.filter(slug__in=('group_chairs','logged_in_person')))
13+
14+
interim_announce_requested = MailTrigger.objects.create(
15+
slug='interim_announce_requested',
16+
desc='Recipients when an interim announcement is requested',
17+
)
18+
interim_announce_requested.to.set(Recipient.objects.filter(slug='iesg_secretary'))
19+
20+
21+
def reverse(apps,schema_editor):
22+
MailTrigger = apps.get_model('mailtrigger', 'MailTrigger')
23+
Recipient = apps.get_model('mailtrigger', 'Recipient')
24+
25+
MailTrigger.objects.filter(slug='interim_announce_requested').delete()
26+
27+
interim_approved = MailTrigger.objects.get(slug='interim_approved')
28+
interim_approved.desc = 'Recipients when an interim meeting is approved and an announcement needs to be sent'
29+
interim_approved.save()
30+
interim_approved.to.set(Recipient.objects.filter(slug='iesg_secretary'))
31+
32+
33+
class Migration(migrations.Migration):
34+
35+
dependencies = [
36+
('mailtrigger', '0017_lc_to_yang_doctors'),
37+
]
38+
39+
operations = [
40+
migrations.RunPython(forward,reverse)
41+
]

ietf/meeting/helpers.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,13 +552,31 @@ def send_interim_approval_request(meetings):
552552
context,
553553
cc=cc_list)
554554

555+
def send_interim_approval(user, meeting):
556+
"""Send an email to chairs and whoever initiated the action that resulted in approval that an interim is approved"""
557+
first_session = meeting.session_set.first()
558+
(to_email,cc_list) = gather_address_lists('interim_approved',group=first_session.group,person=user.person)
559+
from_email = (settings.SESSION_REQUEST_FROM_EMAIL)
560+
subject = f'{meeting.number} interim approved'
561+
template = 'meeting/interim_approval.txt'
562+
context = {
563+
'meeting': meeting,
564+
}
565+
send_mail(None,
566+
to_email,
567+
from_email,
568+
subject,
569+
template,
570+
context,
571+
cc=cc_list)
572+
555573
def send_interim_announcement_request(meeting):
556574
"""Sends an email to the secretariat that an interim meeting is ready for
557575
announcement, includes the link to send the official announcement"""
558576
first_session = meeting.session_set.first()
559577
group = first_session.group
560578
requester = session_requested_by(first_session)
561-
(to_email, cc_list) = gather_address_lists('interim_approved')
579+
(to_email, cc_list) = gather_address_lists('interim_announce_requested')
562580
from_email = (settings.SESSION_REQUEST_FROM_EMAIL)
563581
subject = '{group} - interim meeting ready for announcement'.format(group=group.acronym)
564582
template = 'meeting/interim_announcement_request.txt'

ietf/meeting/tests_views.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2429,7 +2429,7 @@ def test_interim_request_options(self):
24292429
count = person.role_set.filter(name='chair',group__type__in=('wg', 'rg'), group__state__in=('active', 'proposed')).count()
24302430
self.assertEqual(count, len(q("#id_group option")) - 1) # -1 for options placeholder
24312431

2432-
def do_interim_request_single_virtual(self):
2432+
def do_interim_request_single_virtual(self, emails_expected):
24332433
make_meeting_test_data()
24342434
group = Group.objects.get(acronym='mars')
24352435
date = datetime.date.today() + datetime.timedelta(days=30)
@@ -2479,21 +2479,21 @@ def do_interim_request_single_virtual(self):
24792479
doc = session.materials.first()
24802480
path = os.path.join(doc.get_file_path(),doc.filename_with_rev())
24812481
self.assertTrue(os.path.exists(path))
2482-
# check notice to secretariat
2483-
self.assertEqual(len(outbox), length_before + 1)
2482+
# check notices to secretariat and chairs
2483+
self.assertEqual(len(outbox), length_before + emails_expected)
24842484
return meeting
24852485

24862486
@override_settings(VIRTUAL_INTERIMS_REQUIRE_APPROVAL = True)
24872487
def test_interim_request_single_virtual_settings_approval_required(self):
2488-
meeting = self.do_interim_request_single_virtual()
2488+
meeting = self.do_interim_request_single_virtual(emails_expected=1)
24892489
self.assertEqual(meeting.session_set.last().schedulingevent_set.last().status_id,'apprw')
24902490
self.assertIn('New Interim Meeting Request', outbox[-1]['Subject'])
24912491
self.assertIn('session-request@ietf.org', outbox[-1]['To'])
24922492
self.assertIn('aread@example.org', outbox[-1]['Cc'])
24932493

24942494
@override_settings(VIRTUAL_INTERIMS_REQUIRE_APPROVAL = False)
24952495
def test_interim_request_single_virtual_settings_approval_not_required(self):
2496-
meeting = self.do_interim_request_single_virtual()
2496+
meeting = self.do_interim_request_single_virtual(emails_expected=2)
24972497
self.assertEqual(meeting.session_set.last().schedulingevent_set.last().status_id,'scheda')
24982498
self.assertIn('iesg-secretary@ietf.org', outbox[-1]['To'])
24992499
self.assertIn('interim meeting ready for announcement', outbox[-1]['Subject'])
@@ -3746,12 +3746,16 @@ def do_request_interim(self, url, group, user, meeting_count):
37463746
'session_set-MIN_NUM_FORMS':0,
37473747
'session_set-MAX_NUM_FORMS':1000}
37483748

3749+
empty_outbox()
37493750
r = self.client.post(urlreverse("ietf.meeting.views.interim_request"),data)
37503751
self.assertRedirects(r,urlreverse('ietf.meeting.views.upcoming'))
37513752
meeting = Meeting.objects.order_by('id').last()
37523753
self.assertEqual(meeting.type_id,'interim')
37533754
self.assertEqual(meeting.date,date)
37543755
self.assertEqual(meeting.number,'interim-%s-%s-%s' % (date.year, group.acronym, next_num))
3756+
self.assertTrue(len(outbox)>0)
3757+
self.assertIn('interim approved',outbox[0]["Subject"])
3758+
self.assertIn(user.person.email().address,outbox[0]["To"])
37553759
self.client.logout()
37563760

37573761

ietf/meeting/views.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
from ietf.meeting.helpers import can_request_interim_meeting, get_announcement_initial
7373
from ietf.meeting.helpers import sessions_post_save, is_interim_meeting_approved
7474
from ietf.meeting.helpers import send_interim_cancellation_notice
75+
from ietf.meeting.helpers import send_interim_approval
7576
from ietf.meeting.helpers import send_interim_approval_request
7677
from ietf.meeting.helpers import send_interim_announcement_request
7778
from ietf.meeting.utils import finalize, sort_accept_tuple, condition_slide_order
@@ -3025,8 +3026,10 @@ def interim_request(request):
30253026

30263027
if requires_approval:
30273028
send_interim_approval_request(meetings=[meeting])
3028-
elif not has_role(request.user, 'Secretariat'):
3029-
send_interim_announcement_request(meeting=meeting)
3029+
else:
3030+
send_interim_approval(request.user, meeting=meeting)
3031+
if not has_role(request.user, 'Secretariat'):
3032+
send_interim_announcement_request(meeting=meeting)
30303033

30313034
# series require special handling, each session gets it's own
30323035
# meeting object we won't see this on edit because series are
@@ -3056,8 +3059,10 @@ def interim_request(request):
30563059

30573060
if requires_approval:
30583061
send_interim_approval_request(meetings=series)
3059-
elif not has_role(request.user, 'Secretariat'):
3060-
send_interim_announcement_request(meeting=meeting)
3062+
else:
3063+
send_interim_approval(request.user, meeting=meeting)
3064+
if not has_role(request.user, 'Secretariat'):
3065+
send_interim_announcement_request(meeting=meeting)
30613066

30623067
messages.success(request, 'Interim meeting request submitted')
30633068
return redirect(upcoming)

ietf/name/fixtures/names.json

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3760,6 +3760,17 @@
37603760
"model": "mailtrigger.mailtrigger",
37613761
"pk": "iesg_ballot_saved"
37623762
},
3763+
{
3764+
"fields": {
3765+
"cc": [],
3766+
"desc": "Recipients when an interim announcement is requested",
3767+
"to": [
3768+
"iesg_secretary"
3769+
]
3770+
},
3771+
"model": "mailtrigger.mailtrigger",
3772+
"pk": "interim_announce_requested"
3773+
},
37633774
{
37643775
"fields": {
37653776
"cc": [
@@ -3777,9 +3788,10 @@
37773788
{
37783789
"fields": {
37793790
"cc": [],
3780-
"desc": "Recipients when an interim meeting is approved and an announcement needs to be sent",
3791+
"desc": "Recipients when an interim meeting is approved",
37813792
"to": [
3782-
"iesg_secretary"
3793+
"group_chairs",
3794+
"logged_in_person"
37833795
]
37843796
},
37853797
"model": "mailtrigger.mailtrigger",
@@ -10509,6 +10521,17 @@
1050910521
"model": "name.importantdatename",
1051010522
"pk": "01cutoff"
1051110523
},
10524+
{
10525+
"fields": {
10526+
"default_offset_days": -57,
10527+
"desc": "Preliminary BOF proposals requested. To request a BOF, please see instructions on requesting a BOF at https://www.ietf.org/how/bofs/bof-procedures/",
10528+
"name": "Preliminary BOF proposals requested",
10529+
"order": 0,
10530+
"used": true
10531+
},
10532+
"model": "name.importantdatename",
10533+
"pk": "bofproposals"
10534+
},
1051210535
{
1051310536
"fields": {
1051410537
"default_offset_days": -36,
@@ -10630,6 +10653,17 @@
1063010653
"model": "name.importantdatename",
1063110654
"pk": "ietf-108-go-ahead"
1063210655
},
10656+
{
10657+
"fields": {
10658+
"default_offset_days": -70,
10659+
"desc": "Announcement of whether the meeting will be in-person or online.",
10660+
"name": "Online or in-person Announcement",
10661+
"order": 0,
10662+
"used": true
10663+
},
10664+
"model": "name.importantdatename",
10665+
"pk": "online-announcement"
10666+
},
1063310667
{
1063410668
"fields": {
1063510669
"default_offset_days": -82,
@@ -11897,6 +11931,26 @@
1189711931
"model": "name.rolename",
1189811932
"pk": "trac-editor"
1189911933
},
11934+
{
11935+
"fields": {
11936+
"desc": "Can operate the YangCatalog, change its configuration, and edit its data",
11937+
"name": "YangCatalog Administrator",
11938+
"order": 0,
11939+
"used": true
11940+
},
11941+
"model": "name.rolename",
11942+
"pk": "yc_admin"
11943+
},
11944+
{
11945+
"fields": {
11946+
"desc": "Can grant user api rights and browse the YangCatalog directory structure",
11947+
"name": "YangCatalog Operator",
11948+
"order": 0,
11949+
"used": true
11950+
},
11951+
"model": "name.rolename",
11952+
"pk": "yc_operator"
11953+
},
1190011954
{
1190111955
"fields": {
1190211956
"desc": "Audio streaming support",
@@ -12047,6 +12101,16 @@
1204712101
"model": "name.sessionstatusname",
1204812102
"pk": "notmeet"
1204912103
},
12104+
{
12105+
"fields": {
12106+
"desc": "",
12107+
"name": "Rescheduled",
12108+
"order": 0,
12109+
"used": true
12110+
},
12111+
"model": "name.sessionstatusname",
12112+
"pk": "resched"
12113+
},
1205012114
{
1205112115
"fields": {
1205212116
"desc": "",
@@ -12107,16 +12171,6 @@
1210712171
"model": "name.slidesubmissionstatusname",
1210812172
"pk": "rejected"
1210912173
},
12110-
{
12111-
"fields": {
12112-
"desc": "",
12113-
"name": "Rescheduled",
12114-
"order": 0,
12115-
"used": true
12116-
},
12117-
"model": "name.sessionstatusname",
12118-
"pk": "resched"
12119-
},
1212012174
{
1212112175
"fields": {
1212212176
"desc": "",
@@ -14954,7 +15008,7 @@
1495415008
"fields": {
1495515009
"command": "xym",
1495615010
"switch": "--version",
14957-
"time": "2020-07-23T00:12:27.508",
15011+
"time": "2020-10-09T00:17:03.141",
1495815012
"used": true,
1495915013
"version": "xym 0.4.8"
1496015014
},
@@ -14965,7 +15019,7 @@
1496515019
"fields": {
1496615020
"command": "pyang",
1496715021
"switch": "--version",
14968-
"time": "2020-07-23T00:12:28.886",
15022+
"time": "2020-10-09T00:17:04.888",
1496915023
"used": true,
1497015024
"version": "pyang 2.3.2"
1497115025
},
@@ -14976,7 +15030,7 @@
1497615030
"fields": {
1497715031
"command": "yanglint",
1497815032
"switch": "--version",
14979-
"time": "2020-07-23T00:12:29.140",
15033+
"time": "2020-10-09T00:17:05.228",
1498015034
"used": true,
1498115035
"version": "yanglint SO 1.6.7"
1498215036
},
@@ -14987,9 +15041,9 @@
1498715041
"fields": {
1498815042
"command": "xml2rfc",
1498915043
"switch": "--version",
14990-
"time": "2020-07-23T00:12:30.892",
15044+
"time": "2020-10-09T00:17:07.630",
1499115045
"used": true,
14992-
"version": "xml2rfc 2.47.0"
15046+
"version": "xml2rfc 3.2.1"
1499315047
},
1499415048
"model": "utils.versioninfo",
1499515049
"pk": 4
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% load ams_filters %}{% load ietf_filters %}
2+
An interim meeting for {{ group.acronym }} has been approved or does not require additional approval.
3+
A message has been sent to the secretariat requesting the interim be announced.
4+
5+
{% include "meeting/interim_info.txt" %}

0 commit comments

Comments
 (0)