From e4a8b0995732804002ffdf0e3324e16ed1e43956 Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Wed, 6 Mar 2019 09:39:46 -0600
Subject: [PATCH] Add state change checking to update alerts

Add capability for passing kwargs to AlertIssuer classes'
issue_alerts() method.  We take advantage of this in the update
alerts for checking for FAR changes and NSCAND state changes.
---
 gracedb/alerts/issuers/base.py        |  4 ++--
 gracedb/alerts/issuers/events.py      |  8 ++++----
 gracedb/alerts/issuers/superevents.py |  8 ++++----
 gracedb/api/v1/events/views.py        |  7 ++++++-
 gracedb/superevents/utils.py          | 11 ++++++++++-
 5 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/gracedb/alerts/issuers/base.py b/gracedb/alerts/issuers/base.py
index 125d5b3a9..740eac0d1 100644
--- a/gracedb/alerts/issuers/base.py
+++ b/gracedb/alerts/issuers/base.py
@@ -5,7 +5,7 @@ class AlertIssuer(object):
     serializer_class = None
     alert_types = None
 
-    def __init__(self, obj, alert_type, *args, **kwargs):
+    def __init__(self, obj, alert_type):
         # Check alert type
         if alert_type not in self.alert_types:
             raise ValueError('alert_type should be in {0}'.format(
@@ -18,7 +18,7 @@ class AlertIssuer(object):
     def serialize_obj(self):
         return self.serializer_class(self.obj).data
 
-    def issue_alerts(self):
+    def issue_alerts(self, **kwargs):
         # Should be overridden in derived classes
         return NotImplemented
 
diff --git a/gracedb/alerts/issuers/events.py b/gracedb/alerts/issuers/events.py
index 87e5610df..d3caf1b1a 100644
--- a/gracedb/alerts/issuers/events.py
+++ b/gracedb/alerts/issuers/events.py
@@ -38,9 +38,9 @@ class AlertIssuerWithParentEvent(AlertIssuerWithParentObject):
         # Make sure we have the event "subclass"
         return self.obj.event.get_subclass_or_self()
 
-    def issue_alerts(self):
+    def issue_alerts(self, **kwargs):
         issue_alerts(self.get_parent_obj(), self.alert_type,
-           self.serialize_obj(), self.serialize_parent())
+           self.serialize_obj(), self.serialize_parent(), **kwargs)
 
 
 class EventAlertIssuer(AlertIssuerWithParentEvent):
@@ -66,10 +66,10 @@ class EventLabelAlertIssuer(AlertIssuerWithParentEvent):
     serializer_class = staticmethod(labelToDict)
     alert_types = ['label_added', 'label_removed']
 
-    def issue_alerts(self):
+    def issue_alerts(self, **kwargs):
         issue_alerts(self.get_parent_obj(), self.alert_type,
             self.serialize_obj(), self.serialize_parent(),
-            label=self.obj.label)
+            label=self.obj.label, **kwargs)
 
 
 class EventVOEventAlertIssuer(AlertIssuerWithParentEvent):
diff --git a/gracedb/alerts/issuers/superevents.py b/gracedb/alerts/issuers/superevents.py
index 861390be1..4055e30d5 100644
--- a/gracedb/alerts/issuers/superevents.py
+++ b/gracedb/alerts/issuers/superevents.py
@@ -20,9 +20,9 @@ class AlertIssuerWithParentSuperevent(AlertIssuerWithParentObject):
                 self.obj.__class__.__name__))
         return self.obj.superevent
 
-    def issue_alerts(self):
+    def issue_alerts(self, **kwargs):
         issue_alerts(self.get_parent_obj(), self.alert_type,
-            self.serialize_obj(), self.serialize_parent())
+            self.serialize_obj(), self.serialize_parent(), **kwargs)
 
 
 class SupereventAlertIssuer(AlertIssuerWithParentSuperevent):
@@ -43,10 +43,10 @@ class SupereventLabelAlertIssuer(AlertIssuerWithParentSuperevent):
     serializer_class = SupereventLabelSerializer
     alert_types = ['label_added', 'label_removed']
 
-    def issue_alerts(self):
+    def issue_alerts(self, **kwargs):
         issue_alerts(self.get_parent_obj(), self.alert_type,
             self.serialize_obj(), self.serialize_parent(),
-            label=self.obj.label)
+            label=self.obj.label, **kwargs)
 
 
 class SupereventVOEventAlertIssuer(AlertIssuerWithParentSuperevent):
diff --git a/gracedb/api/v1/events/views.py b/gracedb/api/v1/events/views.py
index 178ef7f09..e21c174ef 100644
--- a/gracedb/api/v1/events/views.py
+++ b/gracedb/api/v1/events/views.py
@@ -576,6 +576,10 @@ class EventDetail(InheritPermissionsAPIView):
         except Exception, e:
             return Response(str(e))
 
+        # Compile far and nscand for alerts
+        old_far = event.far
+        old_nscand = event.is_ns_candidate()
+
 #       messages = []
 #       if event.group.name != request.data['group']:
 #           messages += [
@@ -619,7 +623,8 @@ class EventDetail(InheritPermissionsAPIView):
         event.save()
 
         # Issue alert
-        EventAlertIssuer(event, alert_type='update').issue_alerts()
+        EventAlertIssuer(event, alert_type='update').issue_alerts(
+            old_far=old_far, old_nscand=old_nscand)
 
         return Response(status=status.HTTP_202_ACCEPTED)
 
diff --git a/gracedb/superevents/utils.py b/gracedb/superevents/utils.py
index b7aeec51b..8ef17da3b 100644
--- a/gracedb/superevents/utils.py
+++ b/gracedb/superevents/utils.py
@@ -142,6 +142,7 @@ def update_superevent(superevent, updater, add_log_message=True,
 
     # Write a log message
     # 'if' statement to handle patch requests which don't change entire object
+    superevent_alert_kwargs = {}
     if add_log_message:
         updates = ["{name}: {old} -> {new}".format(name=k, old=old_params[k],
             new=new_params[k]) for k in new_params.keys()
@@ -177,9 +178,17 @@ def update_superevent(superevent, updater, add_log_message=True,
                 EventAlertIssuer(new_params['preferred_event'],
                     alert_type='selected_as_preferred').issue_alerts()
 
+            # If preferred event has changed, compile kwargs for superevent
+            # alert
+            superevent_alert_kwargs['old_far'] = \
+                old_params['preferred_event'].far
+            superevent_alert_kwargs['old_nscand'] = \
+                old_params['preferred_event'].is_ns_candidate()
+
     # Superevent alerts
     if issue_alert:
-        SupereventAlertIssuer(superevent, alert_type='update').issue_alerts()
+        SupereventAlertIssuer(superevent, alert_type='update').issue_alerts(
+            **superevent_alert_kwargs)
 
     return superevent
 
-- 
GitLab