From 7fbfdb2953f4dca13b3f99d1c7a03f99ad66d00d Mon Sep 17 00:00:00 2001
From: Tanner Prestegard <tanner.prestegard@ligo.org>
Date: Mon, 12 Dec 2016 11:31:42 -0600
Subject: [PATCH] allowing access to singleInspiral times for external users

---
 gracedb/permission_utils.py | 10 ++++++++++
 gracedb/view_utils.py       | 26 +++++++++++++++++---------
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/gracedb/permission_utils.py b/gracedb/permission_utils.py
index 50097cdec..439ff0ac5 100644
--- a/gracedb/permission_utils.py
+++ b/gracedb/permission_utils.py
@@ -124,6 +124,16 @@ def is_external(user):
     else:
         return True
 
+#-------------------------------------------------------------------------------
+# A utility for determining whether a user is accessing the API through the
+# basic auth entry point.
+#-------------------------------------------------------------------------------
+def is_basicapi_request(request):
+   if request.path.startswith("/apibasic/"):
+       return True
+   else:
+       return False
+
 #-------------------------------------------------------------------------------
 # A utility for determining whether an external user should have access to a 
 # particular file, given the event and filename. This is done by finding the
diff --git a/gracedb/view_utils.py b/gracedb/view_utils.py
index 796133e81..5d52bdc74 100644
--- a/gracedb/view_utils.py
+++ b/gracedb/view_utils.py
@@ -26,6 +26,9 @@ MAX_FLEXI_ROWS = 250
 
 GRACEDB_DATA_DIR = settings.GRACEDB_DATA_DIR
 
+import logging
+log = logging.getLogger(__name__)
+
 import json
 import pytz
 
@@ -153,7 +156,7 @@ def eventToDict(event, columns=None, request=None):
           for labelling in event.labelling_set.all()])
     # XXX Try to produce a dictionary of analysis specific attributes.  Duck typing.
     # XXX These extra attributes should only be seen by internal users.
-    if request and request.user and not is_external(request.user):
+    if request and request.user and not is_external(request.user): 
         rv['extra_attributes'] = {}
         try:
             # GrbEvent
@@ -302,14 +305,19 @@ def eventToDict(event, columns=None, request=None):
         si_set = event.singleinspiral_set.all()
         if si_set.count():
             rv['extra_attributes']['SingleInspiral'] = [ singleInspiralToDict(si) for si in si_set ]
-    elif request and request.user and is_external(request.user):
-        # Expose SingleInspiral times only for external users.
-        ext_keys = ['ifo','end_time','end_time_ns']
-        si_set = event.singleinspiral_set.all()
-        if si_set.count():
-            SingleInspiral_list = [ singleInspiralToDict(si) for si in si_set ]
-            for i, si in enumerate(SingleInspiral_list):
-                rv['extra_attributes']['SingleInspiral'] = { k: si[k] for k in ext_keys }
+    elif (request and request.user) and (is_external(request.user)):
+        try:
+            rv['extra_attributes'] = {}
+            # Only expose SingleInspiral times and ifos for external users.
+            ext_keys = ['ifo','end_time','end_time_ns']
+            si_set = event.singleinspiral_set.all()
+            if si_set.count():
+                SingleInspiral_list = [ singleInspiralToDict(si) for si in si_set ]
+                rv['extra_attributes']['SingleInspiral'] = []
+                for i, si in enumerate(SingleInspiral_list):
+                    rv['extra_attributes']['SingleInspiral'].append({ k: si[k] for k in ext_keys })
+        except:
+            pass
 
     rv['links'] = {
           "neighbors" : reverse("neighbors", args=[graceid], request=request),
-- 
GitLab