Add page for emailing open review assignments summary to the review team list

- Legacy-Id: 11846
This commit is contained in:
Ole Laursen 2016-08-23 14:06:47 +00:00
parent 0958bcba4a
commit 16e28481f6
7 changed files with 119 additions and 3 deletions

View file

@ -12,6 +12,7 @@ from ietf.iesg.models import TelechatDate
from ietf.person.models import Email, Person
from ietf.review.utils import suggested_review_requests_for_team
import ietf.group.views_review
from ietf.utils.mail import outbox, empty_outbox
class ReviewTests(TestCase):
def test_suggested_review_requests(self):
@ -79,7 +80,7 @@ class ReviewTests(TestCase):
group = review_req1.team
url = urlreverse(ietf.group.views_review.manage_review_requests, kwargs={ 'acronym': group.acronym })
url = urlreverse(ietf.group.views_review.manage_review_requests, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id })
login_testing_unauthorized(self, "secretary", url)
@ -161,3 +162,31 @@ class ReviewTests(TestCase):
self.assertEqual(review_req2.state_id, "requested")
self.assertEqual(review_req2.reviewer, new_reviewer)
self.assertEqual(review_req3.state_id, "requested")
def test_email_open_review_assignments(self):
doc = make_test_data()
review_req1 = make_review_data(doc)
group = review_req1.team
url = urlreverse(ietf.group.views_review.email_open_review_assignments, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id })
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertTrue(review_req1.doc.name in unicontent(r))
empty_outbox()
r = self.client.post(url, {
"to": group.list_email,
"subject": "Test subject",
"body": "Test body",
"action": "email",
})
self.assertEqual(r.status_code, 302)
self.assertEqual(len(outbox), 1)
self.assertTrue(group.list_email in outbox[0]["To"])
self.assertEqual(outbox[0]["subject"], "Test subject")
self.assertTrue("Test body" in unicode(outbox[0]))

View file

@ -32,5 +32,6 @@ urlpatterns = patterns('',
(r'^photos/$', views.group_photos),
(r'^reviews/$', views.review_requests),
(r'^reviews/manage/$', views_review.manage_review_requests),
(r'^reviews/email-assignments/$', views_review.email_open_review_assignments),
url(r'^email-aliases/$', RedirectView.as_view(pattern_name='ietf.group.views.email',permanent=False),name='old_group_email_aliases'),
)

View file

@ -2,6 +2,7 @@ from django.shortcuts import render, redirect
from django.http import Http404, HttpResponseForbidden
from django.contrib.auth.decorators import login_required
from django import forms
from django.template.loader import render_to_string
from ietf.review.models import ReviewRequest
from ietf.review.utils import (can_manage_review_requests_for_team, close_review_request_states,
@ -9,10 +10,10 @@ from ietf.review.utils import (can_manage_review_requests_for_team, close_review
assign_review_request_to_reviewer,
close_review_request,
setup_reviewer_field,
# make_new_review_request_from_existing,
suggested_review_requests_for_team)
from ietf.group.utils import get_group_or_404
from ietf.person.fields import PersonEmailChoiceField
from ietf.utils.mail import send_mail_text
class ManageReviewRequestForm(forms.Form):
@ -168,3 +169,53 @@ def manage_review_requests(request, acronym, group_type=None):
'saving': saving,
})
class EmailOpenAssignmentsForm(forms.Form):
to = forms.EmailField(widget=forms.EmailInput(attrs={ "readonly": True }))
subject = forms.CharField()
body = forms.CharField(widget=forms.Textarea)
@login_required
def email_open_review_assignments(request, acronym, group_type=None):
group = get_group_or_404(acronym, group_type)
if not group.features.has_reviews:
raise Http404
if not can_manage_review_requests_for_team(request.user, group):
return HttpResponseForbidden("You do not have permission to perform this action")
review_requests = list(ReviewRequest.objects.filter(
team=group,
state__in=("requested", "accepted"),
).exclude(
reviewer=None,
).prefetch_related("reviewer", "type", "state", "doc").distinct().order_by("deadline", "reviewer"))
if request.method == "POST" and request.POST.get("action") == "email":
form = EmailOpenAssignmentsForm(request.POST)
if form.is_valid():
send_mail_text(request, form.cleaned_data["to"], None, form.cleaned_data["subject"], form.cleaned_data["body"])
kwargs = { "acronym": group.acronym }
if group_type:
kwargs["group_type"] = group_type
return redirect(manage_review_requests, **kwargs)
else:
to = group.list_email
subject = "Open review assignments in {}".format(group.acronym)
body = render_to_string("group/email_open_review_assignments.txt", {
"review_requests": review_requests,
})
form = EmailOpenAssignmentsForm(initial={
"to": to,
"subject": subject,
"body": body,
})
return render(request, 'group/email_open_review_assignments.html', {
'group': group,
'review_requests': review_requests,
'form': form,
})

View file

@ -500,6 +500,11 @@ form.review-requests label {
padding-right: 0.3em;
}
form.email-open-review-assignments [name=body] {
height: 50em;
font-family: monospace;
}
/* Profile */
.photo-name {

View file

@ -0,0 +1,26 @@
{% extends "base.html" %}
{# Copyright The IETF Trust 2015, All Rights Reserved #}
{% load origin %}{% origin %}
{% load ietf_filters staticfiles bootstrap3 %}
{% block title %}Email summary of assigned review requests for {{ group.acronym }}{% endblock %}
{% block content %}
{% origin %}
<h1>Email summary of assigned review requests for {{ group.acronym }}</h1>
{% if review_requests %}
<form class="email-open-review-assignments" method="post">{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<a href="{% url "ietf.group.views_review.manage_review_requests" group_type=group.type_id acronym=group.acronym %}" class="btn btn-default pull-right">Cancel</a>
<button class="btn btn-primary" type="submit" name="action" value="email">Send to team mailing list</button>
{% endbuttons %}
</form>
{% else %}
<p>There are currently no open requests.</p>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,4 @@
{% autoescape off %}
Reviewer Deadline Draft
{% for r in review_requests %}{{ r.reviewer.person.plain_name|ljust:"22" }} {{ r.deadline|date:"Y-m-d" }} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}
{% endfor %}{% endautoescape %}

View file

@ -17,7 +17,7 @@
<p>Other options:
<a href="{% url "ietf.group.views.review_requests" group_type=group.type_id acronym=group.acronym %}#closed-review-requests">Closed review requests</a>
- <a href="FIXME">Email open assignments summary</a>
- <a href="{% url "ietf.group.views_review.email_open_review_assignments" group_type=group.type_id acronym=group.acronym %}">Email open assignments summary</a>
</p>
{% if newly_closed > 0 or newly_opened > 0 or newly_assigned > 0 %}