From 6d0d014b0dd3771823a01c950d41a1397fd69b33 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Thu, 5 Apr 2012 16:20:25 +0000 Subject: [PATCH] Close charter ballots when the charter is approved or abandoned. - Legacy-Id: 4262 --- ietf/doc/utils.py | 19 +++++++++++++++++++ ietf/wgcharter/tests.py | 5 +++-- ietf/wgcharter/views.py | 18 +++++++++--------- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py index 739a7b8ba..2e1dfe4ac 100644 --- a/ietf/doc/utils.py +++ b/ietf/doc/utils.py @@ -107,6 +107,25 @@ def get_chartering_type(doc): return chartering +def ballot_open(doc, ballot_type_slug): + e = doc.latest_event(BallotDocEvent, ballot_type__slug=ballot_type_slug) + return e and not e.type == "closed_ballot" + +def create_ballot_if_not_open(doc, by, ballot_type_slug): + if not ballot_open(doc, ballot_type_slug): + e = BallotDocEvent(type="created_ballot", by=by, doc=doc) + e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_type_slug) + e.desc = u'Created "%s" ballot' % e.ballot_type.name + e.save() + +def close_open_ballots(doc, by): + for t in BallotType.objects.filter(doc_type=doc.type_id): + if ballot_open(doc, t.slug): + e = BallotDocEvent(type="closed_ballot", doc=doc, by=by) + e.ballot_type = t + e.desc = 'Closed "%s" ballot' % t.name + e.save() + def augment_with_telechat_date(docs): """Add a telechat_date attribute to each document with the scheduled telechat or None if it's not scheduled.""" diff --git a/ietf/wgcharter/tests.py b/ietf/wgcharter/tests.py index 96f4d89b1..f6838e45f 100644 --- a/ietf/wgcharter/tests.py +++ b/ietf/wgcharter/tests.py @@ -13,13 +13,13 @@ from ietf.utils.test_utils import login_testing_unauthorized from pyquery import PyQuery from ietf.doc.models import * +from ietf.doc.utils import * from ietf.group.models import * from ietf.group.utils import * from ietf.name.models import * from ietf.person.models import * from ietf.iesg.models import TelechatDate - -from utils import * +from ietf.wgcharter.utils import * class EditCharterTestCase(django.test.TestCase): fixtures = ['names'] @@ -195,6 +195,7 @@ class CharterApproveBallotTestCase(django.test.TestCase): charter = Document.objects.get(name=charter.name) self.assertEquals(charter.get_state_slug(), "approved") + self.assertTrue(not ballot_open(charter, "approve")) self.assertEquals(charter.rev, "01") self.assertTrue(os.path.exists(os.path.join(self.charter_dir, "charter-ietf-%s-%s.txt" % (group.acronym, charter.rev)))) diff --git a/ietf/wgcharter/views.py b/ietf/wgcharter/views.py index 847fdd590..ceb6349e2 100644 --- a/ietf/wgcharter/views.py +++ b/ietf/wgcharter/views.py @@ -16,6 +16,7 @@ from ietf.utils.mail import send_mail_text, send_mail_preformatted from ietf.ietfauth.decorators import has_role, role_required from ietf.iesg.models import TelechatDate from ietf.doc.models import * +from ietf.doc.utils import create_ballot_if_not_open, close_open_ballots from ietf.name.models import * from ietf.person.models import * from ietf.group.models import * @@ -25,7 +26,7 @@ from ietf.wgcharter.utils import * class ChangeStateForm(forms.Form): - charter_state = forms.ModelChoiceField(State.objects.filter(type="charter", slug__in=["infrev", "intrev", "extrev", "iesgrev", "approved"]), label="Charter state", empty_label=None, required=False) + charter_state = forms.ModelChoiceField(State.objects.filter(type="charter", slug__in=["infrev", "intrev", "extrev", "iesgrev"]), label="Charter state", empty_label=None, required=False) initial_time = forms.IntegerField(initial=0, label="Review time", help_text="(in weeks)", required=False) message = forms.CharField(widget=forms.Textarea, help_text="Optional message to the Secretariat", required=False) comment = forms.CharField(widget=forms.Textarea, help_text="Optional comment for the charter history", required=False) @@ -90,6 +91,9 @@ def change_state(request, name, option=None): if option != "abandon": log_state_changed(request, charter, login, prev) else: + # kill hanging ballots + close_open_ballots(charter, login) + # Special log for abandoned efforts e = DocEvent(type="changed_document", doc=charter, by=login) e.desc = "IESG has abandoned the chartering effort" @@ -107,15 +111,9 @@ def change_state(request, name, option=None): email_secretariat(request, wg, "state-%s" % charter_state.slug, message) if charter_state.slug == "intrev": - e = BallotDocEvent(type="created_ballot", by=login, doc=charter) - e.ballot_type = BallotType.objects.get(doc_type=charter.type, slug="r-extrev") - e.desc = u"Created ballot for approving charter for external review" - e.save() + create_ballot_if_not_open(charter, login, "r-extrev") elif charter_state.slug == "iesgrev": - e = BallotDocEvent(type="created_ballot", by=login, doc=charter) - e.ballot_type = BallotType.objects.get(doc_type=charter.type, slug="approve") - e.desc = u"Created ballot for approving charter" - e.save() + create_ballot_if_not_open(charter, login, "approve") if charter_state.slug == "infrev" and clean["initial_time"] and clean["initial_time"] != 0: e = InitialReviewDocEvent(type="initial_review", by=login, doc=charter) @@ -495,6 +493,8 @@ def approve_ballot(request, name): wg.state = new_state charter.set_state(new_charter_state) + close_open_ballots(charter, login) + e = DocEvent(doc=charter, by=login) e.type = "iesg_approved" e.desc = "IESG has approved the charter"