diff --git a/ietf/doc/views_review.py b/ietf/doc/views_review.py index fbb0ed11b..20a07b5be 100644 --- a/ietf/doc/views_review.py +++ b/ietf/doc/views_review.py @@ -1,5 +1,7 @@ import datetime, os, email.utils +import debug # pyflakes:ignore + from django.http import HttpResponseForbidden, JsonResponse from django.shortcuts import render, get_object_or_404, redirect from django import forms @@ -26,6 +28,8 @@ from ietf.utils.fields import DatepickerDateField from ietf.utils.text import strip_prefix, xslugify from ietf.utils.textupload import get_cleaned_text_file_content from ietf.utils.mail import send_mail +from ietf.mailtrigger.utils import gather_address_lists +from ietf.utils.fields import MultiEmailField def clean_doc_revision(doc, rev): if rev: @@ -333,7 +337,7 @@ class CompleteReviewForm(forms.Form): review_content = forms.CharField(widget=forms.Textarea, required=False) completion_date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={ "autoclose": "1" }, initial=datetime.date.today, help_text="Date of announcement of the results of this review") completion_time = forms.TimeField(widget=forms.HiddenInput, initial=datetime.time.min) - cc = forms.CharField(required=False, help_text="Email addresses to send to in addition to the review team list") + cc = MultiEmailField(required=False, help_text="Email addresses to send to in addition to the review team list") def __init__(self, review_req, *args, **kwargs): self.review_req = review_req @@ -414,6 +418,8 @@ def complete_review(request, name, request_id): if not (is_reviewer or can_manage_request): return HttpResponseForbidden("You do not have permission to perform this action") + (to, cc) = gather_address_lists('review_completed',review_req = review_req) + if request.method == "POST": form = CompleteReviewForm(review_req, request.POST, request.FILES) if form.is_valid(): @@ -531,7 +537,8 @@ def complete_review(request, name, request_id): if need_to_email_review: # email the review subject = "{} of {}-{}".format("Partial review" if review_req.state_id == "part-completed" else "Review", review_req.doc.name, review_req.reviewed_rev) - msg = send_mail(request, [(review_req.team.name, review_req.team.list_email)], None, + msg = send_mail(request, to, + (request.user.person.plain_name(),request.user.person.email_address()), subject, "review/completed_review.txt", { "review_req": review_req, @@ -548,7 +555,8 @@ def complete_review(request, name, request_id): else: form = CompleteReviewForm(review_req, initial={ "reviewed_rev": review_req.reviewed_rev, - "result": review_req.result_id + "result": review_req.result_id, + "cc": ", ".join(cc), }) mail_archive_query_urls = mailarch.construct_query_urls(review_req) diff --git a/ietf/mailtrigger/migrations/0009_review_sent.py b/ietf/mailtrigger/migrations/0009_review_sent.py new file mode 100644 index 000000000..1b8be8576 --- /dev/null +++ b/ietf/mailtrigger/migrations/0009_review_sent.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations + +def forward(apps, schema_editor): + + MailTrigger=apps.get_model('mailtrigger','MailTrigger') + Recipient=apps.get_model('mailtrigger','Recipient') + + Recipient.objects.create( + slug='review_team_mail_list', + desc="The review team's email list", + template="{{review_req.team.list_email}}" + ) + + Recipient.objects.create( + slug='review_doc_group_mail_list', + desc="The working group list for the document being reviewed", + template="{{review_req.doc.group.list_email}}" + ) + + Recipient.objects.create( + slug='review_doc_all_parties', + desc="The .all alias for the document being reviewed", + template="{% if review_req.doc.type_id == 'draft' %}<{{review_req.doc.name}}.all@ietf.org>{% endif %}" + ) + + Recipient.objects.create( + slug='ietf_general', + desc="The IETF general discussion list", + template="ietf@ietf.org" + ) + annc = MailTrigger.objects.create( + slug='review_completed', + desc='Recipients when an review is completed', + ) + annc.to = Recipient.objects.filter(slug__in=['review_team_mail_list',]) + annc.cc = Recipient.objects.filter(slug__in=['review_doc_all_parties','review_doc_group_mail_list','ietf_general']) + +def reverse(apps, schema_editor): + + MailTrigger=apps.get_model('mailtrigger','MailTrigger') + Recipient=apps.get_model('mailtrigger','Recipient') + + MailTrigger.objects.filter(slug='review_completed').delete() + Recipient.objects.filter(slug__in=['review_team_mail_list','review_doc_group_mail_list','review_doc_all_parties','ietf_general']).delete() + +class Migration(migrations.Migration): + + dependencies = [ + ('mailtrigger', '0008_review_summary_triggers'), + ] + + operations = [ + migrations.RunPython(forward, reverse) + ] diff --git a/ietf/name/fixtures/names.json b/ietf/name/fixtures/names.json index bae17f940..9a64b2fcf 100644 --- a/ietf/name/fixtures/names.json +++ b/ietf/name/fixtures/names.json @@ -5131,6 +5131,14 @@ "model": "mailtrigger.recipient", "pk": "ietf_announce" }, +{ + "fields": { + "template": "ietf@ietf.org", + "desc": "The IETF general discussion list" + }, + "model": "mailtrigger.recipient", + "pk": "ietf_general" +}, { "fields": { "template": "", @@ -5275,6 +5283,30 @@ "model": "mailtrigger.recipient", "pk": "nominee" }, +{ + "fields": { + "template": "{% if review_req.doc.type_id == 'draft' %}<{{review_req.doc.name}}.all@ietf.org>{% endif %}", + "desc": "The .all alias for the document being reviewed" + }, + "model": "mailtrigger.recipient", + "pk": "review_doc_all_parties" +}, +{ + "fields": { + "template": "{{review_req.doc.group.list_email}}", + "desc": "The working group list for the document being reviewed" + }, + "model": "mailtrigger.recipient", + "pk": "review_doc_group_mail_list" +}, +{ + "fields": { + "template": "{{review_req.team.list_email}}", + "desc": "The review team's email list" + }, + "model": "mailtrigger.recipient", + "pk": "review_team_mail_list" +}, { "fields": { "template": "", @@ -6230,6 +6262,21 @@ "model": "mailtrigger.mailtrigger", "pk": "review_assignments_summarized" }, +{ + "fields": { + "cc": [ + "ietf_general", + "review_doc_all_parties", + "review_doc_group_mail_list" + ], + "to": [ + "review_team_mail_list" + ], + "desc": "Recipients when an review is completed" + }, + "model": "mailtrigger.mailtrigger", + "pk": "review_completed" +}, { "fields": { "cc": [ diff --git a/release-coverage.json.gz b/release-coverage.json.gz index 61ca0a856..c0b7353c1 100644 Binary files a/release-coverage.json.gz and b/release-coverage.json.gz differ