From 0e808518bcad6f54e0287714bf68623b5bf2acdb Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Mon, 15 Aug 2016 16:05:56 +0000 Subject: [PATCH] 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 --- ietf/doc/views_review.py | 37 +++++++++++++++++++++---------------- ietf/review/utils.py | 5 +++-- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/ietf/doc/views_review.py b/ietf/doc/views_review.py index eda503866..dc08e7c0b 100644 --- a/ietf/doc/views_review.py +++ b/ietf/doc/views_review.py @@ -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) diff --git a/ietf/review/utils.py b/ietf/review/utils.py index 42939dde9..2321f3f04 100644 --- a/ietf/review/utils.py +++ b/ietf/review/utils.py @@ -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(