Make it possible to request review for more than one team at the time,

auto-select the team for team secretaries/delegates
 - Legacy-Id: 11786
This commit is contained in:
Ole Laursen 2016-08-15 16:05:56 +00:00
parent 8a5d9d7a72
commit 0e808518bc
2 changed files with 24 additions and 18 deletions

View file

@ -10,10 +10,11 @@ from django.template.loader import render_to_string
from django.core.urlresolvers import reverse as urlreverse
from ietf.doc.models import Document, NewRevisionDocEvent, DocEvent, State, DocAlias, LastCallDocEvent
from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role
from ietf.name.models import ReviewRequestStateName, ReviewResultName, DocTypeName
from ietf.review.models import ReviewRequest
from ietf.group.models import Group
from ietf.person.fields import PersonEmailChoiceField, SearchablePersonField
from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role
from ietf.review.utils import (active_review_teams, assign_review_request_to_reviewer,
can_request_review_of_doc, can_manage_review_requests_for_team,
email_review_request_change, make_new_review_request_from_existing,
@ -35,12 +36,13 @@ def clean_doc_revision(doc, rev):
return rev
class RequestReviewForm(forms.ModelForm):
team = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
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 = ('requested_by', 'type', 'team', 'deadline', 'requested_rev')
fields = ('requested_by', 'type', 'deadline', 'requested_rev')
def __init__(self, user, doc, *args, **kwargs):
super(RequestReviewForm, self).__init__(*args, **kwargs)
@ -54,8 +56,8 @@ class RequestReviewForm(forms.ModelForm):
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]])
f.initial = [group.pk for group in f.queryset if can_manage_review_requests_for_team(user, group, allow_non_team_personnel=False)]
self.fields["deadline"].required = False
self.fields["requested_rev"].label = "Document revision"
@ -69,7 +71,7 @@ class RequestReviewForm(forms.ModelForm):
def clean_deadline_date(self):
v = self.cleaned_data.get('deadline_date')
if v < datetime.date.today():
raise forms.ValidationError("Select a future date.")
raise forms.ValidationError("Select today or a date in the future.")
return v
def clean_requested_rev(self):
@ -98,18 +100,21 @@ def request_review(request, name):
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()
teams = form.cleaned_data["team"]
for team in teams:
review_req = form.save(commit=False)
review_req.doc = doc
review_req.state = ReviewRequestStateName.objects.get(slug="requested", used=True)
review_req.team = team
review_req.save()
DocEvent.objects.create(
type="requested_review",
doc=doc,
by=request.user.person,
desc="Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper()),
time=review_req.time,
)
DocEvent.objects.create(
type="requested_review",
doc=doc,
by=request.user.person,
desc="Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper()),
time=review_req.time,
)
return redirect('doc_view', name=doc.name)

View file

@ -26,11 +26,12 @@ def can_request_review_of_doc(user, doc):
return is_authorized_in_doc_stream(user, doc)
def can_manage_review_requests_for_team(user, team):
def can_manage_review_requests_for_team(user, team, allow_non_team_personnel=True):
if not user.is_authenticated():
return False
return Role.objects.filter(name__in=["secr", "delegate"], person__user=user, group=team).exists() or has_role(user, "Secretariat")
return (Role.objects.filter(name__in=["secr", "delegate"], person__user=user, group=team).exists()
or (allow_non_team_personnel and has_role(user, "Secretariat")))
def review_requests_to_list_for_doc(doc):
return ReviewRequest.objects.filter(doc=doc).exclude(