Skip to content

Commit 0e80851

Browse files
committed
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
1 parent 8a5d9d7 commit 0e80851

2 files changed

Lines changed: 25 additions & 19 deletions

File tree

ietf/doc/views_review.py

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
from django.core.urlresolvers import reverse as urlreverse
1111

1212
from ietf.doc.models import Document, NewRevisionDocEvent, DocEvent, State, DocAlias, LastCallDocEvent
13-
from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role
1413
from ietf.name.models import ReviewRequestStateName, ReviewResultName, DocTypeName
1514
from ietf.review.models import ReviewRequest
15+
from ietf.group.models import Group
1616
from ietf.person.fields import PersonEmailChoiceField, SearchablePersonField
17+
from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role
1718
from ietf.review.utils import (active_review_teams, assign_review_request_to_reviewer,
1819
can_request_review_of_doc, can_manage_review_requests_for_team,
1920
email_review_request_change, make_new_review_request_from_existing,
@@ -35,12 +36,13 @@ def clean_doc_revision(doc, rev):
3536
return rev
3637

3738
class RequestReviewForm(forms.ModelForm):
39+
team = forms.ModelMultipleChoiceField(queryset=Group.objects.all(), widget=forms.CheckboxSelectMultiple)
3840
deadline_date = DatepickerDateField(date_format="yyyy-mm-dd", picker_settings={ "autoclose": "1", "start-date": "+0d" })
3941
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)
4042

4143
class Meta:
4244
model = ReviewRequest
43-
fields = ('requested_by', 'type', 'team', 'deadline', 'requested_rev')
45+
fields = ('requested_by', 'type', 'deadline', 'requested_rev')
4446

4547
def __init__(self, user, doc, *args, **kwargs):
4648
super(RequestReviewForm, self).__init__(*args, **kwargs)
@@ -54,8 +56,8 @@ def __init__(self, user, doc, *args, **kwargs):
5456
f.queryset = active_review_teams()
5557
if not is_authorized_in_doc_stream(user, doc): # user is a reviewer
5658
f.queryset = f.queryset.filter(role__name="reviewer", role__person__user=user)
57-
if len(f.queryset) < 6:
58-
f.widget = forms.RadioSelect(choices=[t for t in f.choices if t[0]])
59+
60+
f.initial = [group.pk for group in f.queryset if can_manage_review_requests_for_team(user, group, allow_non_team_personnel=False)]
5961

6062
self.fields["deadline"].required = False
6163
self.fields["requested_rev"].label = "Document revision"
@@ -69,7 +71,7 @@ def __init__(self, user, doc, *args, **kwargs):
6971
def clean_deadline_date(self):
7072
v = self.cleaned_data.get('deadline_date')
7173
if v < datetime.date.today():
72-
raise forms.ValidationError("Select a future date.")
74+
raise forms.ValidationError("Select today or a date in the future.")
7375
return v
7476

7577
def clean_requested_rev(self):
@@ -98,18 +100,21 @@ def request_review(request, name):
98100
form = RequestReviewForm(request.user, doc, request.POST)
99101

100102
if form.is_valid():
101-
review_req = form.save(commit=False)
102-
review_req.doc = doc
103-
review_req.state = ReviewRequestStateName.objects.get(slug="requested", used=True)
104-
review_req.save()
105-
106-
DocEvent.objects.create(
107-
type="requested_review",
108-
doc=doc,
109-
by=request.user.person,
110-
desc="Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper()),
111-
time=review_req.time,
112-
)
103+
teams = form.cleaned_data["team"]
104+
for team in teams:
105+
review_req = form.save(commit=False)
106+
review_req.doc = doc
107+
review_req.state = ReviewRequestStateName.objects.get(slug="requested", used=True)
108+
review_req.team = team
109+
review_req.save()
110+
111+
DocEvent.objects.create(
112+
type="requested_review",
113+
doc=doc,
114+
by=request.user.person,
115+
desc="Requested {} review by {}".format(review_req.type.name, review_req.team.acronym.upper()),
116+
time=review_req.time,
117+
)
113118

114119
return redirect('doc_view', name=doc.name)
115120

ietf/review/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ def can_request_review_of_doc(user, doc):
2626

2727
return is_authorized_in_doc_stream(user, doc)
2828

29-
def can_manage_review_requests_for_team(user, team):
29+
def can_manage_review_requests_for_team(user, team, allow_non_team_personnel=True):
3030
if not user.is_authenticated():
3131
return False
3232

33-
return Role.objects.filter(name__in=["secr", "delegate"], person__user=user, group=team).exists() or has_role(user, "Secretariat")
33+
return (Role.objects.filter(name__in=["secr", "delegate"], person__user=user, group=team).exists()
34+
or (allow_non_team_personnel and has_role(user, "Secretariat")))
3435

3536
def review_requests_to_list_for_doc(doc):
3637
return ReviewRequest.objects.filter(doc=doc).exclude(

0 commit comments

Comments
 (0)