Skip to content

Commit de6121c

Browse files
committed
Close any previous ballots when a charter goes to Internal Review or Extrernal Review. Fixes ietf-tools#2421.
- Legacy-Id: 14467
1 parent 5ac6cf3 commit de6121c

3 files changed

Lines changed: 82 additions & 5 deletions

File tree

ietf/doc/tests_charter.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,74 @@ def find_event(t):
153153
r = self.client.post(url, dict(charter_state=str(State.objects.get(used=True,type="charter",slug="intrev").pk), message="test"))
154154
self.assertEqual(r.status_code, 302)
155155
self.assertTrue("A new charter" in outbox[-3].get_payload())
156-
156+
157+
def test_already_open_charter_ballot(self):
158+
# make sure the right thing happens to the charter ballots as the Secretariat
159+
# does the unusual state sequence of: intrev --> extrev --> intrev
160+
make_test_data()
161+
162+
group = Group.objects.get(acronym="ames")
163+
charter = group.charter
164+
165+
url = urlreverse('ietf.doc.views_charter.change_state', kwargs=dict(name=charter.name))
166+
login_testing_unauthorized(self, "secretary", url)
167+
by = Person.objects.get(user__username="secretary")
168+
169+
# get the charter state change page
170+
r = self.client.get(url)
171+
self.assertEqual(r.status_code, 200)
172+
173+
# put the charter in "intrev" state
174+
s = State.objects.get(used=True, type="charter", slug="intrev")
175+
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
176+
self.assertEqual(r.status_code, 302)
177+
self.assertEqual(charter.get_state_slug(), "intrev")
178+
self.assertTrue(charter.ballot_open("r-extrev"))
179+
180+
events_before = charter.docevent_set.count()
181+
182+
# get the charter state change page again
183+
r = self.client.get(url)
184+
self.assertEqual(r.status_code, 200)
185+
186+
# put the charter in "extrev" state without closing the previous ballot
187+
s = State.objects.get(used=True, type="charter", slug="extrev")
188+
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
189+
self.assertEqual(r.status_code, 302)
190+
charter = Document.objects.get(name="charter-ietf-%s" % group.acronym)
191+
self.assertEqual(charter.get_state_slug(), "extrev")
192+
self.assertTrue(charter.ballot_open("approve"))
193+
194+
# make sure there is a closed_ballot event and a create_ballot event
195+
events_now = charter.docevent_set.count()
196+
self.assertTrue(events_now > events_before)
197+
198+
def find_event(t):
199+
return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t]
200+
201+
self.assertTrue(find_event("closed_ballot"))
202+
self.assertTrue(find_event("created_ballot"))
203+
204+
events_before = events_now
205+
206+
# get the charter state change page for a third time
207+
r = self.client.get(url)
208+
self.assertEqual(r.status_code, 200)
209+
210+
# put the charter back in "intrev" state without closing the previous ballot
211+
s = State.objects.get(used=True, type="charter", slug="intrev")
212+
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
213+
self.assertEqual(r.status_code, 302)
214+
charter = Document.objects.get(name="charter-ietf-%s" % group.acronym)
215+
self.assertEqual(charter.get_state_slug(), "intrev")
216+
self.assertTrue(charter.ballot_open("r-extrev"))
217+
218+
# make sure there is a closed_ballot event and a create_ballot event
219+
events_now = charter.docevent_set.count()
220+
self.assertTrue(events_now > events_before)
221+
self.assertTrue(find_event("closed_ballot"))
222+
self.assertTrue(find_event("created_ballot"))
223+
157224
def test_edit_telechat_date(self):
158225
make_test_data()
159226

ietf/doc/utils.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,16 @@ def needed_ballot_positions(doc, active_positions):
174174

175175
return " ".join(answer)
176176

177+
def create_ballot(doc, by, ballot_slug, time=None):
178+
close_open_ballots(doc, by)
179+
if time:
180+
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev, time=time)
181+
else:
182+
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev)
183+
e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
184+
e.desc = u'Created "%s" ballot' % e.ballot_type.name
185+
e.save()
186+
177187
def create_ballot_if_not_open(doc, by, ballot_slug, time=None):
178188
if not doc.ballot_open(ballot_slug):
179189
if time:

ietf/doc/views_charter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
BallotDocEvent, BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent,
1616
WriteupDocEvent )
1717
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
18-
create_ballot_if_not_open, get_chartering_type )
18+
create_ballot, create_ballot_if_not_open, get_chartering_type )
1919
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
2020
approved_revision, default_review_text, default_action_text,
2121
generate_ballot_writeup, generate_issue_ballot_mail, next_revision,
@@ -152,16 +152,16 @@ def change_state(request, name, option=None):
152152

153153
if charter_state.slug == "intrev" and group.type_id == "wg":
154154
if request.POST.get("ballot_wo_extern"):
155-
create_ballot_if_not_open(charter, by, "r-wo-ext")
155+
create_ballot(charter, by, "r-wo-ext")
156156
else:
157-
create_ballot_if_not_open(charter, by, "r-extrev")
157+
create_ballot(charter, by, "r-extrev")
158158
(e1, e2) = default_review_text(group, charter, by)
159159
e1.save()
160160
e2.save()
161161
e = default_action_text(group, charter, by)
162162
e.save()
163163
elif charter_state.slug in ["extrev","iesgrev"]:
164-
create_ballot_if_not_open(charter, by, "approve")
164+
create_ballot(charter, by, "approve")
165165
elif charter_state.slug == "approved":
166166
change_group_state_after_charter_approval(group, by)
167167
fix_charter_revision_after_approval(charter, by)

0 commit comments

Comments
 (0)