From 339f1b9c0a65fa0c4fcf87105446ab96ebc37ece Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Wed, 28 Aug 2019 12:22:02 -0500
Subject: [PATCH] bugfix: public alerts view for handling case where a
 superevent doesn't have any VOEvents

---
 gracedb/superevents/views.py | 62 +++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 30 deletions(-)

diff --git a/gracedb/superevents/views.py b/gracedb/superevents/views.py
index 9b4114129..0c8a45f64 100644
--- a/gracedb/superevents/views.py
+++ b/gracedb/superevents/views.py
@@ -141,23 +141,25 @@ class SupereventPublic(DisplayFarMixin, ListView):
             .prefetch_related('voevent_set', 'log_set')
         return qs
 
-    def get_skymap_image(self, superevent):
+    def get_skymap_image(self, superevent, voevent=None):
         skymap_image = None
+        public_logs = superevent.log_set.filter(tags__name='public')
 
         # Try to get skymap from latest non-retraction VOEvent
-        voevent = superevent.voevent_set.exclude(voevent_type=
-            VOEvent.VOEVENT_TYPE_RETRACTION).order_by('-N').first()
-        voevent_skymap = voevent.skymap_filename
-        if voevent_skymap is not None:
+        if voevent is not None and voevent.skymap_filename is not None:
             # Assume filename is the same, with a different suffix.
-            voevent_skymap_image = voevent_skymap.replace('fits.gz', 'png')
-
-        # See if a public log exists with that filename
-        public_logs = superevent.log_set.filter(tags__name='public')
-        if public_logs.filter(filename=voevent_skymap_image).exists():
-            skymap_image = voevent_skymap_image
-        elif public_logs.filter(filename=self.default_skymap_filename).exists():
+            voevent_skymap_image = voevent.skymap_filename.replace('fits.gz',
+                                                                   'png')
+            # See if a public log exists with that filename
+            if public_logs.filter(filename=voevent_skymap_image).exists():
+                skymap_image = voevent_skymap_image
+
+        # If skymap_image is None, we didn't find an image based on the
+        # skymap file in the VOEvent, so try the default.
+        if (skymap_image is None and
+            public_logs.filter(filename=self.default_skymap_filename).exists()):
             skymap_image = self.default_skymap_filename
+
         if skymap_image:
             # Add version to image name to be safe
             log = public_logs.filter(filename=skymap_image) \
@@ -179,9 +181,6 @@ class SupereventPublic(DisplayFarMixin, ListView):
         candidates = 0
         for se in self.object_list:
 
-            # Get skymap image (if a public one exists)
-            se.skymap_image = self.get_skymap_image(se)
-
             # External links to GCN notice and circular
             se.noticeurl = self.noticeurl_template.format(s_id=
                 se.default_superevent_id)
@@ -199,6 +198,9 @@ class SupereventPublic(DisplayFarMixin, ListView):
             voe = se.voevent_set.exclude(voevent_type=
                 VOEvent.VOEVENT_TYPE_RETRACTION).order_by('-N').first()
 
+            # Get skymap image (if a public one exists)
+            se.skymap_image = self.get_skymap_image(se, voe)
+
             # Was the candidate retracted?
             se.retract = se.voevent_set.filter(voevent_type=
                 VOEvent.VOEVENT_TYPE_RETRACTION).exists()
@@ -225,21 +227,21 @@ class SupereventPublic(DisplayFarMixin, ListView):
                 'comment', flat=True)))
 
             # Get p_astro probabilities
-            pastro_values = [("BNS", voe.prob_bns),
-                ("NSBH", voe.prob_nsbh),
-                ("BBH", voe.prob_bbh),
-                ("Terrestrial", voe.prob_terrestrial),
-                ("MassGap", voe.prob_mass_gap)]
-            pastro_values.sort(reverse=True, key=lambda (a,b):b)
-            sourcelist = []
-            for key, value in pastro_values:
-                if value > 0.01:
-                    prob = int(round(100*value))
-                    if prob == 100: prob = '>99'
-                    sourcestr = "{0} ({1}%)".format(key, prob)
-                    sourcelist.append(sourcestr)
-            se.sourcetypes = ', '.join(sourcelist)
-            se.N = voe.N
+            if voe is not None:
+                pastro_values = [("BNS", voe.prob_bns),
+                    ("NSBH", voe.prob_nsbh),
+                    ("BBH", voe.prob_bbh),
+                    ("Terrestrial", voe.prob_terrestrial),
+                    ("MassGap", voe.prob_mass_gap)]
+                pastro_values.sort(reverse=True, key=lambda (a,b): b)
+                sourcelist = []
+                for key, value in pastro_values:
+                    if value > 0.01:
+                        prob = int(round(100*value))
+                        if prob == 100: prob = '>99'
+                        sourcestr = "{0} ({1}%)".format(key, prob)
+                        sourcelist.append(sourcestr)
+                se.sourcetypes = ', '.join(sourcelist)
 
         # Number of non-retracted candidate events
         context['candidates'] = candidates
-- 
GitLab