From 11a0b0a071f6f3791010fda788d417634b743ed2 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Thu, 7 Jun 2018 15:39:36 -0500
Subject: [PATCH] Bugfix for removing an event from a superevent

Prevent users from removing a superevent's preferred event.
They will have to update the superevent to set a new preferred
event instead, then remove the event.
---
 gracedb/superevents/models.py |  3 +++
 gracedb/superevents/utils.py  | 14 ++++++++------
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/gracedb/superevents/models.py b/gracedb/superevents/models.py
index 2b6098a95..a3477ca24 100644
--- a/gracedb/superevents/models.py
+++ b/gracedb/superevents/models.py
@@ -307,6 +307,9 @@ class Superevent(CleanSaveModel, ModelToDictMixin, AutoIncrementModel):
     def __unicode__(self):
         return self.superevent_id
 
+    class PreferredEventRemovalError(Exception):
+        # To be raised when an attempt is made to remove the preferred event.
+        pass
 
 class Log(CleanSaveModel, LogBase, AutoIncrementModel):
     """
diff --git a/gracedb/superevents/utils.py b/gracedb/superevents/utils.py
index 36152d4a1..16777701f 100644
--- a/gracedb/superevents/utils.py
+++ b/gracedb/superevents/utils.py
@@ -281,16 +281,18 @@ def add_event_to_superevent(superevent, event, user, add_event_log=True,
 def remove_event_from_superevent(superevent, event, user, add_event_log=True,
     add_superevent_log=True, issue_event_alert=True,
     issue_superevent_alert=True):
+    """
+    This function should be within a try-except block to catch exceptions and
+    convert them to the appropriate response.
+    """
+    # Throw error if this is the preferred event
+    if event == superevent.preferred_event:
+        raise Superevent.PreferredEventRemovalError("Can't remove a "
+            "superevent's preferred event without setting a new one.")
 
     # Remove event from superevent
     superevent.events.remove(event)
 
-    # Handle case where the event is also the preferred event for the
-    # superevent
-    if (hasattr(event, 'superevent_preferred_for') and 
-        event.superevent_preferred_for == superevent):
-        superevent.preferred_event = None
-
     # Create superevent log message to record event removal?
     if add_superevent_log:
         # Record event removal in superevent logs
-- 
GitLab