Skip to content
Snippets Groups Projects
Commit 6dea25ee authored by Tanner Prestegard's avatar Tanner Prestegard Committed by GraceDB
Browse files

Implement alerts for superevents

First pass at implementing alerts for superevent creation,
update, annotation, labeling, etc.
parent 11a0b0a0
No related branches found
No related tags found
No related merge requests found
from django.shortcuts import get_object_or_404
from .shortcuts import is_superevent
from .models import Superevent, Log, Labelling
from events.models import Event, EventLog, Tag
from events.permission_utils import assign_default_perms
from events.shortcuts import is_event
from core.vfile import VersionedFile
from alerts.superevent_utils import issue_alert_for_superevent_creation, \
issue_alert_for_superevent_log, \
issue_alert_for_superevent_label_creation, \
issue_alert_for_superevent_label_removal
from alerts.event_utils import issue_alert_for_event_log
import os
......@@ -39,42 +46,56 @@ def create_superevent(submitter, t_start, t_0, t_end, preferred_event,
s = Superevent.objects.create(submitter=submitter, t_start=t_start,
t_0=t_0, t_end=t_end, preferred_event=preferred_event)
# Write a log message for preferred event
new_msg = "Set as preferred event for superevent: {superevent_id}" \
.format(superevent_id=s.superevent_id)
new_log = create_log(submitter, new_msg, preferred_event,
issue_alert=True, autogenerated=False)
# Add events to superevent
# Superevent log message and alerts are taken care of elsewhere, but we
# want to record logs and send alerts for the individual events
for event in events:
add_event_to_superevent(s, event, submitter, add_superevent_log=False,
add_event_log=True, issue_superevent_alert=False,
issue_event_alert=True)
# Create a log message to record initial superevent parameters
# TODO: alert issued for log or not? probably not
creation_comment = ("Superevent created with t_start={t_start}, t_0={t_0},"
" t_end={t_end}, preferred_event={preferred_event}").format(
t_start=t_start, t_0=t_0, t_end=t_end, preferred_event=preferred_event)
if events:
creation_comment += ", events={events}".format(events=", ".join(
[ev.graceid() for ev in events]))
# This is autogenerated, but people probably don't want to hide it
# in the web interface
superevent_creation_log = create_log(submitter, creation_comment, s,
issue_alert=False, autogenerated=False)
# Write a log message for preferred event
pref_event_msg = "Set as preferred event for superevent: {superevent_id}" \
.format(superevent_id=s.superevent_id)
pref_event_log = create_log(submitter, pref_event_msg, preferred_event,
issue_alert=False, autogenerated=False)
# Add events to superevent
# Superevent log message and alerts are taken care of elsewhere, but we
# want to record logs for the individual events
# NOTE: we don't have to worry about a repeat here for the preferred event
# since events comes directly from the serializer and hasn't been updated
# to include the preferred event (like it would be if we accessed
# s.events.all())
# Alerts aren't issued here since we want to do that *after* the superevent
# creation alert is issued below.
event_log_list = []
for event in events:
_, el = add_event_to_superevent(s, event, submitter,
add_superevent_log=False, add_event_log=True,
issue_superevent_alert=False, issue_event_alert=False)
if el is not None:
event_log_list.append(el)
# Issue all relevant alerts
if issue_alert:
# Send "new" alert about superevent creation
issue_alert_for_superevent_creation(s)
# "Manually" issue alerts for preferred_event and events
issue_alert_for_event_log(pref_event_log)
for el in event_log_list:
issue_alert_for_event_log(el)
# Add labels
send_label_alert = False
if labels:
send_label_alert = True
for label in labels:
l = add_label_to_superevent(s, label, submitter,
add_log_message=True, issue_alert=issue_alert)
for label in labels:
l = add_label_to_superevent(s, label, submitter,
add_log_message=True, issue_alert=issue_alert)
# Create default GroupObjectPermissions - LVC group and executives group
# can view/change superevents
......@@ -84,10 +105,6 @@ def create_superevent(submitter, t_start, t_0, t_end, preferred_event,
# CREATE DIRECTORY
os.makedirs(s.datadir)
# TODO: Send "new" alert about superevent creation
if issue_alert:
pass
return s
......@@ -110,14 +127,14 @@ def update_superevent(superevent, updater, issue_alert=True, **kwargs):
superevent.save()
# Write a log message
# 'if' statement to handle put requests which don't change entire object
# 'if' statement to handle patch requests which don't change entire object
updates = ["{name}: {old} -> {new}".format(name=k, old=old_params[k],
new=new_params[k]) for k in new_params.keys()
if old_params[k] != new_params[k]]
update_comment = "Updated superevent parameters: {0}".format(
", ".join(updates))
update_log = create_log(updater, update_comment, superevent,
issue_alert=False)
issue_alert=issue_alert)
# Write event log messages if preferred event changed
if new_params.has_key('preferred_event') and \
......@@ -126,17 +143,13 @@ def update_superevent(superevent, updater, issue_alert=True, **kwargs):
old_msg = ("Removed as preferred event for superevent: "
"{superevent_id}").format(superevent_id=superevent.superevent_id)
old_log = create_log(updater, old_msg, old_params['preferred_event'],
issue_alert=True)
issue_alert=issue_alert)
# New preferred event
new_msg = "Set as preferred event for superevent: {superevent_id}" \
.format(superevent_id=superevent.superevent_id)
new_log = create_log(updater, new_msg, new_params['preferred_event'],
issue_alert=True)
# TODO: issue alert here? or for log message?
if issue_alert:
pass
issue_alert=issue_alert)
return superevent
......@@ -154,12 +167,14 @@ def create_log(issuer, comment, event_or_superevent, filename="",
'comment': comment,
'filename': filename,
}
if isinstance(event_or_superevent, Superevent):
if is_superevent(event_or_superevent):
log_dict['superevent'] = event_or_superevent
LogModel = Log
elif isinstance(event_or_superevent, Event):
alert_func = issue_alert_for_superevent_log
elif is_event(event_or_superevent):
log_dict['event'] = event_or_superevent
LogModel = EventLog
alert_func = issue_alert_for_event_log
else:
# TODO: raise error
logger.error(type(event_or_superevent))
......@@ -180,16 +195,12 @@ def create_log(issuer, comment, event_or_superevent, filename="",
log.file_version = fdest.version
log.save()
# TODO: do we issue alert for "auto-generated" log messages?
# or just for the original log message? Dig into the old
# API to find out
# Add tags to log messages
for t in tags:
add_tag_to_log(log, t, issuer, issue_alert=False)
# TODO:
# Issue an alert for log
if issue_alert:
print('issue alert')
alert_func(log)
# TODO:
# If user is external, add LV-EM tagname to this log message
......@@ -213,6 +224,7 @@ def add_tag_to_log(log, tag, user, add_log_message=True, issue_alert=True):
log.tags.add(tag)
# Create log message to record tag addition?
log_for_tag_addition = None
if add_log_message:
comment = 'Tagged message {N}: {tag_name}'.format(N=log.N,
tag_name=tag.name)
......@@ -220,6 +232,8 @@ def add_tag_to_log(log, tag, user, add_log_message=True, issue_alert=True):
log_for_tag_addition = create_log(user, comment, event_or_superevent,
issue_alert=issue_alert, autogenerated=True)
return log_for_tag_addition
def remove_tag_from_log(log, tag, user, add_log_message=True,
issue_alert=True):
......@@ -228,6 +242,7 @@ def remove_tag_from_log(log, tag, user, add_log_message=True,
log.tags.remove(tag)
# Create log message to record tag removal?
log_for_tag_removal = None
if add_log_message:
comment = 'Removed tag {tag_name} from message {N}'.format(
N=log.N, tag_name=tag.name),
......@@ -235,15 +250,21 @@ def remove_tag_from_log(log, tag, user, add_log_message=True,
log_for_tag_removal = create_log(user, comment, event_or_superevent,
issue_alert=issue_alert, autogenerated=True)
return log_for_tag_removal
def add_event_to_superevent(superevent, event, user, add_event_log=True,
add_superevent_log=True, issue_event_alert=True,
issue_superevent_alert=True):
"""
We return log objects in case they are needed elsewhere
"""
# Add event to superevent
superevent.events.add(event)
# Create superevent log message to record event addtion?
superevent_log_for_event_addition = None
if add_superevent_log:
# Record event addition in superevent logs
superevent_comment = 'Added event: {graceid}'.format(
......@@ -253,6 +274,7 @@ def add_event_to_superevent(superevent, event, user, add_event_log=True,
autogenerated=True)
# Create event log message to record addition to superevent?
event_log_for_addition_to_superevent = None
if add_event_log:
# Record addition to superevent in event logs
event_comment = 'Added to superevent: {superevent_id}'.format(
......@@ -260,22 +282,8 @@ def add_event_to_superevent(superevent, event, user, add_event_log=True,
event_log_for_addition_to_superevent = create_log(user, event_comment,
event, issue_alert=issue_event_alert, autogenerated=True)
# TODO: whether this is inside the add_log_message block depends on our
# for the below todo.
if issue_superevent_alert:
# alerts to superevent channel
pass
if issue_event_alert:
# alerts to event channels
pass
# TODO: is it enough to just issue alerts about the new log message?
# or do we need to issue one specifically with the event being added?
# Might need to serialize the event or superevent in some fashion since
# we would need to issue the alert from here instead of in create_log.
# NOTE: same of course needs to be considered for removing events
# from a superevent
return superevent_log_for_event_addition, \
event_log_for_addition_to_superevent
def remove_event_from_superevent(superevent, event, user, add_event_log=True,
......@@ -294,6 +302,7 @@ def remove_event_from_superevent(superevent, event, user, add_event_log=True,
superevent.events.remove(event)
# Create superevent log message to record event removal?
superevent_log_for_event_removal = None
if add_superevent_log:
# Record event removal in superevent logs
superevent_comment = 'Removed event: {graceid}'.format(
......@@ -302,21 +311,16 @@ def remove_event_from_superevent(superevent, event, user, add_event_log=True,
superevent, issue_alert=issue_superevent_alert, autogenerated=True)
# Create event log message to record removal from superevent?
event_log_for_removal_from_superevent = None
if add_event_log:
event_comment ='Removed from superevent: {superevent_id}'.format(
superevent_id=superevent.superevent_id),
event_log_for_removal_from_superevent = create_log(user, event_comment,
event, issue_alert=issue_event_alert, autogenerated=True)
# TODO: whether this is inside the add_log_message block depends on our
# for the above todo.
if issue_superevent_alert:
# alerts to superevent channel
pass
return superevent_log_for_event_removal, \
event_log_for_removal_from_superevent
if issue_event_alert:
# alerts to event channels
pass
def add_label_to_superevent(superevent, label, user, add_log_message=True,
issue_alert=True):
......@@ -325,38 +329,39 @@ def add_label_to_superevent(superevent, label, user, add_log_message=True,
labelling = Labelling.objects.create(label=label, creator=user,
superevent=superevent)
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=issue_alert, autogenerated=True)
issue_alert=False, autogenerated=True)
# TODO: send label alert to superevent channel
if issue_alert:
pass
issue_alert_for_superevent_label_creation(labelling)
return labelling
return labelling, log_for_label_addition
def remove_label_from_superevent(labelling, user, add_log_message=True,
issue_alert=True):
# Delete Labelling object
label_name = labelling.label.name
labelling.delete()
log_for_label_removal = None
if add_log_message:
# Record label addition in superevent logs
comment = 'Removed label: {label_name}'.format(label_name=label_name)
comment = 'Removed label: {label_name}'.format(
label_name=labelling.label.name)
log_for_label_removal = create_log(user, comment, labelling.superevent,
issue_alert=issue_alert, autogenerated=True)
issue_alert=False, autogenerated=True)
# TODO: send label alert (or update?) to superevent channel
# if we do this, we probably don't send one for log creation, right?
# (need to check on this)
# labelling object still exists in memory, even though it has been
# removed from the database and does not have an ID anymore
if issue_alert:
pass
issue_alert_for_superevent_label_removal(labelling)
return log_for_label_removal
def get_or_create_tag(tag_name, display_name=None):
......@@ -398,17 +403,19 @@ def get_superevent_by_date_id_or_404(request, superevent_id):
return get_object_or_404(queryset, **filter_kwargs)
def confirm_superevent_as_gw(superevent, user):
def confirm_superevent_as_gw(superevent, user, add_log_message=True,
issue_alert=True):
# Update superevent (mark as a GW, construct new ID, etc.)
superevent.confirm_as_gw()
# Create log message
message = "Confirmed as a gravitational wave."
gw_log = create_log(user, message, superevent, issue_alert=True,
autogenerated=False)
gw_log = None
if add_log_message:
message = "Confirmed as a gravitational wave."
gw_log = create_log(user, message, superevent, issue_alert=issue_alert,
autogenerated=False)
# TODO: add label?
# TODO:
# issue alert
return gw_log
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment