Merged in [14467] from housley@vigilsec.com:
Close any previous ballots when a charter goes to Internal Review or Extrernal Review. Fixes #2421.
- Legacy-Id: 14470
Note: SVN reference [14467] has been migrated to Git commit de6121c6c1
This commit is contained in:
commit
4488fd82a4
|
@ -153,7 +153,73 @@ class EditCharterTests(TestCase):
|
|||
r = self.client.post(url, dict(charter_state=str(State.objects.get(used=True,type="charter",slug="intrev").pk), message="test"))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
self.assertTrue("A new charter" in outbox[-3].get_payload())
|
||||
|
||||
|
||||
def test_already_open_charter_ballot(self):
|
||||
# make sure the right thing happens to the charter ballots as the Secretariat
|
||||
# does the unusual state sequence of: intrev --> extrev --> intrev
|
||||
make_test_data()
|
||||
|
||||
group = Group.objects.get(acronym="ames")
|
||||
charter = group.charter
|
||||
|
||||
url = urlreverse('ietf.doc.views_charter.change_state', kwargs=dict(name=charter.name))
|
||||
login_testing_unauthorized(self, "secretary", url)
|
||||
|
||||
# get the charter state change page
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
# put the charter in "intrev" state
|
||||
s = State.objects.get(used=True, type="charter", slug="intrev")
|
||||
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
self.assertEqual(charter.get_state_slug(), "intrev")
|
||||
self.assertTrue(charter.ballot_open("r-extrev"))
|
||||
|
||||
events_before = charter.docevent_set.count()
|
||||
|
||||
# get the charter state change page again
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
# put the charter in "extrev" state without closing the previous ballot
|
||||
s = State.objects.get(used=True, type="charter", slug="extrev")
|
||||
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
charter = Document.objects.get(name="charter-ietf-%s" % group.acronym)
|
||||
self.assertEqual(charter.get_state_slug(), "extrev")
|
||||
self.assertTrue(charter.ballot_open("approve"))
|
||||
|
||||
# make sure there is a closed_ballot event and a create_ballot event
|
||||
events_now = charter.docevent_set.count()
|
||||
self.assertTrue(events_now > events_before)
|
||||
|
||||
def find_event(t):
|
||||
return [e for e in charter.docevent_set.all()[:events_now - events_before] if e.type == t]
|
||||
|
||||
self.assertTrue(find_event("closed_ballot"))
|
||||
self.assertTrue(find_event("created_ballot"))
|
||||
|
||||
events_before = events_now
|
||||
|
||||
# get the charter state change page for a third time
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
||||
# put the charter back in "intrev" state without closing the previous ballot
|
||||
s = State.objects.get(used=True, type="charter", slug="intrev")
|
||||
r = self.client.post(url, dict(charter_state=str(s.pk), message="test message"))
|
||||
self.assertEqual(r.status_code, 302)
|
||||
charter = Document.objects.get(name="charter-ietf-%s" % group.acronym)
|
||||
self.assertEqual(charter.get_state_slug(), "intrev")
|
||||
self.assertTrue(charter.ballot_open("r-extrev"))
|
||||
|
||||
# make sure there is a closed_ballot event and a create_ballot event
|
||||
events_now = charter.docevent_set.count()
|
||||
self.assertTrue(events_now > events_before)
|
||||
self.assertTrue(find_event("closed_ballot"))
|
||||
self.assertTrue(find_event("created_ballot"))
|
||||
|
||||
def test_edit_telechat_date(self):
|
||||
make_test_data()
|
||||
|
||||
|
|
|
@ -176,6 +176,16 @@ def needed_ballot_positions(doc, active_positions):
|
|||
|
||||
return " ".join(answer)
|
||||
|
||||
def create_ballot(doc, by, ballot_slug, time=None):
|
||||
close_open_ballots(doc, by)
|
||||
if time:
|
||||
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev, time=time)
|
||||
else:
|
||||
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev)
|
||||
e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
|
||||
e.desc = u'Created "%s" ballot' % e.ballot_type.name
|
||||
e.save()
|
||||
|
||||
def create_ballot_if_not_open(request, doc, by, ballot_slug, time=None):
|
||||
ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
|
||||
if not doc.ballot_open(ballot_slug):
|
||||
|
|
|
@ -15,7 +15,7 @@ from ietf.doc.models import ( Document, DocAlias, DocHistory, State, DocEvent,
|
|||
BallotDocEvent, BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent,
|
||||
WriteupDocEvent )
|
||||
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
|
||||
create_ballot_if_not_open, get_chartering_type )
|
||||
create_ballot, get_chartering_type )
|
||||
from ietf.doc.utils_charter import ( historic_milestones_for_charter,
|
||||
approved_revision, default_review_text, default_action_text,
|
||||
generate_ballot_writeup, generate_issue_ballot_mail, next_revision,
|
||||
|
@ -152,16 +152,16 @@ def change_state(request, name, option=None):
|
|||
|
||||
if charter_state.slug == "intrev" and group.type_id == "wg":
|
||||
if request.POST.get("ballot_wo_extern"):
|
||||
create_ballot_if_not_open(request, charter, by, "r-wo-ext")
|
||||
create_ballot(charter, by, "r-wo-ext")
|
||||
else:
|
||||
create_ballot_if_not_open(request, charter, by, "r-extrev")
|
||||
create_ballot(charter, by, "r-extrev")
|
||||
(e1, e2) = default_review_text(group, charter, by)
|
||||
e1.save()
|
||||
e2.save()
|
||||
e = default_action_text(group, charter, by)
|
||||
e.save()
|
||||
elif charter_state.slug in ["extrev","iesgrev"]:
|
||||
create_ballot_if_not_open(request, charter, by, "approve")
|
||||
create_ballot(charter, by, "approve")
|
||||
elif charter_state.slug == "approved":
|
||||
change_group_state_after_charter_approval(group, by)
|
||||
fix_charter_revision_after_approval(charter, by)
|
||||
|
|
Loading…
Reference in a new issue