diff --git a/gracedb/buildVOEvent.py b/gracedb/buildVOEvent.py index db0226ac1df8d245e2bfa560e167bb0ed89a2b80..9209ea8af57fa01092797c2704bd2c477e2311ea 100755 --- a/gracedb/buildVOEvent.py +++ b/gracedb/buildVOEvent.py @@ -1,4 +1,7 @@ + +# Taken from VOEventLib example code, which is: # Copyright 2010 Roy D. Williams +# then modified """ buildVOEvent: Creates a complex VOEvent with tables See the VOEvent specification for details @@ -17,7 +20,7 @@ def buildVOEvent(gevent): ############ VOEvent header ############################ v = VOEvent.VOEvent(version="2.0") - v.set_ivorn("ivo://ligo.org/gracedb#%s" % objid) + v.set_ivorn("ivo://ligo.org/gracedb#%s-dev" % objid) v.set_role("test") v.set_Description("LIGO / Virgo trigger") @@ -101,11 +104,7 @@ def submitToSkyalert(gevent, validate_only=False): # Should alerts be run once the event is ingested? dict['doRules'] = 'on' - # open a file for the XML - #dict['xmlText'] = open('sample.xml').read() dict['xmlText'] = buildVOEvent(gevent) - - # Now send it off and print the result params = urllib.urlencode(dict) f = urllib.urlopen(url, params) result = f.read() diff --git a/gracedb/views.py b/gracedb/views.py index 7240415aaaf5bc1eeb3b5a61095eba2c94aece2c..d4fe5a31eb8a7fd9ac7ad45b59de1313469fee5a 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -18,6 +18,9 @@ from translator import handle_uploaded_data import urllib import os +import re +from django.core.mail import mail_admins +from django.conf import settings from buildVOEvent import buildVOEvent, submitToSkyalert @@ -33,13 +36,105 @@ def index(request): {}, context_instance=RequestContext(request)) +def skyalert_authorized(request): + try: + return request.ligouser.name in settings.SKYALERT_SUBMITTERS + except: + return False + def voevent(request, graceid): event = Event.getByGraceid(graceid) return HttpResponse(buildVOEvent(event), content_type="application/xml") + def skyalert(request, graceid): event = Event.getByGraceid(graceid) - return HttpResponse(submitToSkyalert(event), content_type="text/plain") + createLogEntry = True + + if not event.gpstime: + request.session['flash_msg'] = "No GPS time. Event not suitable for submission to SkyAlert" + return HttpResponseRedirect(reverse(view, args=[graceid])) + + if not skyalert_authorized(request): + request.session['flash_msg'] = "You are not authorized for SkyAlert submission" + return HttpResponseRedirect(reverse(view, args=[graceid])) + + try: + skyalert_response = submitToSkyalert(event) + except Exception, e: + message = "SkyAlert Submission Error" + skyalert_response = "" + mail_admins("SkyAlert Submission Error", + "Event: %s\nExcption: %s\n" % (graceid, e), + fail_silently=True) + + if skyalert_response.find("Success") >= 0: + urlpat = re.compile('https://[^ ]*') + match = urlpat.search(skyalert_response) + if match: + message = "Submitted to Skyalert: %s" % match.group() + else: + message = "SkyAlert submission problem. Cannot parse SkyAlert response." + mail_admins("SkyAlert response parsing problem", + "Event: %s\nSkyAlert Response: %s\n" % (graceid, skyalert_response), + fail_silently=True) + elif skyalert_response.find('already') >= 0: + message = "Event already submitted to SkyAlert" + createLogEntry = False + elif skyalert_response: + message = "Skyalert Submission Failed." + mail_admins("SkyAlert submission failed", + "Event: %s\nSkyAlert Response: %s\n" % (graceid, skyalert_response), + fail_silently=True) + + request.session['flash_msg'] = message + + if createLogEntry: + logentry = EventLog(event=event, issuer=request.ligouser, comment=message) + logentry.save() + + return HttpResponseRedirect(reverse(view, args=[graceid])) + + +def badskyalert(request, graceid): + event = Event.getByGraceid(graceid) + + if not event.gpstime: + request.session['flash_msg'] = "No GPS time. Event not suitable for submission to SkyAlert" + return HttpResponse("Ugh no gpstime") + return HttpResponseRedirect(reverse(view, args=[graceid])) + + logentry = EventLog(event=event, issuer=request.ligouser, comment="TRYING TO SUMIT TO SKYALERT") + logentry.save() + + skyalert_response = submitToSkyalert(event, validate_only="False") + + if skyalert_response.find("Success") >= 0: + urlpat = re.compile('https://[^ ]*') + match = urlpat.search(skyalert_response) + if match: + try: + skyalert_url = match.group() + except: + skyalert_url = "fail match" + comment = "Submitted to SkyALert: %s" % skyalert_url + logentry = EventLog(event=event, issuer=request.ligouser, comment=comment) + logentry.save() + request.session['flash_msg'] = comment + return HttpResponse("OK " + skyalert_response + skyalert_url + logentry.comment) + else: + request.session['flash_msg'] = "Problem parsing skyalert response" + return HttpResponse('problem ' + skyalert_response) + elif skyalert_response.find('already found') >= 0: + request.session['flash_msg'] = "Event already submitted to SkyAlert " + skyalert_response + return HttpResponse('already done ' + skyalert_response) + else: + return HttpResponse('problem2 ' + skyalert_response) + request.session['flash_msg'] = "Unknown problem submitting to SkyAlert -- %s" % skyalert_response + + #return HttpResponseRedirect(reverse(view, args=[graceid])) + return HttpResponse('how did we get here? ' + skyalert_response) + return view(request, graceid) def create(request): d = _create(request) @@ -393,6 +488,7 @@ def view(request, graceid): context['userdesc'] = get_file(graceid, "user.log") context['nearby'] = [(event.gpstime - a.gpstime, event) for event in a.neighbors()] + context['skyalert_authorized'] = skyalert_authorized(request) return render_to_response( 'gracedb/event_detail.html', context, diff --git a/settings.py b/settings.py index c6e5d8ba6f0b7b779a0038c814a2696bc8a07f98..39f43800c4b60e965d2fb0094e056e4fece80aba 100644 --- a/settings.py +++ b/settings.py @@ -8,11 +8,13 @@ EMAIL_HOST = 'gravity.phys.uwm.edu' ADMINS = ( ('Brian Moe', 'bmoe@gravity.phys.uwm.edu'), - ('Larry Price', 'larry@gravity.phys.uwm.edu'), +# ('Larry Price', 'larry@gravity.phys.uwm.edu'), ) MANAGERS = ADMINS +SKYALERT_SUBMITTERS = ['Patrick Brady', 'Brian Moe'] + ALERT_EMAIL_FROM = "GraCEDb <gracedb@archie.phys.uwm.edu>" ALERT_EMAIL_TO = [ "gracedb@listserv.ligo.org", diff --git a/settings_dev.py b/settings_dev.py index 173628c708039162e870ccdc134834c6fd486c15..97157756265464656eff4d4bef8df6a4ab35ed01 100644 --- a/settings_dev.py +++ b/settings_dev.py @@ -9,6 +9,8 @@ ADMINS = ( MANAGERS = ADMINS +SKYALERT_SUBMITTERS = ['Patrick Brady', 'Brian Moe'] + ALERT_EMAIL_FROM = "Dev Alert <root@moe.phys.uwm.edu>" ALERT_EMAIL_TO = [ "Brian Moe <bmoe@gravity.phys.uwm.edu>", diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html index c36e65d5a7edfce66c605597ffaa8050104bfa84..9fef6ef4fe516eca07b60d2ba2d5be0c4fbb699c 100644 --- a/templates/gracedb/event_detail.html +++ b/templates/gracedb/event_detail.html @@ -11,6 +11,12 @@ <tr><td valign="top"> <table class="event"> + {% if skyalert_authorized %} + <tr><td colspan="4"> + <a href="{% url skyalert object.graceid %}"><button type="button">Submit to Skyalert</button></a> + </td></tr> + {% endif %} + <tr> <th valign="top">UID</th> <th>Labels</th>