From f7b1ce1fcece41c167267c63fbabf87d8064b9e0 Mon Sep 17 00:00:00 2001
From: Robert Sparks <rjsparks@nostrum.com>
Date: Mon, 22 Jun 2020 21:22:54 +0000
Subject: [PATCH] Remove abandoned charters from any future telechats. Fixes
 #3003. Commit ready for merge.  - Legacy-Id: 18037

---
 ietf/doc/factories.py     | 9 ++++++++-
 ietf/doc/tests_charter.py | 7 ++++++-
 ietf/doc/views_charter.py | 8 ++++++--
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py
index f22e80cab..a773029bc 100644
--- a/ietf/doc/factories.py
+++ b/ietf/doc/factories.py
@@ -12,7 +12,7 @@ from typing import Optional         # pyflakes:ignore
 from django.conf import settings
 
 from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor,
-    StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, )
+    StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent)
 from ietf.group.models import Group
 
 def draft_name_generator(type_id,group,n):
@@ -281,6 +281,13 @@ class DocEventFactory(factory.DjangoModelFactory):
     def rev(self):
         return self.doc.rev
 
+class TelechatDocEventFactory(DocEventFactory):
+    class Meta:
+        model = TelechatDocEvent
+
+    telechat_date = datetime.datetime.today()+datetime.timedelta(days=14)
+    type = 'scheduled_for_telechat'
+
 class NewRevisionDocEventFactory(DocEventFactory):
     class Meta:
         model = NewRevisionDocEvent
diff --git a/ietf/doc/tests_charter.py b/ietf/doc/tests_charter.py
index d7a25d3c0..f6a972fae 100644
--- a/ietf/doc/tests_charter.py
+++ b/ietf/doc/tests_charter.py
@@ -14,7 +14,7 @@ from django.urls import reverse as urlreverse
 
 import debug                            # pyflakes:ignore
 
-from ietf.doc.factories import CharterFactory, NewRevisionDocEventFactory
+from ietf.doc.factories import CharterFactory, NewRevisionDocEventFactory, TelechatDocEventFactory
 from ietf.doc.models import ( Document, State, BallotDocEvent, BallotType, NewRevisionDocEvent,
     TelechatDocEvent, WriteupDocEvent )
 from ietf.doc.utils_charter import ( next_revision, default_review_text, default_action_text,
@@ -108,6 +108,9 @@ class EditCharterTests(TestCase):
             url = urlreverse('ietf.doc.views_charter.change_state', kwargs=dict(name=charter.name, option=option))
             login_testing_unauthorized(self, "secretary", url)
 
+            if option == 'recharter':
+                TelechatDocEventFactory(doc=charter)
+
             # normal get
             r = self.client.get(url)
             self.assertEqual(r.status_code, 200)
@@ -119,6 +122,8 @@ class EditCharterTests(TestCase):
             self.assertEqual(r.status_code, 302)
             if option == "abandon":
                 self.assertTrue("abandoned" in charter.latest_event(type="changed_document").desc.lower())
+                telechat_doc_event = charter.latest_event(TelechatDocEvent)
+                self.assertIsNone(telechat_doc_event.telechat_date)
             else:
                 self.assertTrue("state changed" in charter.latest_event(type="changed_state").desc.lower())
 
diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py
index 632ab4364..916b69c36 100644
--- a/ietf/doc/views_charter.py
+++ b/ietf/doc/views_charter.py
@@ -22,7 +22,7 @@ import debug                            # pyflakes:ignore
 
 from ietf.doc.models import ( Document, DocAlias, DocHistory, State, DocEvent,
     BallotDocEvent, BallotPositionDocEvent, InitialReviewDocEvent, NewRevisionDocEvent,
-    WriteupDocEvent )
+    WriteupDocEvent, TelechatDocEvent )
 from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
     create_ballot, get_chartering_type )
 from ietf.doc.utils_charter import ( historic_milestones_for_charter,
@@ -105,7 +105,6 @@ def change_state(request, name, option=None):
                 oldstate = group.state
                 if oldstate.slug in ("proposed", "bof", "unknown"):
                     charter_state = State.objects.get(used=True, type="charter", slug="notrev")
-                    #TODO : set an abandoned state and leave some comments here
                     group.state = GroupStateName.objects.get(slug='abandon')
                     group.save()
                     e = ChangeStateGroupEvent(group=group, type="changed_state")
@@ -138,6 +137,11 @@ def change_state(request, name, option=None):
                 else:
                     # kill hanging ballots
                     close_open_ballots(charter, by)
+                    # take the doc off of a telechat if scheduled
+                    telechat_doc_event = charter.latest_event(TelechatDocEvent, type='scheduled_for_telechat')
+                    if telechat_doc_event and telechat_doc_event.telechat_date:
+                        e = TelechatDocEvent.objects.create(doc=charter, rev=charter.rev, by=by, type='scheduled_for_telechat', telechat_date=None, desc="Removed from agenda for telechat")
+                        events.append(e)
 
                     # Special log for abandoned efforts
                     e = DocEvent(type="changed_document", doc=charter, rev=charter.rev, by=by)