Skip to content

Commit 1f2044b

Browse files
committed
Merged in [13212] from rcross@amsl.com:
Fix issue in telechat app where ballot positions for WG actions are incorrect. Fixes ietf-tools#1336. - Legacy-Id: 13213 Note: SVN reference [13212] has been migrated to Git commit 70ccb0b
2 parents f5dd8c7 + 70ccb0b commit 1f2044b

4 files changed

Lines changed: 68 additions & 5 deletions

File tree

ietf/secr/telechat/forms.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,13 @@
1919
class BallotForm(forms.Form):
2020
name = forms.CharField(max_length=50,widget=forms.HiddenInput)
2121
id = forms.IntegerField(widget=forms.HiddenInput)
22-
position = forms.ModelChoiceField(queryset=BallotPositionName.objects.exclude(slug='block').order_by('order'), widget=forms.RadioSelect, initial="norecord", required=True)
22+
position = forms.ModelChoiceField(queryset=BallotPositionName.objects.all(), widget=forms.RadioSelect, initial="norecord", required=True)
2323

24+
def __init__(self, *args, **kwargs):
25+
ballot_type = kwargs.pop("ballot_type")
26+
super(BallotForm, self).__init__(*args, **kwargs)
27+
self.fields['position'].queryset = ballot_type.positions.order_by('order')
28+
2429
class ChangeStateForm(forms.Form):
2530
'''
2631
This form needs to handle documents of different types (draft, and conflrev for now).

ietf/secr/telechat/tests.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
import datetime
2+
from pyquery import PyQuery
23

34
from django.urls import reverse
45

6+
from ietf.doc.models import Document, State, BallotDocEvent, BallotType
7+
from ietf.doc.utils import update_telechat
58
from ietf.utils.test_utils import TestCase
69
from ietf.iesg.models import TelechatDate
7-
10+
from ietf.person.models import Person
11+
from ietf.secr.telechat.views import get_next_telechat_date
12+
from ietf.utils.test_data import make_test_data
813

914
SECR_USER='secretary'
1015

@@ -30,3 +35,43 @@ def test_doc(self):
3035
response = self.client.get(url)
3136
self.assertEqual(response.status_code, 200)
3237

38+
def test_doc_detail_draft(self):
39+
draft = make_test_data()
40+
d = get_next_telechat_date()
41+
date = d.strftime('%Y-%m-%d')
42+
by=Person.objects.get(name="(System)")
43+
update_telechat(None, draft, by, date)
44+
url = reverse('ietf.secr.telechat.views.doc_detail', kwargs={'date':date, 'name':draft.name})
45+
self.client.login(username="secretary", password="secretary+password")
46+
response = self.client.get(url)
47+
self.assertEqual(response.status_code, 200)
48+
q = PyQuery(response.content)
49+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Yes')").length,1)
50+
self.assertEqual(q("#telechat-positions-table").find("th:contains('No Objection')").length,1)
51+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Discuss')").length,1)
52+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Abstain')").length,1)
53+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Recuse')").length,1)
54+
self.assertEqual(q("#telechat-positions-table").find("th:contains('No Record')").length,1)
55+
56+
def test_doc_detail_charter(self):
57+
make_test_data()
58+
by=Person.objects.get(name="(System)")
59+
charter = Document.objects.filter(type='charter').first()
60+
charter.set_state(State.objects.get(used=True, slug="intrev", type="charter"))
61+
last_week = datetime.date.today()-datetime.timedelta(days=7)
62+
BallotDocEvent.objects.create(type='created_ballot',by=by,doc=charter, rev=charter.rev,
63+
ballot_type=BallotType.objects.get(doc_type=charter.type,slug='r-extrev'),
64+
time=last_week)
65+
d = get_next_telechat_date()
66+
date = d.strftime('%Y-%m-%d')
67+
update_telechat(None, charter, by, date)
68+
url = reverse('ietf.secr.telechat.views.doc_detail', kwargs={'date':date, 'name':charter.name})
69+
self.client.login(username="secretary", password="secretary+password")
70+
response = self.client.get(url)
71+
self.assertEqual(response.status_code, 200)
72+
q = PyQuery(response.content)
73+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Yes')").length,1)
74+
self.assertEqual(q("#telechat-positions-table").find("th:contains('No Objection')").length,1)
75+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Block')").length,1)
76+
self.assertEqual(q("#telechat-positions-table").find("th:contains('Abstain')").length,1)
77+
self.assertEqual(q("#telechat-positions-table").find("th:contains('No Record')").length,1)

ietf/secr/telechat/views.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44
from django.contrib import messages
55
from django.forms.formsets import formset_factory
66
from django.shortcuts import render, get_object_or_404, redirect
7+
from django.utils.functional import curry
78

8-
from ietf.doc.models import DocEvent, Document, BallotDocEvent, BallotPositionDocEvent, WriteupDocEvent
9+
from ietf.doc.models import DocEvent, Document, BallotDocEvent, BallotPositionDocEvent, BallotType, WriteupDocEvent
910
from ietf.doc.utils import get_document_content, add_state_change_event
1011
from ietf.person.models import Person
1112
from ietf.doc.lastcall import request_last_call
@@ -63,7 +64,6 @@ def get_doc_writeup(doc):
6364
if doc.has_rfc_editor_note():
6465
rfced_note = doc.latest_event(WriteupDocEvent, type="changed_rfc_editor_note_text")
6566
writeup = writeup + "\n\n" + rfced_note.text
66-
6767
if doc.type_id == 'charter':
6868
latest = doc.latest_event(WriteupDocEvent, type='changed_ballot_writeup_text')
6969
if latest:
@@ -195,7 +195,14 @@ def doc_detail(request, date, name):
195195
initial_state = {'state':doc.get_state(state_type).pk,
196196
'substate':tag}
197197

198+
# need to use curry here to pass custom variable to form init
199+
if doc.active_ballot():
200+
ballot_type = doc.active_ballot().ballot_type
201+
else:
202+
ballot_type = BallotType.objects.get(doc_type='draft')
198203
BallotFormset = formset_factory(BallotForm, extra=0)
204+
BallotFormset.form.__init__ = curry(BallotForm.__init__, ballot_type=ballot_type)
205+
199206
agenda = agenda_data(date=date)
200207
header = get_section_header(doc, agenda)
201208

@@ -282,6 +289,7 @@ def doc_detail(request, date, name):
282289
conflictdoc = None
283290

284291
return render(request, 'telechat/doc.html', {
292+
'ballot_type': ballot_type,
285293
'date': date,
286294
'document': doc,
287295
'conflictdoc': conflictdoc,

ietf/secr/templates/telechat/doc.html

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ <h3>{{ document.name }}-{{ document.rev }} ({{ document.intended_std_level }})</
2828
<form action="" method="post">{% csrf_token %}
2929
{{ formset.management_form }}
3030
<table id="telechat-positions-table">
31-
<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>
31+
<tr>
32+
<th>Area Director</th>
33+
{% for position in document.active_ballot.ballot_type.positions.all %}
34+
<th>{{ position.name }}</th>
35+
{% endfor %}
36+
</tr>
3237
{% for form in formset.forms %}
3338
<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>
3439
{% with form.position as field %}

0 commit comments

Comments
 (0)