From 70ccb0b769f8f6195fdfaebc2dcbe9bcaa4b82b9 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Thu, 13 Apr 2017 00:59:36 +0000 Subject: [PATCH] Fix issue in telechat app where ballot positions for WG actions are incorrect. Fixes #1336. Commit ready for merge - Legacy-Id: 13212 --- ietf/secr/telechat/forms.py | 7 +++- ietf/secr/telechat/tests.py | 47 ++++++++++++++++++++++++++- ietf/secr/telechat/views.py | 19 ++++++++--- ietf/secr/templates/telechat/doc.html | 7 +++- 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/ietf/secr/telechat/forms.py b/ietf/secr/telechat/forms.py index 0fe3b383c..ae8fe8724 100644 --- a/ietf/secr/telechat/forms.py +++ b/ietf/secr/telechat/forms.py @@ -19,8 +19,13 @@ TELECHAT_TAGS = ('point','ad-f-up','extpty','need-rev') class BallotForm(forms.Form): name = forms.CharField(max_length=50,widget=forms.HiddenInput) id = forms.IntegerField(widget=forms.HiddenInput) - position = forms.ModelChoiceField(queryset=BallotPositionName.objects.exclude(slug='block').order_by('order'), widget=forms.RadioSelect, initial="norecord", required=True) + position = forms.ModelChoiceField(queryset=BallotPositionName.objects.all(), widget=forms.RadioSelect, initial="norecord", required=True) + def __init__(self, *args, **kwargs): + ballot_type = kwargs.pop("ballot_type") + super(BallotForm, self).__init__(*args, **kwargs) + self.fields['position'].queryset = ballot_type.positions.order_by('order') + class ChangeStateForm(forms.Form): ''' This form needs to handle documents of different types (draft, and conflrev for now). diff --git a/ietf/secr/telechat/tests.py b/ietf/secr/telechat/tests.py index 97126d7e9..6ef51448c 100644 --- a/ietf/secr/telechat/tests.py +++ b/ietf/secr/telechat/tests.py @@ -1,10 +1,15 @@ import datetime +from pyquery import PyQuery from django.urls import reverse +from ietf.doc.models import Document, State, BallotDocEvent, BallotType +from ietf.doc.utils import update_telechat from ietf.utils.test_utils import TestCase from ietf.iesg.models import TelechatDate - +from ietf.person.models import Person +from ietf.secr.telechat.views import get_next_telechat_date +from ietf.utils.test_data import make_test_data SECR_USER='secretary' @@ -30,3 +35,43 @@ class SecrTelechatTestCase(TestCase): response = self.client.get(url) self.assertEqual(response.status_code, 200) + 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="secretary", password="secretary+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 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="secretary", password="secretary+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) diff --git a/ietf/secr/telechat/views.py b/ietf/secr/telechat/views.py index a3b76ecb7..31f13844d 100644 --- a/ietf/secr/telechat/views.py +++ b/ietf/secr/telechat/views.py @@ -4,8 +4,9 @@ import datetime from django.contrib import messages from django.forms.formsets import formset_factory from django.shortcuts import render, get_object_or_404, redirect +from django.utils.functional import curry -from ietf.doc.models import DocEvent, Document, BallotDocEvent, BallotPositionDocEvent, WriteupDocEvent +from ietf.doc.models import DocEvent, Document, BallotDocEvent, BallotPositionDocEvent, BallotType, WriteupDocEvent from ietf.doc.utils import get_document_content, add_state_change_event from ietf.person.models import Person from ietf.doc.lastcall import request_last_call @@ -58,11 +59,11 @@ def get_doc_writeup(doc): writeup = 'This document has no writeup' if doc.type_id == 'draft': latest = doc.latest_event(WriteupDocEvent, type='changed_ballot_writeup_text') - if latest and doc.has_rfc_editor_note(): - rfced_note = doc.latest_event(WriteupDocEvent, type="changed_rfc_editor_note_text") - writeup = latest.text + "\n\n" + rfced_note.text - else: + if latest: writeup = latest.text + if doc.has_rfc_editor_note(): + rfced_note = doc.latest_event(WriteupDocEvent, type="changed_rfc_editor_note_text") + writeup = writeup + "\n\n" + rfced_note.text if doc.type_id == 'charter': latest = doc.latest_event(WriteupDocEvent, type='changed_ballot_writeup_text') if latest: @@ -194,7 +195,14 @@ def doc_detail(request, date, name): initial_state = {'state':doc.get_state(state_type).pk, 'substate':tag} + # need to use curry here to pass custom variable to form init + if doc.active_ballot(): + ballot_type = doc.active_ballot().ballot_type + else: + ballot_type = BallotType.objects.get(doc_type='draft') BallotFormset = formset_factory(BallotForm, extra=0) + BallotFormset.form = staticmethod(curry(BallotForm, ballot_type=ballot_type)) + agenda = agenda_data(date=date) header = get_section_header(doc, agenda) @@ -281,6 +289,7 @@ def doc_detail(request, date, name): conflictdoc = None return render(request, 'telechat/doc.html', { + 'ballot_type': ballot_type, 'date': date, 'document': doc, 'conflictdoc': conflictdoc, diff --git a/ietf/secr/templates/telechat/doc.html b/ietf/secr/templates/telechat/doc.html index 89aac3cdf..3ec2422e0 100644 --- a/ietf/secr/templates/telechat/doc.html +++ b/ietf/secr/templates/telechat/doc.html @@ -28,7 +28,12 @@
{% csrf_token %} {{ formset.management_form }} - + + + {% for position in document.active_ballot.ballot_type.positions.all %} + + {% endfor %} + {% for form in formset.forms %} {% with form.position as field %}
Area DirectorYesNo ObjectionsDiscussAbstainRecuseNo Position
Area Director{{ position.name }}
{{ form.initial.name }}{{ form.name }}{{ form.id }}