diff --git a/gracedb/superevents/utils.py b/gracedb/superevents/utils.py index 8ef17da3b6a017a90b66a50ad5b80fe54f5c146a..ce71bfb196edd2cf601645dd39e4fa7be49b5642 100644 --- a/gracedb/superevents/utils.py +++ b/gracedb/superevents/utils.py @@ -112,7 +112,7 @@ def create_superevent(submitter, t_start, t_0, t_end, preferred_event, # Add labels for label in labels: - l = add_label_to_superevent(s, label, submitter, + labelling, _ = add_label_to_superevent(s, label, submitter, add_log_message=True, issue_alert=issue_alert) # Create superevent data directory @@ -415,20 +415,32 @@ def remove_event_from_superevent(superevent, event, user, add_event_log=True, def add_label_to_superevent(superevent, label, user, add_log_message=True, issue_alert=True): - # Create Labelling object - labelling = Labelling.objects.create(label=label, creator=user, - superevent=superevent) - + # Create Labelling object - we use get_or_create due to the possibility + # of IntegrityErrors. Sometimes two requests can get through the + # before the first one is actually applied so get_or_create allows + # us to safeguard against that. + labelling, created = Labelling.objects.get_or_create(label=label, + creator=user, superevent=superevent) + + # If the label is actually created (i.e. this isn't a secondary request + # that squeaked through), then we optionally create a log message and + # issue an alert. If it's *not* created, then that stuff should have been + # done already on a separate request and we don't need to repeat it here. + # This is not ideal because users will get a response like they created + # the label on that request but I don't think that is a significant + # problem. This should be a rare occurrence and is basically here to + # prevent server errors when users are doing dumb things. log_for_label_addition = None - if add_log_message: - # Record label addition in superevent logs - comment = 'Added label: {label_name}'.format(label_name=label.name) - log_for_label_addition = create_log(user, comment, superevent, - issue_alert=False, autogenerated=True) - - if issue_alert: - SupereventLabelAlertIssuer(labelling, alert_type='label_added') \ - .issue_alerts() + if created: + if add_log_message: + # Record label addition in superevent logs + comment = 'Added label: {label_name}'.format(label_name=label.name) + log_for_label_addition = create_log(user, comment, superevent, + issue_alert=False, autogenerated=True) + + if issue_alert: + SupereventLabelAlertIssuer(labelling, alert_type='label_added') \ + .issue_alerts() return labelling, log_for_label_addition