Skip to content

Commit 35a7436

Browse files
committed
Refactored multiple edit_telechat functions into one function in doc_views.
Added a helper function for determining if ballots have changed to isolate the implementation. Fixed the issue with update_agenda setting the returning item bit even when the user explicitly said not to. Added prompting to encourage proper setting of the returning item bit to the edit_telechat view. Fixes ietf-tools#1209 Commit ready for merge. - Legacy-Id: 8263
1 parent 9d8d0d6 commit 35a7436

12 files changed

Lines changed: 87 additions & 150 deletions

ietf/doc/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/replaces/$', views_draft.replaces, name='doc_change_replaces'),
7777
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/notify/$', views_draft.edit_notices, name='doc_change_notify'),
7878
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/status/$', views_draft.change_intention, name='doc_change_intended_status'),
79-
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/telechat/$', views_draft.telechat_date, name='doc_change_telechat_date'),
79+
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/telechat/$', views_doc.telechat_date, name='doc_change_telechat_date'),
8080
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/iesgnote/$', views_draft.edit_iesg_note, name='doc_change_iesg_note'),
8181
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/ad/$', views_draft.edit_ad, name='doc_change_ad'),
8282
url(r'^(?P<name>[A-Za-z0-9._+-]+)/edit/consensus/$', views_draft.edit_consensus, name='doc_edit_consensus'),

ietf/doc/urls_charter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
urlpatterns = patterns('',
66
url(r'^state/$', "ietf.doc.views_charter.change_state", name='charter_change_state'),
77
url(r'^(?P<option>initcharter|recharter|abandon)/$', "ietf.doc.views_charter.change_state", name='charter_startstop_process'),
8-
url(r'^telechat/$', "ietf.doc.views_charter.telechat_date", name='charter_telechat_date'),
8+
url(r'^telechat/$', "ietf.doc.views_doc.telechat_date", name='charter_telechat_date'),
99
url(r'^notify/$', "ietf.doc.views_charter.edit_notify", name='charter_edit_notify'),
1010
url(r'^ad/$', "ietf.doc.views_charter.edit_ad", name='charter_edit_ad'),
1111
url(r'^(?P<ann>action|review)/$', "ietf.doc.views_charter.announcement_text", name="charter_edit_announcement"),

ietf/doc/urls_conflict_review.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
url(r'^ad/$', "edit_ad", name='conflict_review_ad'),
88
url(r'^approve/$', "approve", name='conflict_review_approve'),
99
url(r'^start_conflict_review/$', "start_review", name='conflict_review_start'),
10+
)
11+
12+
urlpatterns += patterns('ietf.doc.views_doc',
1013
url(r'^telechat/$', "telechat_date", name='conflict_review_telechat_date'),
1114
)
1215

16+

ietf/doc/urls_status_change.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
url(r'^ad/$', "edit_ad", name='status_change_ad'),
88
url(r'^title/$', "edit_title", name='status_change_title'),
99
url(r'^approve/$', "approve", name='status_change_approve'),
10-
url(r'^telechat/$', "telechat_date", name='status_change_telechat_date'),
1110
url(r'^relations/$', "edit_relations", name='status_change_relations'),
1211
url(r'^last-call/$', "last_call", name='status_change_last_call'),
1312
)
1413

14+
urlpatterns += patterns('ietf.doc.views_doc',
15+
url(r'^telechat/$', "telechat_date", name='status_change_telechat_date'),
16+
)
17+
18+

ietf/doc/utils.py

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,14 @@ def nice_consensus(consensus):
307307
}
308308
return mapping[consensus]
309309

310+
def has_same_ballot(doc, date1, date2=datetime.date.today()):
311+
""" Test if the most recent ballot created before the end of date1
312+
is the same as the most recent ballot created before the
313+
end of date 2. """
314+
ballot1 = doc.latest_event(BallotDocEvent,type='created_ballot',time__lt=date1+datetime.timedelta(days=1))
315+
ballot2 = doc.latest_event(BallotDocEvent,type='created_ballot',time__lt=date2+datetime.timedelta(days=1))
316+
return ballot1==ballot2
317+
310318
def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None):
311319
from ietf.doc.models import TelechatDocEvent
312320

