From 97206c6eeb5f9bbe45d7b0a33d3789854d2c59d6 Mon Sep 17 00:00:00 2001
From: Henrik Levkowetz <henrik@levkowetz.com>
Date: Fri, 29 Dec 2017 15:24:37 +0000
Subject: [PATCH] Added user notification about ballots closed automatically
 when creating a new ballot.  - Legacy-Id: 14471

---
 ietf/doc/models.py        |  2 +-
 ietf/doc/utils.py         | 16 ++++++++++++----
 ietf/doc/views_charter.py |  6 +++---
 3 files changed, 16 insertions(+), 8 deletions(-)

diff --git a/ietf/doc/models.py b/ietf/doc/models.py
index 6fb94187c..c3c10a844 100644
--- a/ietf/doc/models.py
+++ b/ietf/doc/models.py
@@ -342,7 +342,7 @@ class DocumentInfo(models.Model):
     # If that assumption is violated, they will only expose the most recently created ballot
     def ballot_open(self, ballot_type_slug):
         e = self.latest_event(BallotDocEvent, ballot_type__slug=ballot_type_slug)
-        return e and not e.type == "closed_ballot"
+        return e if e and not e.type == "closed_ballot" else None
 
     def latest_ballot(self):
         """Returns the most recently created ballot"""
diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py
index 2073e732a..3675fd50c 100644
--- a/ietf/doc/utils.py
+++ b/ietf/doc/utils.py
@@ -176,8 +176,10 @@ def needed_ballot_positions(doc, active_positions):
 
     return " ".join(answer)
 
-def create_ballot(doc, by, ballot_slug, time=None):
-    close_open_ballots(doc, by)
+def create_ballot(request, doc, by, ballot_slug, time=None):
+    closed = close_open_ballots(doc, by)
+    for e in closed:
+        messages.warning(request, "Closed earlier open ballot created %s on '%s' for %s" % (e.time.strftime('%Y-%m-%d %H:%M'), e.ballot_type, e.doc.name, ))
     if time:
         e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev, time=time)
     else:
@@ -203,15 +205,21 @@ def create_ballot_if_not_open(request, doc, by, ballot_slug, time=None):
         return None
 
 def close_ballot(doc, by, ballot_slug):
-    if doc.ballot_open(ballot_slug):
+    b = doc.ballot_open(ballot_slug)
+    if b:
         e = BallotDocEvent(type="closed_ballot", doc=doc, rev=doc.rev, by=by)
         e.ballot_type = BallotType.objects.get(doc_type=doc.type,slug=ballot_slug)
         e.desc = 'Closed "%s" ballot' % e.ballot_type.name
         e.save()
+    return b
 
 def close_open_ballots(doc, by):
+    closed = []
     for t in BallotType.objects.filter(doc_type=doc.type_id):
-        close_ballot(doc, by, t.slug )
+        e = close_ballot(doc, by, t.slug )
+        if e:
+            closed.append(e)
+    return closed
 
 def get_chartering_type(doc):
     chartering = ""
diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py
index 6c6861897..39e8eac99 100644
--- a/ietf/doc/views_charter.py
+++ b/ietf/doc/views_charter.py
@@ -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(charter, by, "r-wo-ext")
+                        create_ballot(request, charter, by, "r-wo-ext")
                     else:
-                        create_ballot(charter, by, "r-extrev")
+                        create_ballot(request, 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(charter, by, "approve")
+                    create_ballot(request, charter, by, "approve")
                 elif charter_state.slug == "approved":
                     change_group_state_after_charter_approval(group, by)
                     fix_charter_revision_after_approval(charter, by)