33
44import re , os
55from datetime import datetime , date , time , timedelta
6- from django .http import HttpResponse , HttpResponseRedirect , Http404
6+ from django .http import HttpResponse , HttpResponseRedirect , HttpResponseForbidden , Http404
77from django .shortcuts import render_to_response , get_object_or_404
88from django .core .urlresolvers import reverse as urlreverse
99from django .template .loader import render_to_string
1515from ietf .utils .mail import send_mail_text , send_mail_preformatted
1616from ietf .ietfauth .decorators import group_required
1717from ietf .idtracker .templatetags .ietf_filters import in_group
18- from ietf .ietfauth .decorators import has_role
18+ from ietf .ietfauth .decorators import has_role , role_required
1919from ietf .idtracker .models import *
2020from ietf .iesg .models import *
2121from ietf .ipr .models import IprDetail
@@ -222,7 +222,7 @@ def clean_discuss(self):
222222 raise forms .ValidationError ("You must enter a non-empty discuss" )
223223 return entered_discuss
224224
225- @group_required ( 'Area_Director ' ,'Secretariat' )
225+ @role_required ( 'Area Director ' ,'Secretariat' )
226226def edit_positionREDESIGN (request , name ):
227227 """Vote and edit discuss and comment on Internet Draft as Area Director."""
228228 doc = get_object_or_404 (Document , docalias__name = name )
@@ -238,7 +238,7 @@ def edit_positionREDESIGN(request, name):
238238 return_to_url = doc .get_absolute_url ()
239239
240240 # if we're in the Secretariat, we can select an AD to act as stand-in for
241- if not has_role (request .user , "Area Director " ):
241+ if has_role (request .user , "Secretariat " ):
242242 ad_id = request .GET .get ('ad' )
243243 if not ad_id :
244244 raise Http404 ()
@@ -248,6 +248,10 @@ def edit_positionREDESIGN(request, name):
248248 old_pos = doc .latest_event (BallotPositionDocEvent , type = "changed_ballot_position" , ad = ad , time__gte = started_process .time )
249249
250250 if request .method == 'POST' :
251+ if not has_role (request .user , "Secretariat" ) and not ad .role_set .filter (name = "ad" , group__type = "area" , group__state = "active" ):
252+ # prevent pre-ADs from voting
253+ return HttpResponseForbidden ("Must be a proper Area Director in an active area to cast ballot" )
254+
251255 form = EditPositionForm (request .POST )
252256 if form .is_valid ():
253257
0 commit comments