@@ -316,15 +324,6 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
316324
prev_returning = bool(prev and prev.returning_item)
317325
prev_telechat = prev.telechat_date if prev else None
318326
prev_agenda = bool(prev_telechat)
319-
prev_telechat_happened = prev_telechat and prev_telechat < datetime.date.today()
320-
321-
prev_same_ballot = False
322-
if prev_telechat:
323-
prev_ballot = doc.docevent_set.filter(ballotdocevent__type='created_ballot').exclude(time__gt=prev_telechat).order_by('-time').first()
324-
cur_ballot = doc.docevent_set.filter(ballotdocevent__type='created_ballot').order_by('-time').first()
325-
prev_same_ballot = (prev_ballot == cur_ballot)
326-
327-
returning_item_changed = bool(new_returning_item != None and new_returning_item != prev_returning)
328327

329328
if new_returning_item == None:
330329
returning = prev_returning
@@ -335,13 +334,13 @@ def update_telechat(request, doc, by, new_telechat_date, new_returning_item=None
335334
# fully updated, nothing to do
336335
return
337336

338-
# auto-update returning item
339-
if ( not returning_item_changed
337+
# auto-set returning item _ONLY_ if the caller did not provide a value
338+
if ( new_returning_item != None
340339
and on_agenda
341340
and prev_agenda
342341
and new_telechat_date != prev_telechat
343-
and prev_telechat_happened
344-
and prev_same_ballot
342+
and prev_telechat < datetime.date.today()
343+
and has_same_ballot(doc,prev.telechat_date)
345344
):
346345
returning = True
347346

ietf/doc/views_charter.py

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,15 @@
1414
import debug # pyflakes:ignore
1515

1616
from ietf.doc.models import ( Document, DocHistory, State, DocEvent, BallotDocEvent,
17-
BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent, TelechatDocEvent,
17+
BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent,
1818
WriteupDocEvent, save_document_in_history )
1919
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
20-
create_ballot_if_not_open, get_chartering_type, update_telechat )
20+
create_ballot_if_not_open, get_chartering_type )
2121
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
2222
approved_revision, default_review_text, default_action_text, email_state_changed,
2323
generate_ballot_writeup, generate_issue_ballot_mail, next_approved_revision, next_revision )
2424
from ietf.group.models import ChangeStateGroupEvent, MilestoneGroupEvent
2525
from ietf.group.utils import save_group_in_history, save_milestone_in_history, can_manage_group_type
26-
from ietf.iesg.models import TelechatDate
2726
from ietf.ietfauth.utils import has_role, role_required
2827
from ietf.name.models import GroupStateName
2928
from ietf.person.models import Person
@@ -32,7 +31,6 @@
3231
from ietf.utils.textupload import get_cleaned_text_file_content
3332
from ietf.group.mails import email_iesg_secretary_re_charter
3433

35-
3634
class ChangeStateForm(forms.Form):
3735
charter_state = forms.ModelChoiceField(State.objects.filter(used=True, type="charter"), label="Charter state", empty_label=None, required=False)
3836
initial_time = forms.IntegerField(initial=0, label="Review time", help_text="(in weeks)", required=False)
@@ -227,46 +225,6 @@ def state_pk(slug):
227225
),
228226
context_instance=RequestContext(request))
229227

230-
class TelechatForm(forms.Form):
231-
telechat_date = forms.TypedChoiceField(coerce=lambda x: datetime.datetime.strptime(x, '%Y-%m-%d').date(), empty_value=None, required=False)
232-
233-
def __init__(self, *args, **kwargs):
234-
super(self.__class__, self).__init__(*args, **kwargs)
235-
236-
dates = [d.date for d in TelechatDate.objects.active().order_by('date')]
237-
init = kwargs['initial'].get("telechat_date")
238-
if init and init not in dates:
239-
dates.insert(0, init)
240-
241-
self.fields['telechat_date'].choices = [("", "(not on agenda)")] + [(d, d.strftime("%Y-%m-%d")) for d in dates]
242-
243-
244-
@role_required("Area Director", "Secretariat")
245-
def telechat_date(request, name):
246-
doc = get_object_or_404(Document, type="charter", name=name)
247-
login = request.user.person
248-
249-
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
250-
251-
initial = dict(telechat_date=e.telechat_date if e else None)
252-
if request.method == "POST":
253-
form = TelechatForm(request.POST, initial=initial)
254-
255-
if form.is_valid():
256-
update_telechat(request, doc, login, form.cleaned_data['telechat_date'])
257-
return redirect("doc_view", name=doc.name)
258-
else:
259-
form = TelechatForm(initial=initial)
260-
261-
return render_to_response('doc/charter/edit_telechat_date.html',
262-
dict(doc=doc,
263-
form=form,
264-
user=request.user,
265-
login=login,
266-
okstates=['intrev','extrev','iesgrev'],
267-
),
268-
context_instance=RequestContext(request))
269-
270228
class NotifyForm(forms.Form):
271229
notify = forms.CharField(max_length=255, help_text="List of email addresses to receive state notifications, separated by comma", label="Notification list", required=False)
272230

