Skip to content

Commit ba8b4d3

Browse files
committed
Allow those people who can make a review request to edit the request deadline. Send mail to other directorate secretaries when one secretary makes a change to a request. Fixes ietf-tools#2233. Commit ready for merge.
- Legacy-Id: 14549
1 parent 8e2359e commit ba8b4d3

7 files changed

Lines changed: 114 additions & 15 deletions

File tree

ietf/doc/tests_review.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,3 +800,24 @@ def test_edit_comment(self):
800800
self.assertEqual(r.status_code, 302)
801801
review_req = reload_db_objects(review_req)
802802
self.assertEqual(review_req.comment,'iHsnReEHXEmNPXcixsvAF9Aa')
803+
804+
def test_edit_deadline(self):
805+
doc = make_test_data()
806+
review_req = make_review_data(doc)
807+
808+
url = urlreverse('ietf.doc.views_review.edit_deadline', kwargs={ "name": doc.name, "request_id": review_req.pk })
809+
810+
login_testing_unauthorized(self, "ad", url)
811+
812+
r = self.client.get(url)
813+
self.assertEqual(r.status_code, 200)
814+
815+
old_deadline = review_req.deadline.date()
816+
new_deadline = old_deadline + datetime.timedelta(days=1)
817+
r = self.client.post(url, data={
818+
"deadline": new_deadline.isoformat(),
819+
})
820+
self.assertEqual(r.status_code, 302)
821+
review_req = reload_db_objects(review_req)
822+
self.assertEqual(review_req.deadline,new_deadline)
823+
self.assertTrue('Deadline changed' in outbox[-1]['Subject'])

ietf/doc/urls_review.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@
1010
url(r'^(?P<request_id>[0-9]+)/complete/$', views_review.complete_review),
1111
url(r'^(?P<request_id>[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
1212
url(r'^(?P<request_id>[0-9]+)/editcomment/$', views_review.edit_comment),
13+
url(r'^(?P<request_id>[0-9]+)/editdeadline/$', views_review.edit_deadline),
1314
]

ietf/doc/views_review.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ def review_request(request, name, request_id):
200200
and (is_reviewer or can_manage_request))
201201

202202
can_edit_comment = can_request_review_of_doc(request.user, doc)
203+
can_edit_deadline = can_edit_comment
203204

204205
if request.method == "POST" and request.POST.get("action") == "accept" and can_accept_reviewer_assignment:
205206
review_req.state = ReviewRequestStateName.objects.get(slug="accepted")
@@ -216,6 +217,7 @@ def review_request(request, name, request_id):
216217
'can_accept_reviewer_assignment': can_accept_reviewer_assignment,
217218
'can_complete_review': can_complete_review,
218219
'can_edit_comment': can_edit_comment,
220+
'can_edit_deadline': can_edit_deadline,
219221
})
220222

221223

@@ -684,3 +686,45 @@ def edit_comment(request, name, request_id):
684686
'review_req': review_req,
685687
'form' : form,
686688
})
689+
690+
class EditReviewRequestDeadlineForm(forms.ModelForm):
691+
deadline = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={ "autoclose": "1", "start-date": "+0d" })
692+
class Meta:
693+
fields = ['deadline',]
694+
model = ReviewRequest
695+
696+
def clean_deadline(self):
697+
v = self.cleaned_data.get('deadline')
698+
if v < datetime.date.today():
699+
raise forms.ValidationError("Select today or a date in the future.")
700+
return v
701+
702+
703+
def edit_deadline(request, name, request_id):
704+
review_req = get_object_or_404(ReviewRequest, pk=request_id)
705+
if not can_request_review_of_doc(request.user, review_req.doc):
706+
return HttpResponseForbidden("You do not have permission to perform this action")
707+
708+
old_deadline = review_req.deadline
709+
710+
if request.method == "POST":
711+
form = EditReviewRequestDeadlineForm(request.POST, instance=review_req)
712+
if form.is_valid():
713+
if form.cleaned_data['deadline'] != old_deadline:
714+
form.save()
715+
subject = "Deadline changed: {} {} review of {}-{}".format(review_req.team.acronym.capitalize(),review_req.type.name.lower(), review_req.doc.name, review_req.reviewed_rev)
716+
msg = render_to_string("review/deadline_changed.txt", {
717+
"review_req": review_req,
718+
"old_deadline": old_deadline,
719+
"by": request.user.person,
720+
})
721+
email_review_request_change(request, review_req, subject, msg, request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=True)
722+
723+
return redirect(review_request, name=review_req.doc.name, request_id=review_req.pk)
724+
else:
725+
form = EditReviewRequestDeadlineForm(instance=review_req)
726+
727+
return render(request, 'doc/review/edit_request_deadline.html', {
728+
'review_req': review_req,
729+
'form' : form,
730+
})

ietf/review/utils.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -340,22 +340,14 @@ def email_review_request_change(request, review_req, subject, msg, by, notify_se
340340

341341
system_email = Person.objects.get(name="(System)").formatted_email()
342342

343-
to = []
343+
to = set()
344344

345345
def extract_email_addresses(objs):
346-
if any(o.person == by for o in objs if o):
347-
l = []
348-
else:
349-
l = []
350-
for o in objs:
351-
if o:
352-
e = o.formatted_email()
353-
if e != system_email:
354-
l.append(e)
355-
356-
for e in l:
357-
if e not in to:
358-
to.append(e)
346+
for o in objs:
347+
if o and o.person!=by:
348+
e = o.formatted_email()
349+
if e != system_email:
350+
to.add(e)
359351

360352
if notify_secretary:
361353
extract_email_addresses(Role.objects.filter(name="secr", group=review_req.team).distinct())
@@ -367,6 +359,8 @@ def extract_email_addresses(objs):
367359
if not to:
368360
return
369361

362+
to = list(to)
363+
370364
url = urlreverse("ietf.doc.views_review.review_request", kwargs={ "name": review_req.doc.name, "request_id": review_req.pk })
371365
url = request.build_absolute_uri(url)
372366
send_mail(request, to, request.user.person.formatted_email(), subject, "review/review_request_changed.txt", {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{% extends "base.html" %}
2+
{# Copyright The IETF Trust 2016, All Rights Reserved #}
3+
{% load origin bootstrap3 static %}
4+
5+
{% block pagehead %}
6+
<link rel="stylesheet" href="{% static 'bootstrap-datepicker/css/bootstrap-datepicker3.min.css' %}">
7+
{% endblock %}
8+
9+
{% block title %}Edit review request deadline for {{ review_req.doc.name }}{% endblock %}
10+
11+
{% block content %}
12+
{% origin %}
13+
<h1>Edit review request deadline <br><small>{{ review_req.doc.name }}</small></h1>
14+
15+
<form method="post">
16+
{% csrf_token %}
17+
18+
{% bootstrap_form form %}
19+
20+
{% buttons %}
21+
<a class="btn btn-default" href="{% url "ietf.doc.views_review.review_request" name=review_req.doc.canonical_name request_id=review_req.pk %}">Cancel</a>
22+
<button type="submit" class="btn btn-primary">Save</button>
23+
{% endbuttons %}
24+
</form>
25+
26+
{% endblock %}
27+
28+
{% block js %}
29+
<script src="{% static 'bootstrap-datepicker/js/bootstrap-datepicker.min.js' %}"></script>
30+
{% endblock %}

ietf/templates/doc/review/request_info.html

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@
4747
<tr>
4848
<th></th>
4949
<th>Deadline</th>
50-
<td>{{ review_req.deadline|date:"Y-m-d" }}</td>
50+
<td>{{ review_req.deadline|date:"Y-m-d" }}
51+
{% if can_edit_deadline %}
52+
<a class="btn btn-default btn-xs" href="{% url "ietf.doc.views_review.edit_deadline" name=doc.name request_id=review_req.pk %}"><span class="fa fa-edit"></span> Edit</a>
53+
{% endif %}
54+
</td>
5155
</tr>
5256

5357
<tr>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{% load ietf_filters %}{% autoescape off %}
2+
{{by.plain_name }} has changed the deadline for this review request to: {{ review_req.deadline|date:"Y-m-d" }}
3+
4+
(The original deadline was {{old_deadline|date:"Y-m-d"}})
5+
{% endautoescape %}

0 commit comments

Comments
 (0)