Fix issue in telechat app where ballot positions for WG actions are incorrect. Fixes #1336. Commit ready for merge

- Legacy-Id: 13212
This commit is contained in:
Ryan Cross 2017-04-13 00:59:36 +00:00
parent 767e9f9695
commit 70ccb0b769
4 changed files with 72 additions and 8 deletions

View file

@ -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).

View file

@ -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)

View file

@ -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,

View file

@ -28,7 +28,12 @@
<form action="" method="post">{% csrf_token %}
{{ formset.management_form }}
<table id="telechat-positions-table">
<tr><th>Area Director</th><th>Yes</th><th>No Objections</th><th>Discuss</th><th>Abstain</th><th>Recuse</th><th>No Position</th></tr>
<tr>
<th>Area Director</th>
{% for position in document.active_ballot.ballot_type.positions.all %}
<th>{{ position.name }}</th>
{% endfor %}
</tr>
{% for form in formset.forms %}
<tr{% if form.initial.position == 'norecord' or form.initial.position == None %} class="green-row"{% endif %}{% if form.initial.position == 'discuss' %} class="red-row"{% endif %}><td>{{ form.initial.name }}{{ form.name }}{{ form.id }}</td>
{% with form.position as field %}