datatracker/ietf/doc/views_review.py
Ole Laursen 64a65340a2 Add review tracking models, add a request review page (with test), show
review requests on doc page
 - Legacy-Id: 11206
2016-05-19 15:35:30 +00:00

109 lines
4 KiB
Python

import datetime
from django.http import HttpResponseForbidden
from django.shortcuts import render, get_object_or_404, redirect
from django.core.urlresolvers import reverse as urlreverse
from django import forms
from django.contrib.auth.decorators import login_required
from ietf.doc.models import Document, NewRevisionDocEvent, DocEvent
from ietf.doc.utils import can_request_review_of_doc
from ietf.ietfauth.utils import is_authorized_in_doc_stream
from ietf.review.models import ReviewRequest, ReviewRequestStateName
from ietf.review.utils import active_review_teams
from ietf.utils.fields import DatepickerDateField
class RequestReviewForm(forms.ModelForm):
deadline_date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={ "autoclose": "1", "start-date": "+0d" })
deadline_time = forms.TimeField(widget=forms.TextInput(attrs={ 'placeholder': "HH:MM" }), help_text="If time is not specified, end of day is assumed", required=False)
class Meta:
model = ReviewRequest
fields = ('type', 'team', 'deadline', 'requested_rev')
def __init__(self, user, doc, *args, **kwargs):
super(RequestReviewForm, self).__init__(*args, **kwargs)
self.doc = doc
self.fields['type'].widget = forms.RadioSelect(choices=[t for t in self.fields['type'].choices if t[0]])
f = self.fields["team"]
f.queryset = active_review_teams()
if not is_authorized_in_doc_stream(user, doc): # user is a reviewer
f.queryset = f.queryset.filter(role__name="reviewer", role__person__user=user)
if len(f.queryset) < 6:
f.widget = forms.RadioSelect(choices=[t for t in f.choices if t[0]])
self.fields["deadline"].required = False
self.fields["requested_rev"].label = "Document revision"
def clean_deadline_date(self):
v = self.cleaned_data.get('deadline_date')
if v < datetime.date.today():
raise forms.ValidationError("Select a future date.")
return v
def clean_requested_rev(self):
rev = self.cleaned_data.get("requested_rev")
if rev:
rev = rev.rjust(2, "0")
if not NewRevisionDocEvent.objects.filter(doc=self.doc, rev=rev).exists():
raise forms.ValidationError("Could not find revision '{}' of the document.".format(rev))
return rev
def clean(self):
deadline_date = self.cleaned_data.get('deadline_date')
deadline_time = self.cleaned_data.get('deadline_time', None)
if deadline_date:
if deadline_time is None:
deadline_time = datetime.time(23, 59, 59)
self.cleaned_data["deadline"] = datetime.datetime.combine(deadline_date, deadline_time)
return self.cleaned_data
@login_required
def request_review(request, name):
doc = get_object_or_404(Document, name=name)
if not can_request_review_of_doc(request.user, doc):
return HttpResponseForbidden("You do not have permission to perform this action")
if request.method == "POST":
form = RequestReviewForm(request.user, doc, request.POST)
if form.is_valid():
review_req = form.save(commit=False)
review_req.doc = doc
review_req.state = ReviewRequestStateName.objects.get(slug="requested", used=True)
review_req.save()
DocEvent.objects.create(
type="requested_review",
doc=doc,
by=request.user.person,
desc="{} review by {} requested".format(review_req.type.name, review_req.team.acronym.upper()),
)
# FIXME: if I'm a reviewer, auto-assign to myself?
return redirect('doc_view', name=doc.name)
else:
form = RequestReviewForm(request.user, doc)
return render(request, 'doc/review/request_review.html', {
'doc': doc,
'form': form,
})
def review(request, name, request_id):
doc = get_object_or_404(Document, name=name)
review_request = get_object_or_404(ReviewRequest, pk=request_id)
print doc, review_request