diff --git a/gracedb/api.py b/gracedb/api.py index bb9e71605874b63e60432e2c263a92a9325d0aed..cf00477a3a5c32c8e5a451a78c24044ecf329b2b 100644 --- a/gracedb/api.py +++ b/gracedb/api.py @@ -711,7 +711,7 @@ class EventLabel(APIView): if label is not None: theLabel = event.labelling_set.filter(label__name=label).all() if len(theLabel) < 1: - return Response("Label Not %s Found" % label, + return Response("Label %s Not Found" % label, status=status.HTTP_404_NOT_FOUND) theLabel = theLabel[0] return Response(labelToDict(theLabel, request=request)) @@ -731,15 +731,18 @@ class EventLabel(APIView): @event_and_auth_required def put(self, request, event, label): try: - rv = create_label(event, request, label) + rv, label_created = create_label(event, request, label) except ValueError, e: return Response(e.message, status=status.HTTP_400_BAD_REQUEST) - return Response(rv, status=status.HTTP_201_CREATED) + # Return response and status code + if label_created: + return Response(rv, status=status.HTTP_201_CREATED) + else: + return Response(rv, status=status.HTTP_200_OK) def delete(self, request, graceid, label): - #return Response("Not Implemented", status=status.HTTP_501_NOT_IMPLEMENTED) try: event = Event.getByGraceid(graceid) rv = delete_label(event, request, label) @@ -747,7 +750,7 @@ class EventLabel(APIView): return Response(e.message, status=status.HTTP_400_BAD_REQUEST) - return Response(rv, status=status.HTTP_201_CREATED) + return Response(rv, status=status.HTTP_200_OK) #================================================================== # EventLog diff --git a/gracedb/view_logic.py b/gracedb/view_logic.py index 42fc6af2e9ef607555d1b3c533acdb4913681590..cc3d4904e4fb372ccec91d26eeb57d942edf95a7 100644 --- a/gracedb/view_logic.py +++ b/gracedb/view_logic.py @@ -162,8 +162,11 @@ def create_label(event, request, labelName, doAlert=True, doXMPP=True): raise ValueError("No such Label '%s'" % labelName) # Don't add a label more than once. + # track whether label is actually created so as to + # send the correct HTTP response code + label_created = False if label in event.labels.all(): - d['warning'] = "Event %s already labeled with '%s'" % (event.graceid(), labelName) + d['warning'] = "Event %s already labeled with '%s'" % (event.graceid(), labelName) else: labelling = Labelling( event = event, @@ -171,22 +174,25 @@ def create_label(event, request, labelName, doAlert=True, doXMPP=True): creator = creator ) labelling.save() + label_created = True message = "Label: %s" % label.name log = EventLog(event=event, issuer=creator, comment=message) try: log.save() except Exception as e: # XXX This looks a bit odd to me. - logger.exception('Problem saving log message') + logger.exception('Problem saving log message (%s)' % str(e)) d['error'] = str(e) try: issueAlertForLabel(event, label, doXMPP, event_url=event_url) except Exception as e: - logger.exception('Problem saving log message') + logger.exception('Problem issuing alert (%s)' % str(e)) d['warning'] = "Problem issuing alert (%s)" % str(e) - # XXX Strange return value. Just warnings. Can really be ignored, I think. - return json.dumps(d) + + # Return warning/error messages (for passing back to client) + # and label_created bool + return json.dumps(d), label_created def delete_label(event, request, labelName): # This function deletes a label. It starts out a lot like the create @@ -206,7 +212,7 @@ def delete_label(event, request, labelName): # error if it isn't. There might be a more elegant way of doing this. if label not in event.labels.all(): d['warning'] = "No label '%s' associated with event %s" % (labelName, event.graceid()) - raise ValueError( "No label '%s' associated with event %s" % (labelName, event.graceid())) + raise ValueError("No label '%s' associated with event %s" % (labelName, event.graceid())) else: this_label = Labelling.objects.get( event = event, @@ -219,7 +225,7 @@ def delete_label(event, request, labelName): log.save() except Exception as e: # XXX This looks a bit odd to me. (<-- retained this message) - logger.exception('Problem saving log message') + logger.exception('Problem saving log message (%s)' % str(e)) d['error'] = str(e) # Return the json for some reason. I don't do any alert stuff in here.