ietf/doc/views_conflict_review.py

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
from django.conf import settings
1010

1111
from ietf.doc.models import ( BallotDocEvent, BallotPositionDocEvent, DocAlias, DocEvent,
12-
Document, NewRevisionDocEvent, State, TelechatDocEvent, save_document_in_history )
12+
Document, NewRevisionDocEvent, State, save_document_in_history )
1313
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
1414
create_ballot_if_not_open, get_document_content, update_telechat )
1515
from ietf.doc.mails import email_iana
16-
from ietf.doc.forms import TelechatForm, AdForm, NotifyForm
16+
from ietf.doc.forms import AdForm, NotifyForm
1717
from ietf.group.models import Role, Group
1818
from ietf.iesg.models import TelechatDate
1919
from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_stream
@@ -512,31 +512,3 @@ def start_review_as_stream_owner(request, name):
512512
'doc_to_review': doc_to_review,
513513
},
514514
context_instance = RequestContext(request))
515-
516-
@role_required("Area Director", "Secretariat")
517-
def telechat_date(request, name):
518-
doc = get_object_or_404(Document, type="conflrev", name=name)
519-
login = request.user.person
520-
521-
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
522-
initial_returning_item = bool(e and e.returning_item)
523-
524-
initial = dict(telechat_date=e.telechat_date if e else None,
525-
returning_item = initial_returning_item,
526-
)
527-
if request.method == "POST":
528-
form = TelechatForm(request.POST, initial=initial)
529-
530-
if form.is_valid():
531-
update_telechat(request, doc, login, form.cleaned_data['telechat_date'], form.cleaned_data['returning_item'])
532-
return redirect("doc_view", name=doc.name)
533-
else:
534-
form = TelechatForm(initial=initial)
535-
536-
return render_to_response('doc/edit_telechat_date.html',
537-
dict(doc=doc,
538-
form=form,
539-
user=request.user,
540-
login=login),
541-
context_instance=RequestContext(request))
542-

ietf/doc/views_doc.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
IESG_BALLOT_ACTIVE_STATES)
4747
from ietf.doc.utils import ( add_links_in_new_revision_events, augment_events_with_revision,
4848
can_adopt_draft, get_chartering_type, get_document_content, get_tags_for_stream_id,
49-
needed_ballot_positions, nice_consensus, prettify_std_name)
49+
needed_ballot_positions, nice_consensus, prettify_std_name, update_telechat, has_same_ballot)
5050
from ietf.community.models import CommunityList
5151
from ietf.doc.mails import email_ad
5252
from ietf.doc.views_status_change import RELATION_SLUGS as status_change_relationships
@@ -56,6 +56,7 @@
5656
from ietf.name.models import StreamName, BallotPositionName
5757
from ietf.person.models import Email
5858
from ietf.utils.history import find_history_active_at
59+
from ietf.doc.forms import TelechatForm
5960

6061
def render_document_top(request, doc, tab, name):
6162
tabs = []
@@ -849,3 +850,50 @@ def add_comment(request, name):
849850
form=form),
850851
context_instance=RequestContext(request))
851852

853+
@role_required("Area Director", "Secretariat")
854+
def telechat_date(request, name):
855+
doc = get_object_or_404(Document, name=name)
856+
login = request.user.person
857+
858+
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
859+
initial_returning_item = bool(e and e.returning_item)
860+
861+
prompts = []
862+
if e and doc.type.slug != 'charter':
863+
if e.telechat_date==datetime.date.today():
864+
prompts.append( "This document is currently scheduled for today's telechat. "
865+
+"Please set the returning item bit carefully.")
866+
867+
elif e.telechat_date<datetime.date.today() and has_same_ballot(doc,e.telechat_date):
868+
initial_returning_item = True
869+
prompts.append( "This document appears to have been on a previous telechat with the same ballot, "
870+
+"so the returning item bit has been set. Clear it if that is not appropriate.")
871+
872+
else:
873+
pass
874+
875+
initial = dict(telechat_date=e.telechat_date if e else None,
876+
returning_item = initial_returning_item,
877+
)
878+
if request.method == "POST":
879+
form = TelechatForm(request.POST, initial=initial)
880+
881+
if form.is_valid():
882+
if doc.type.slug=='charter':
883+
cleaned_returning_item = None
884+
else:
885+
cleaned_returning_item = form.cleaned_data['returning_item']
886+
update_telechat(request, doc, login, form.cleaned_data['telechat_date'],cleaned_returning_item)
887+
return redirect('doc_view', name=doc.name)
888+
else:
889+
form = TelechatForm(initial=initial)
890+
if doc.type.slug=='charter':
891+
del form.fields['returning_item']
892+
893+
return render_to_response('doc/edit_telechat_date.html',
894+
dict(doc=doc,
895+
form=form,
896+
user=request.user,
897+
prompts=prompts,
898+
login=login),
899+
context_instance=RequestContext(request))

