diff --git a/gracedb/api.py b/gracedb/api.py index df040313e0ade7f69db18d40683c604f042d54ac..45c040b30fd5349d0a2746bb638308185c32603c 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -12,6 +12,7 @@ import json from gracedb.models import Event, Group, EventLog, Tag from gracedb.views import create_label, get_performance_info +from gracedb.views import create_eel from translator import handle_uploaded_data from alert import issueAlertForUpdate @@ -981,6 +982,113 @@ class EventLogDetail(APIView): return Response(eventLogToDict(rv, request=request)) + +#================================================================== +# EMBBEventLog +# FIXME + +# Janky serialization +def embbEventLogToDict(eel, request=None): + uri = None + taglist_uri = None + file_uri = None + if request: + uri = reverse("embbeventeel-detail", + args=[eel.event.graceid(), eel.N], + request=request) + if eel.filename: + actual_filename = eel.filename + if eel.file_version: + actual_filename += ',%d' % eel.file_version + filename = urlquote(actual_filename) + file_uri = reverse("files", + args=[eel.event.graceid(), filename], + request=request) + + return { + "comment" : eel.comment, + "created" : eel.created, + "issuer" : eel.issuer.username, + "self" : uri, + "file" : file_uri, + } + +class EMBBEventLogList(APIView): + """EMBB Event Log List Resource + + POST param 'message' + """ + authentication_classes = (LigoAuthentication,) + permission_classes = (IsAuthenticated,) + + def get(self, request, graceid): + try: + event = Event.getByGraceid(graceid) + except Event.DoesNotExist: + # XXX Real error message. + return Response("Event does not exist.", + status=status.HTTP_404_NOT_FOUND) + embblogset = event.embbeventlog_set.order_by("created","N") + count = embblogset.count() + + eel = [ embbEventLogToDict(eel, request) + for eel in embblogset.iterator() ] + + rv = { + 'start': 0, + 'numRows' : count, + 'links' : { + 'self' : request.build_absolute_uri(), + 'first' : request.build_absolute_uri(), + 'last' : request.build_absolute_uri(), + }, + 'embblog' : eel, + } + return Response(rv) + + + + def post(self, request, graceid): + event = Event.getByGraceid(graceid) + # message -> comment + + try: + eel = create_eel(request.DATA, event, request.user) + except Exception, e: + pass + # Since this is likely due to race conditions, we will return 503 +# return Response("Failed to save log entry: %s" % str(e), +# status=status.HTTP_503_SERVICE_UNAVAILABLE) + + rv = embbEventLogToDict(eel, request=request) + response = Response(rv, status=status.HTTP_201_CREATED) + response['Location'] = rv['self'] + + # Issue alert. + description = "New EMBB log entry." + + return response + +class EMBBEventLogDetail(APIView): + authentication_classes = (LigoAuthentication,) + permission_classes = (IsAuthenticated,) + + def get(self, request, graceid, n): + try: + event = Event.getByGraceid(graceid) + except Event.DoesNotExist: + return Response("Event Not Found", + status=status.HTTP_404_NOT_FOUND) + try: + rv = event.embbeventlog_set.filter(N=n)[0] + except: + return Response("Log Message Not Found", + status=status.HTTP_404_NOT_FOUND) + + return Response(embbEventLogToDict(rv, request=request)) + + + #================================================================== # Tags diff --git a/gracedb/views.py b/gracedb/views.py index d09f558493559e1f8efb1046a6148b13e54dd814..e386eac18c2158987211bdb20a6f2545fa4f61fb 100644 --- a/gracedb/views.py +++ b/gracedb/views.py @@ -1313,6 +1313,55 @@ def file_list(request, graceid): context, context_instance=RequestContext(request)) +def create_eel(d, event, user): + # create a log entry + eel = EMBBEventLog(event=event) + eel.event = event + eel.submitter = user + # Assign a facility name + try: + facility_name = d.get('facility') + facility = EMFacility.objects.get(shortName=facility_name) + eel.facility = facility + except: + raise ValueError('Please specify a facility') + + # Assign a facility-specific footprint ID (if provided) + try: + eel.footprintID = d.get('footprintID') + except: + eel.footprintID = None + + # Assign the EM spectrum string + try: + eel.waveband = d.get('waveband') + except: + raise ValueError('Please specify a waveband') + + # Assign RA and Dec, plus widths + eel.ra = d.get('ra', None) + eel.dec = d.get('dec', None) + eel.raWidth = d.get('raWidth', None) + eel.decWidth = d.get('decWidth', None) + + # Assign gpstime and duration. + eel.gpstime = d.get('gpstime', None) + eel.duration = d.get('duration', None) + + # Assign EEL status and observation status. + try: + eel.eel_status = d.get('eel_status') + except: + raise ValueError('Please specify an EEL status.') + try: + eel.obs_status = d.get('obs_status') + except: + raise ValueError('Please specify an observation status.') + + eel.extra_info_dict = d.get('extra_info_dict', None) + eel.comment = d.get('comment', None) + eel.save() + # A view to create embb log entries def embblogentry(request, graceid, num=None): try: @@ -1320,63 +1369,21 @@ def embblogentry(request, graceid, num=None): except Event.DoesNotExist: raise Http404 if request.method == "POST": - # create a log entry - eel = EMBBEventLog(event=event) - eel.event = event - eel.submitter = request.user - # Assign a facility name - try: - facility_name = request.POST.get('facility') - facility = EMFacility.objects.get(shortName=facility_name) - eel.facility = facility - except Exception, e: - return HttpResponseBadRequest('Please specifiy facility:' + str(e)) - - # Assign a facility-specific footprint ID (if provided) try: - eel.footprintID = request.POST.get('footprintID') - except: - eel.footprintID = None - - # Assign the EM spectrum string - try: - eel.waveband = request.POST.get('waveband') - except: - return HttpResponseBadRequest('Please specify a waveband.') - - # Assign RA and Dec, plus widths - eel.ra = request.POST.get('ra', None) - eel.dec = request.POST.get('dec', None) - eel.raWidth = request.POST.get('raWidth', None) - eel.decWidth = request.POST.get('decWidth', None) - - # Assign gpstime and duration. - eel.gpstime = request.POST.get('gpstime', None) - eel.duration = request.POST.get('duration', None) - - # Assign EEL status and observation status. - try: - eel.eel_status = request.POST.get('eel_status') - except: - return HttpResponseBadRequest('Please specify an EEL status.') - try: - eel.obs_status = request.POST.get('obs_status') - except: - return HttpResponseBadRequest('Please specify an observation status.') - - eel.extra_info_dict = request.POST.get('extra_info_dict', None) - eel.comment = request.POST.get('comment', None) - try: - eel.save() - except Exception as e: - # XXX I feel like this should be a 500 error. - return HttpResponse("ERROR: %s" % str(e)) + eel = create_eel(request.POST, event, request.user) + except ValueError, e: + return HttpResponseBadRequest(str(e)) +# except RaceConditions, e: +# return HttpResponseInternalServerError(str(e)) + except Exception: + pass else: try: eel = event.eventlog_set.filter(N=num)[0] - except Exception, e: + except Exception: raise Http404 + if not request.is_ajax(): return HttpResponseRedirect(reverse(view, args=[graceid]))