Added the ability to withdraw individual assignments. Added the ability to mark individual assignments no-response.
- Legacy-Id: 16039
This commit is contained in:
parent
da3174ab68
commit
f57fb6b8a6
|
@ -942,3 +942,34 @@ class ReviewTests(TestCase):
|
|||
review_req = reload_db_objects(review_req)
|
||||
self.assertEqual(review_req.deadline,new_deadline)
|
||||
self.assertTrue('Deadline changed' in outbox[-1]['Subject'])
|
||||
|
||||
def test_mark_no_response(self):
|
||||
assignment = ReviewAssignmentFactory()
|
||||
secr = RoleFactory(group=assignment.review_request.team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr').person
|
||||
url = urlreverse('ietf.doc.views_review.mark_reviewer_assignment_no_response', kwargs={"name": assignment.review_request.doc.name, "assignment_id": assignment.pk})
|
||||
|
||||
login_testing_unauthorized(self, secr.user.username, url)
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
r=self.client.post(url, data={"action":"noresponse"})
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
||||
assignment = reload_db_objects(assignment)
|
||||
self.assertEqual(assignment.state_id, 'no-response')
|
||||
|
||||
def test_withdraw_assignment(self):
|
||||
assignment = ReviewAssignmentFactory()
|
||||
secr = RoleFactory(group=assignment.review_request.team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr').person
|
||||
url = urlreverse('ietf.doc.views_review.withdraw_reviewer_assignment', kwargs={"name": assignment.review_request.doc.name, "assignment_id": assignment.pk})
|
||||
|
||||
login_testing_unauthorized(self, secr.user.username, url)
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
r=self.client.post(url, data={"action":"withdraw"})
|
||||
self.assertEqual(r.status_code, 302)
|
||||
|
||||
assignment = reload_db_objects(assignment)
|
||||
self.assertEqual(assignment.state_id, 'withdrawn')
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@ urlpatterns = [
|
|||
url(r'^(?P<request_id>[0-9]+)/assignreviewer/$', views_review.assign_reviewer),
|
||||
url(r'^(?P<assignment_id>[0-9]+)/rejectreviewerassignment/$', views_review.reject_reviewer_assignment),
|
||||
url(r'^(?P<assignment_id>[0-9]+)/complete/$', views_review.complete_review),
|
||||
url(r'^(?P<assignment_id>[0-9]+)/withdraw/$', views_review.withdraw_reviewer_assignment),
|
||||
url(r'^(?P<assignment_id>[0-9]+)/noresponse/$', views_review.mark_reviewer_assignment_no_response),
|
||||
url(r'^(?P<assignment_id>[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
|
||||
url(r'^(?P<request_id>[0-9]+)/editcomment/$', views_review.edit_comment),
|
||||
url(r'^(?P<request_id>[0-9]+)/editdeadline/$', views_review.edit_deadline),
|
||||
|
|
|
@ -364,6 +364,81 @@ def reject_reviewer_assignment(request, name, assignment_id):
|
|||
'form': form,
|
||||
})
|
||||
|
||||
@login_required
|
||||
def withdraw_reviewer_assignment(request, name, assignment_id):
|
||||
get_object_or_404(Document, name=name)
|
||||
review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
|
||||
|
||||
can_manage_request = can_manage_review_requests_for_team(request.user, review_assignment.review_request.team)
|
||||
if not can_manage_request:
|
||||
return HttpResponseForbidden("You do not have permission to perform this action")
|
||||
|
||||
if request.method == "POST" and request.POST.get("action") == "withdraw":
|
||||
review_assignment.state_id = 'withdrawn'
|
||||
review_assignment.save()
|
||||
|
||||
ReviewAssignmentDocEvent.objects.create(
|
||||
type="closed_review_request",
|
||||
doc=review_assignment.review_request.doc,
|
||||
rev=review_assignment.review_request.doc.rev,
|
||||
by=request.user.person,
|
||||
desc="Assignment of request for {} review by {} to {} was withdrawn".format(
|
||||
review_assignment.review_request.type.name,
|
||||
review_assignment.review_request.team.acronym.upper(),
|
||||
review_assignment.reviewer.person,
|
||||
),
|
||||
review_assignment=review_assignment,
|
||||
state=review_assignment.state,
|
||||
)
|
||||
|
||||
msg = "Review assignment withdrawn by %s"%request.user.person
|
||||
|
||||
email_review_assignment_change(request, review_assignment, "Reviewer assignment withdrawn", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
|
||||
|
||||
return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
|
||||
|
||||
return render(request, 'doc/review/withdraw_reviewer_assignment.html', {
|
||||
'assignment': review_assignment,
|
||||
})
|
||||
|
||||
@login_required
|
||||
def mark_reviewer_assignment_no_response(request, name, assignment_id):
|
||||
get_object_or_404(Document, name=name)
|
||||
review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
|
||||
|
||||
can_manage_request = can_manage_review_requests_for_team(request.user, review_assignment.review_request.team)
|
||||
if not can_manage_request:
|
||||
return HttpResponseForbidden("You do not have permission to perform this action")
|
||||
|
||||
if request.method == "POST" and request.POST.get("action") == "noresponse":
|
||||
review_assignment.state_id = 'no-response'
|
||||
review_assignment.save()
|
||||
|
||||
ReviewAssignmentDocEvent.objects.create(
|
||||
type="closed_review_request",
|
||||
doc=review_assignment.review_request.doc,
|
||||
rev=review_assignment.review_request.doc.rev,
|
||||
by=request.user.person,
|
||||
desc="Assignment of request for {} review by {} to {} was marked no-response".format(
|
||||
review_assignment.review_request.type.name,
|
||||
review_assignment.review_request.team.acronym.upper(),
|
||||
review_assignment.reviewer.person,
|
||||
),
|
||||
review_assignment=review_assignment,
|
||||
state=review_assignment.state,
|
||||
)
|
||||
|
||||
msg = "Review assignment marked 'No Response' by %s"%request.user.person
|
||||
|
||||
email_review_assignment_change(request, review_assignment, "Reviewer assignment marked no-response", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
|
||||
|
||||
return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
|
||||
|
||||
return render(request, 'doc/review/mark_reviewer_assignment_no_response.html', {
|
||||
'assignment': review_assignment,
|
||||
})
|
||||
|
||||
|
||||
class CompleteReviewForm(forms.Form):
|
||||
state = forms.ModelChoiceField(queryset=ReviewAssignmentStateName.objects.filter(slug__in=("completed", "part-completed")).order_by("-order"), widget=forms.RadioSelect, initial="completed")
|
||||
reviewed_rev = forms.CharField(label="Reviewed revision", max_length=4)
|
||||
|
|
|
@ -139,23 +139,31 @@
|
|||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>Review</th>
|
||||
<td>
|
||||
{% if assignment.review %}
|
||||
<a href="{{ assignment.review.get_absolute_url }}">{{ assignment.review.name }}</a>
|
||||
{% elif assignment.state_id == "assigned" or assignment.state_id == "accepted" %}
|
||||
Not completed yet
|
||||
{% else %}
|
||||
Not available
|
||||
{% endif %}
|
||||
{% if assignment.state_id != "withdrawn" and assignment.state_id != "no-response" and assignment.state_id != "rejected" %}
|
||||
<tr>
|
||||
<th>Review</th>
|
||||
<td>
|
||||
{% if assignment.review %}
|
||||
<a href="{{ assignment.review.get_absolute_url }}">{{ assignment.review.name }}</a>
|
||||
{% elif assignment.state_id == "assigned" or assignment.state_id == "accepted" %}
|
||||
Not completed yet
|
||||
{% else %}
|
||||
Not available
|
||||
{% endif %}
|
||||
|
||||
{% if assignment.can_complete_review %}
|
||||
{# TODO: The url below needs to be to a new complete_assignment passed the assignment.pk #}
|
||||
<a class="btn btn-primary btn-xs" href="{% url "ietf.doc.views_review.complete_review" name=doc.name assignment_id=assignment.pk %}"><span class="fa fa-pencil-square-o"></span> {% if assignment.state_id == "assigned" or assignment.state_id == "accepted" %}Complete review{% else %}Correct review{% endif %}</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% if assignment.can_complete_review %}
|
||||
<a class="btn btn-primary btn-xs" href="{% url "ietf.doc.views_review.complete_review" name=doc.name assignment_id=assignment.pk %}"><span class="fa fa-pencil-square-o"></span> {% if assignment.state_id == "assigned" or assignment.state_id == "accepted" %}Complete review{% else %}Correct review{% endif %}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if assignment.state_id == "assigned" or assignment.state_id == "accepted" %}
|
||||
{% if can_assign_reviewer %}
|
||||
<a class="btn btn-danger btn-xs" href="{% url "ietf.doc.views_review.mark_reviewer_assignment_no_response" name=doc.name assignment_id=assignment.pk %}"><span class="fa fa-ban"></span> No response</a>
|
||||
<a class="btn btn-danger btn-xs" href="{% url "ietf.doc.views_review.withdraw_reviewer_assignment" name=doc.name assignment_id=assignment.pk %}"><span class="fa fa-ban"></span> Withdraw</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
|
||||
{% if assignment.review and assignment.review.external_url %}
|
||||
<tr>
|
||||
|
|
Loading…
Reference in a new issue