ietf/doc/views_draft.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
from ietf.ietfauth.utils import role_required
3030
from ietf.message.models import Message
3131
from ietf.name.models import IntendedStdLevelName, DocTagName, StreamName
32-
from ietf.doc.forms import TelechatForm
3332
from ietf.person.forms import EmailsField
3433
from ietf.person.models import Person, Email
3534
from ietf.secr.lib.template import jsonapi
@@ -878,34 +877,6 @@ def edit_notices(request, name):
878877
},
879878
context_instance = RequestContext(request))
880879

881-
@role_required("Area Director", "Secretariat")
882-
def telechat_date(request, name):
883-
doc = get_object_or_404(Document, type="draft", name=name)
884-
login = request.user.person
885-
886-
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
887-
initial_returning_item = bool(e and e.returning_item)
888-
889-
initial = dict(telechat_date=e.telechat_date if e else None,
890-
returning_item = initial_returning_item,
891-
)
892-
if request.method == "POST":
893-
form = TelechatForm(request.POST, initial=initial)
894-
895-
if form.is_valid():
896-
update_telechat(request, doc, login, form.cleaned_data['telechat_date'],form.cleaned_data['returning_item'])
897-
return redirect('doc_view', name=doc.name)
898-
else:
899-
form = TelechatForm(initial=initial)
900-
901-
return render_to_response('doc/edit_telechat_date.html',
902-
dict(doc=doc,
903-
form=form,
904-
user=request.user,
905-
login=login),
906-
context_instance=RequestContext(request))
907-
908-
909880
class IESGNoteForm(forms.Form):
910881
note = forms.CharField(widget=forms.Textarea, label="IESG note", required=False)
911882

ietf/doc/views_status_change.py

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
from django.conf import settings
1010

1111
from ietf.doc.models import ( Document, DocAlias, State, DocEvent, BallotDocEvent,
12-
BallotPositionDocEvent, NewRevisionDocEvent, TelechatDocEvent, WriteupDocEvent,
12+
BallotPositionDocEvent, NewRevisionDocEvent, WriteupDocEvent,
1313
save_document_in_history )
14-
from ietf.doc.forms import TelechatForm, AdForm, NotifyForm
14+
from ietf.doc.forms import AdForm, NotifyForm
1515
from ietf.doc.lastcall import request_last_call
1616
from ietf.doc.utils import get_document_content, add_state_change_event, update_telechat, close_open_ballots, create_ballot_if_not_open
1717
from ietf.doc.views_ballot import LastCallTextForm
@@ -590,34 +590,6 @@ def start_rfc_status_change(request,name):
590590
},
591591
context_instance = RequestContext(request))
592592

593-
594-
@role_required("Area Director", "Secretariat")
595-
def telechat_date(request, name):
596-
doc = get_object_or_404(Document, type="statchg", name=name)
597-
login = request.user.person
598-
599-
e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat")
600-
initial_returning_item = bool(e and e.returning_item)
601-
602-
initial = dict(telechat_date=e.telechat_date if e else None,
603-
returning_item = initial_returning_item,
604-
)
605-
if request.method == "POST":
606-
form = TelechatForm(request.POST, initial=initial)
607-
608-
if form.is_valid():
609-
update_telechat(request, doc, login, form.cleaned_data['telechat_date'], form.cleaned_data['returning_item'])
610-
return redirect("doc_view", name=doc.name)
611-
else:
612-
form = TelechatForm(initial=initial)
613-
614-
return render_to_response('doc/edit_telechat_date.html',
615-
dict(doc=doc,
616-
form=form,
617-
user=request.user,
618-
login=login),
619-
context_instance=RequestContext(request))
620-
621593
@role_required("Area Director", "Secretariat")
622594
def edit_relations(request, name):
623595
"""Change the affected set of RFCs"""

0 commit comments

Comments
 (0)