def do_undefer_ballot(request, doc): ''' Helper function to perform undefer of ballot. Takes the Request object, for use in logging, and the Document object. ''' login = request.user.person telechat_date = TelechatDate.objects.active().order_by("date")[0].date save_document_in_history(doc) new_state = doc.get_state() prev_tags = new_tags = [] if doc.type_id == 'draft': new_state = State.objects.get(used=True, type="draft-iesg", slug='iesg-eva') prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) elif doc.type_id in ['conflrev','statchg']: new_state = State.objects.get(used=True, type=doc.type_id, slug='iesgeval') prev_state = doc.get_state(new_state.type_id if new_state else None) doc.set_state(new_state) doc.tags.remove(*prev_tags) e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags) doc.time = (e and e.time) or datetime.datetime.now() doc.save() update_telechat(request, doc, login, telechat_date) email_state_changed(request, doc, e.desc) email_ballot_undeferred(request, doc, login.plain_name(), telechat_date)
def test_doc_detail_draft(self): draft = make_test_data() d = get_next_telechat_date() date = d.strftime('%Y-%m-%d') by = Person.objects.get(name="(System)") update_telechat(None, draft, by, date) url = reverse('ietf.secr.telechat.views.doc_detail', kwargs={ 'date': date, 'name': draft.name }) self.client.login(username="******", password="******") response = self.client.get(url) self.assertEqual(response.status_code, 200) q = PyQuery(response.content) self.assertEqual( q("#telechat-positions-table").find("th:contains('Yes')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('No Objection')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('Discuss')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('Abstain')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('Recuse')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('No Record')").length, 1)
def start_rfc_status_change(request,name): """Start the RFC status change review process, setting the initial shepherding AD, and possibly putting the review on a telechat.""" if name: if not re.match("(?i)rfc[0-9]{1,4}",name): raise Http404 seed_rfc = get_object_or_404(Document, type="draft", docalias__name=name) login = request.user.person relation_slugs = DocRelationshipName.objects.filter(slug__in=STATUSCHANGE_RELATIONS) if request.method == 'POST': form = StartStatusChangeForm(request.POST) if form.is_valid(): iesg_group = Group.objects.get(acronym='iesg') status_change=Document( type_id = "statchg", name = 'status-change-'+form.cleaned_data['document_name'], title = form.cleaned_data['title'], rev = "00", ad = form.cleaned_data['ad'], notify = form.cleaned_data['notify'], stream_id = 'ietf', group = iesg_group, ) status_change.save() status_change.set_state(form.cleaned_data['create_in_state']) DocAlias.objects.create( name= 'status-change-'+form.cleaned_data['document_name'], document=status_change ) for key in form.cleaned_data['relations']: status_change.relateddocument_set.create(target=DocAlias.objects.get(name=key), relationship_id=form.cleaned_data['relations'][key]) tc_date = form.cleaned_data['telechat_date'] if tc_date: update_telechat(request, status_change, login, tc_date) return HttpResponseRedirect(status_change.get_absolute_url()) else: init = {} if name: init['title'] = "%s to CHANGETHIS" % seed_rfc.title init['document_name'] = "%s-to-CHANGETHIS" % seed_rfc.canonical_name() relations={} relations[seed_rfc.canonical_name()]=None init['relations'] = relations form = StartStatusChangeForm(initial=init) return render_to_response('doc/status_change/start.html', {'form': form, 'relation_slugs': relation_slugs, }, context_instance = RequestContext(request))
def defer_ballot(request, name): """Signal post-pone of ballot, notifying relevant parties.""" doc = get_object_or_404(Document, docalias__name=name) if doc.type_id not in ('draft','conflrev','statchg'): raise Http404() interesting_state = dict(draft='draft-iesg',conflrev='conflrev',statchg='statchg') state = doc.get_state(interesting_state[doc.type_id]) if not state or state.slug=='defer' or not doc.telechat_date(): raise Http404() login = request.user.person telechat_date = TelechatDate.objects.active().order_by("date")[1].date if request.method == 'POST': save_document_in_history(doc) new_state = doc.get_state() prev_tags = new_tags = [] if doc.type_id == 'draft': new_state = State.objects.get(used=True, type="draft-iesg", slug='defer') prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) elif doc.type_id in ['conflrev','statchg']: new_state = State.objects.get(used=True, type=doc.type_id, slug='defer') prev_state = doc.get_state(new_state.type_id if new_state else None) doc.set_state(new_state) doc.tags.remove(*prev_tags) e = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags) doc.time = (e and e.time) or datetime.datetime.now() doc.save() email_state_changed(request, doc, e.desc) update_telechat(request, doc, login, telechat_date) email_ballot_deferred(request, doc, login.plain_name(), telechat_date) return HttpResponseRedirect(doc.get_absolute_url()) return render_to_response('doc/ballot/defer_ballot.html', dict(doc=doc, telechat_date=telechat_date, back_url=doc.get_absolute_url()), context_instance=RequestContext(request))
def telechat_date(request, name): doc = get_object_or_404(Document, name=name) login = request.user.person e = doc.latest_event(TelechatDocEvent, type="scheduled_for_telechat") initial_returning_item = bool(e and e.returning_item) prompts = [] if e and doc.type.slug != 'charter': if e.telechat_date==datetime.date.today(): prompts.append( "This document is currently scheduled for today's telechat. " +"Please set the returning item bit carefully.") elif e.telechat_date<datetime.date.today() and has_same_ballot(doc,e.telechat_date): initial_returning_item = True prompts.append( "This document appears to have been on a previous telechat with the same ballot, " +"so the returning item bit has been set. Clear it if that is not appropriate.") else: pass initial = dict(telechat_date=e.telechat_date if e else None, returning_item = initial_returning_item, ) if request.method == "POST": form = TelechatForm(request.POST, initial=initial) if form.is_valid(): if doc.type.slug=='charter': cleaned_returning_item = None else: cleaned_returning_item = form.cleaned_data['returning_item'] update_telechat(request, doc, login, form.cleaned_data['telechat_date'],cleaned_returning_item) return redirect('doc_view', name=doc.name) else: form = TelechatForm(initial=initial) if doc.type.slug=='charter': del form.fields['returning_item'] return render_to_response('doc/edit_telechat_date.html', dict(doc=doc, form=form, user=request.user, prompts=prompts, login=login), context_instance=RequestContext(request))
def test_doc_detail_charter(self): make_test_data() by = Person.objects.get(name="(System)") charter = Document.objects.filter(type='charter').first() charter.set_state( State.objects.get(used=True, slug="intrev", type="charter")) last_week = datetime.date.today() - datetime.timedelta(days=7) BallotDocEvent.objects.create(type='created_ballot', by=by, doc=charter, rev=charter.rev, ballot_type=BallotType.objects.get( doc_type=charter.type, slug='r-extrev'), time=last_week) d = get_next_telechat_date() date = d.strftime('%Y-%m-%d') update_telechat(None, charter, by, date) url = reverse('ietf.secr.telechat.views.doc_detail', kwargs={ 'date': date, 'name': charter.name }) self.client.login(username="******", password="******") response = self.client.get(url) self.assertEqual(response.status_code, 200) q = PyQuery(response.content) self.assertEqual( q("#telechat-positions-table").find("th:contains('Yes')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('No Objection')").length, 1) self.assertEqual( q("#telechat-positions-table").find("th:contains('Block')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('Abstain')").length, 1) self.assertEqual( q("#telechat-positions-table").find( "th:contains('No Record')").length, 1)
def handle_reschedule_form(request, doc, dates, status): initial = dict(telechat_date=doc.telechat_date()) formargs = dict(telechat_dates=dates, prefix="%s" % doc.name, initial=initial) if request.method == 'POST': form = RescheduleForm(request.POST, **formargs) if form.is_valid(): update_telechat(request, doc, request.user.person, form.cleaned_data['telechat_date'], False if form.cleaned_data['clear_returning_item'] else None) doc.time = datetime.datetime.now() doc.save() status["changed"] = True else: form = RescheduleForm(**formargs) form.show_clear = doc.returning_item() return form
def start_review_as_secretariat(request, name): """Start the conflict review process, setting the initial shepherding AD, and possibly putting the review on a telechat.""" doc_to_review = start_review_sanity_check(request, name) login = request.user.person if request.method == 'POST': form = StartReviewForm(request.POST) if form.is_valid(): conflict_review = build_conflict_review_document(login = login, doc_to_review = doc_to_review, ad = form.cleaned_data['ad'], notify = form.cleaned_data['notify'], create_in_state = form.cleaned_data['create_in_state'] ) tc_date = form.cleaned_data['telechat_date'] if tc_date: update_telechat(request, conflict_review, login, tc_date) send_conflict_review_started_email(request, conflict_review) return HttpResponseRedirect(conflict_review.get_absolute_url()) else: notify_addresses = build_notify_addresses(doc_to_review) init = { "ad" : Role.objects.filter(group__acronym='ietf',name='chair')[0].person.id, "notify" : u', '.join(notify_addresses), } form = StartReviewForm(initial=init) return render_to_response('doc/conflict_review/start.html', {'form': form, 'doc_to_review': doc_to_review, }, context_instance = RequestContext(request))
def start_review_as_secretariat(request, name): """Start the conflict review process, setting the initial shepherding AD, and possibly putting the review on a telechat.""" doc_to_review = start_review_sanity_check(request, name) login = request.user.person if request.method == 'POST': form = StartReviewForm(request.POST) if form.is_valid(): conflict_review = build_conflict_review_document(login = login, doc_to_review = doc_to_review, ad = form.cleaned_data['ad'], notify = form.cleaned_data['notify'], create_in_state = form.cleaned_data['create_in_state'] ) tc_date = form.cleaned_data['telechat_date'] if tc_date: update_telechat(request, conflict_review, login, tc_date) send_conflict_review_started_email(request, conflict_review) return HttpResponseRedirect(conflict_review.get_absolute_url()) else: notify_addresses = build_notify_addresses(doc_to_review) init = { "ad" : Role.objects.filter(group__acronym='ietf',name='chair')[0].person.id, "notify" : u', '.join(notify_addresses), } form = StartReviewForm(initial=init) return render(request, 'doc/conflict_review/start.html', {'form': form, 'doc_to_review': doc_to_review, }, )
def do_undefer_ballot(request, doc): ''' Helper function to perform undefer of ballot. Takes the Request object, for use in logging, and the Document object. ''' by = request.user.person telechat_date = TelechatDate.objects.active().order_by("date")[0].date new_state = doc.get_state() prev_tags = [] new_tags = [] if doc.type_id == 'draft': new_state = State.objects.get(used=True, type="draft-iesg", slug='iesg-eva') prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) elif doc.type_id in ['conflrev', 'statchg']: new_state = State.objects.get(used=True, type=doc.type_id, slug='iesgeval') prev_state = doc.get_state(new_state.type_id if new_state else None) doc.set_state(new_state) doc.tags.remove(*prev_tags) events = [] state_change_event = add_state_change_event(doc, by, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags) if state_change_event: events.append(state_change_event) e = update_telechat(request, doc, by, telechat_date) if e: events.append(e) if events: doc.save_with_history(events) email_ballot_undeferred(request, doc, by.plain_name(), telechat_date)
def handle_reschedule_form(request, doc, dates, status): initial = dict(telechat_date=doc.telechat_date()) formargs = dict(telechat_dates=dates, prefix="%s" % doc.name, initial=initial) if request.method == 'POST': form = RescheduleForm(request.POST, **formargs) if form.is_valid(): e = update_telechat( request, doc, request.user.person, form.cleaned_data['telechat_date'], False if form.cleaned_data['clear_returning_item'] else None) if e: doc.save_with_history([e]) status["changed"] = True else: form = RescheduleForm(**formargs) form.show_clear = doc.returning_item() return form
def defer_ballot(request, name): """Signal post-pone of ballot, notifying relevant parties.""" doc = get_object_or_404(Document, docalias__name=name) if doc.type_id not in ('draft', 'conflrev', 'statchg'): raise Http404 interesting_state = dict(draft='draft-iesg', conflrev='conflrev', statchg='statchg') state = doc.get_state(interesting_state[doc.type_id]) if not state or state.slug == 'defer' or not doc.telechat_date(): raise Http404 login = request.user.person telechat_date = TelechatDate.objects.active().order_by("date")[1].date if request.method == 'POST': new_state = doc.get_state() prev_tags = [] new_tags = [] if doc.type_id == 'draft': new_state = State.objects.get(used=True, type="draft-iesg", slug='defer') prev_tags = doc.tags.filter(slug__in=IESG_SUBSTATE_TAGS) elif doc.type_id in ['conflrev', 'statchg']: new_state = State.objects.get(used=True, type=doc.type_id, slug='defer') prev_state = doc.get_state(new_state.type_id if new_state else None) doc.set_state(new_state) doc.tags.remove(*prev_tags) events = [] state_change_event = add_state_change_event(doc, login, prev_state, new_state, prev_tags=prev_tags, new_tags=new_tags) if state_change_event: events.append(state_change_event) e = update_telechat(request, doc, login, telechat_date) if e: events.append(e) doc.save_with_history(events) email_ballot_deferred(request, doc, login.plain_name(), telechat_date) return HttpResponseRedirect(doc.get_absolute_url()) return render( request, 'doc/ballot/defer_ballot.html', dict(doc=doc, telechat_date=telechat_date, back_url=doc.get_absolute_url()))
def start_rfc_status_change(request, name): """Start the RFC status change review process, setting the initial shepherding AD, and possibly putting the review on a telechat.""" if name: if not re.match("(?i)rfc[0-9]{1,4}", name): raise Http404 seed_rfc = get_object_or_404(Document, type="draft", docalias__name=name) login = request.user.person relation_slugs = DocRelationshipName.objects.filter( slug__in=STATUSCHANGE_RELATIONS) if request.method == 'POST': form = StartStatusChangeForm(request.POST) if form.is_valid(): iesg_group = Group.objects.get(acronym='iesg') status_change = Document.objects.create( type_id="statchg", name='status-change-' + form.cleaned_data['document_name'], title=form.cleaned_data['title'], rev="00", ad=form.cleaned_data['ad'], notify=form.cleaned_data['notify'], stream_id='ietf', group=iesg_group, ) status_change.set_state(form.cleaned_data['create_in_state']) DocAlias.objects.create(name='status-change-' + form.cleaned_data['document_name'], document=status_change) for key in form.cleaned_data['relations']: status_change.relateddocument_set.create( target=DocAlias.objects.get(name=key), relationship_id=form.cleaned_data['relations'][key]) tc_date = form.cleaned_data['telechat_date'] if tc_date: update_telechat(request, status_change, login, tc_date) return HttpResponseRedirect(status_change.get_absolute_url()) else: init = {} if name: init['title'] = "%s to CHANGETHIS" % seed_rfc.title init[ 'document_name'] = "%s-to-CHANGETHIS" % seed_rfc.canonical_name( ) relations = {} relations[seed_rfc.canonical_name()] = None init['relations'] = relations form = StartStatusChangeForm(initial=init) return render( request, 'doc/status_change/start.html', { 'form': form, 'relation_slugs': relation_slugs, }, )