From 48764789b203af2dcde2ff3a1bdc4c3505620d39 Mon Sep 17 00:00:00 2001
From: Brian Moe <lars@moe.phys.uwm.edu>
Date: Mon, 7 Dec 2009 16:30:54 -0600
Subject: [PATCH] Added lvalerts on updates.

---
 gracedb/alert.py                    | 64 ++++++++++++++---------------
 gracedb/views.py                    | 23 ++++++++---
 settings.py                         |  9 ++++
 settings_dev.py                     |  7 ++++
 templates/gracedb/event_detail.html |  2 +
 5 files changed, 67 insertions(+), 38 deletions(-)

diff --git a/gracedb/alert.py b/gracedb/alert.py
index ca3fa271b..79a3a742e 100644
--- a/gracedb/alert.py
+++ b/gracedb/alert.py
@@ -14,15 +14,6 @@ from gracedb.userprofile.models import Trigger, AnalysisType
 import glue.ligolw.utils
 import glue.lvalert.utils
 
-XMPP_ALERT_CHANNELS = [
-                        'burst_omega',
-                        'test_omega',
-                        'cbc_mbtaonline',
-                        'test_mbtaonline',
-                        'burst_cwb',
-                        'test_cwb',
-                      ]
-
 def issueAlert(event, location, temp_data_loc):
     issueXMPPAlert(event, location, temp_data_loc)
     issueEmailAlert(event, location)
@@ -35,7 +26,15 @@ def prepareSummary(event):
     return "GPS Time: %s" % event.gpstime
 
 
-def issueEmailAlertForLabel(event, label):
+def issueAlertForUpdate(event, description, doxmpp):
+    if doxmpp:
+        issueXMPPAlert(event, "", "", "update", description)
+    # XXX No emails for this.  Argh.
+
+def issueAlertForLabel(event, label, doxmpp):
+    if doxmpp:
+        issueXMPPAlert(event, "", "", "label", label)
+    # Email
     profileRecips = []
     atype = AnalysisType.objects.filter(code=event.analysisType)[0]
     triggers = label.trigger_set.filter(atypes=atype)
@@ -104,15 +103,15 @@ Event Summary:
 
     #send_mail(subject, message, fromaddress, toaddresses)
 
-def issueXMPPAlert(event, location, temp_data_loc):
+def issueXMPPAlert(event, location, temp_data_loc, alert_type="new", description=""):
+    f = open('tmp/foo','a')
     nodename = "%s_%s"% (event.group.name, event.get_analysisType_display())
     nodename = nodename.lower()
 
-    # XXX awful!
-    # Need a good way to know which things to send out to lvalert.
-    # Currently, only MBTAOnline and Omega get alerts.
-    if nodename not in XMPP_ALERT_CHANNELS:
+    if nodename not in settings.XMPP_ALERT_CHANNELS:
+        f.write("nope.  not in list\n")
         return
+    f.write("Node: %s\n" % nodename)
 
     env = {}
     env["PYTHONPATH"] = ":".join(sys.path)
@@ -131,33 +130,34 @@ def issueXMPPAlert(event, location, temp_data_loc):
         stderr=STDOUT,
         env=env)
 
-    #msg = createPayload(event.graceid(), location)
-    xmldoc = glue.lvalert.utils.make_LVAlertTable(location, event.graceid(), temp_data_loc)
+    f.write("A\n")
+    xmldoc = glue.lvalert.utils.make_LVAlertTable(
+                    location,
+                    event.graceid(),
+                    temp_data_loc,
+                    alert_type,
+                    description)
+    f.write("B: %s\n" % str(xmldoc))
+
+    f.write("c\n")
     buf = StringIO.StringIO()
+    f.write("d\n")
     glue.ligolw.utils.write_fileobj(xmldoc, buf)
+    f.write("e\n")
     msg = buf.getvalue()
 
+    f.write("f\n")
     p.stdin.write(msg)
+    f.write("g\n")
     p.stdin.close()
+    f.write("h\n")
     for i in range(1,10):
         res = p.poll()
+        f.write("poll %d\n" % i)
         if res == None:
+            f.write("poll %d\n" % i)
             time.sleep(1)
         else:
+            f.write("poll end\n")
             break
 
-def createPayload (uid, filename):
-    template = """<?xml version='1.0' encoding='utf-8'?>
-<!DOCTYPE LIGO_LW SYSTEM "http://ldas-sw.ligo.caltech.edu/doc/ligolwAPI/html/ligolw_dtd.txt">
-<LIGO_LW>
-        <Table Name="LVAlert:table">
-                <Column Type="lstring" Name="LVAlert:uid"/>
-                <Column Type="lstring" Name="LVAlert:file"/>
-                <Stream Name="LVAlert:table" Type="Local" Delimiter=",">
-                        "%(uid)s","%(filename)s"
-                </Stream>
-        </Table>
-</LIGO_LW>
-"""
-    return template % { 'uid': uid, 'filename': filename }
-
diff --git a/gracedb/views.py b/gracedb/views.py
index ad6e0ab13..3ded9ed9d 100644
--- a/gracedb/views.py
+++ b/gracedb/views.py
@@ -11,7 +11,7 @@ from django.views.generic.list_detail import object_detail, object_list
 
 from models import Event, Group, EventLog, Labelling, Label
 from forms import CreateEventForm, EventSearchForm, SimpleSearchForm
-from alert import issueAlert, issueEmailAlertForLabel
+from alert import issueAlert, issueAlertForLabel, issueAlertForUpdate
 from translator import handle_uploaded_data
 
 import os
@@ -190,6 +190,12 @@ def _createLog(request, graceid, comment, uploadedFile=None):
                 rdict['error'] = "Problem saving file: %s" % str(e)
         logEntry.save()
 
+        if request.POST.get('alert') == "True":
+            description = "LOG: "
+            if uploadedFile:
+                description = "UPLOAD: '%s' " % uploadedFile.name
+            issueAlertForUpdate(event, description+comment, doxmpp=True)
+
     # XXX should be json
     rval = str(rdict)
     response['Content-length'] = len(rval)
@@ -272,7 +278,9 @@ def cli_label(request):
         raise ValueError("No such Label '%s'" % labelName)
 
     # Don't add a label more than once.
-    if label not in event.labels.all():
+    if label in event.labels.all():
+            d['warning'] = "Event %s already labeled with '%s'" % (event.graceid(), labelName)
+    else:
         labelling = Labelling(
                 event = event,
                 label = label,
@@ -283,10 +291,11 @@ def cli_label(request):
         log = EventLog(event=event, issuer=request.ligouser, comment=message)
         log.save()
 
-    try:
-        issueEmailAlertForLabel(event, label)
-    except Exception, e:
-        d['warning'] = "Problem issuing email alert (%s)" % str(e)
+        try:
+            doxmpp = request.POST.get('alert') == "True"
+            issueAlertForLabel(event, label, doxmpp)
+        except Exception, e:
+            d['warning'] = "Problem issuing alert (%s)" % str(e)
 
     msg = str(d)
     response = HttpResponse(mimetype='application/json')
@@ -302,6 +311,7 @@ def log(request):
     if 'cli_version' in request.POST:
         return _createLog(request, graceid, message)
 
+    # old, old client only
     response = HttpResponse(mimetype='text/plain')
     try:
         event = graceid and Event.getByGraceid(graceid)
@@ -320,6 +330,7 @@ def log(request):
             msg = "OK"
         except:
             msg = "ERROR: problem creating log entry"
+
     response = HttpResponse(mimetype='text/plain')
     response.write(msg)
     response['Content-length'] = len(msg)
diff --git a/settings.py b/settings.py
index 028204b22..92e311574 100644
--- a/settings.py
+++ b/settings.py
@@ -28,6 +28,15 @@ ALERT_TEST_EMAIL_TO = [
                        "bmoe@gravity.phys.uwm.edu",
                       ]
 
+XMPP_ALERT_CHANNELS = [
+                        'burst_omega',
+                        'test_omega',
+                        'cbc_mbtaonline',
+                        'test_mbtaonline',
+                        'burst_cwb',
+                        'test_cwb',
+                      ]
+
 DATABASE_ENGINE = 'mysql'
 DATABASE_NAME = 'gracedb'
 DATABASE_USER = 'gracedb'
diff --git a/settings_dev.py b/settings_dev.py
index b97c84254..213f7cb91 100644
--- a/settings_dev.py
+++ b/settings_dev.py
@@ -20,6 +20,13 @@ ALERT_TEST_EMAIL_TO = [
     "Brian Moe <bmoe@gravity.phys.uwm.edu>",
     ]
 
+# Don't sent out non-test XMPP alerts on dev box!
+XMPP_ALERT_CHANNELS = [
+                        'test_omega',
+                        'test_mbtaonline',
+                        'test_cwb',
+                      ]
+
 DATABASE_ENGINE = 'mysql'
 DATABASE_NAME = 'gracedb'
 DATABASE_USER = 'gracedb'
diff --git a/templates/gracedb/event_detail.html b/templates/gracedb/event_detail.html
index 0abef6a60..7c09be8ac 100644
--- a/templates/gracedb/event_detail.html
+++ b/templates/gracedb/event_detail.html
@@ -12,6 +12,7 @@
     <tr>
             <th valign="top">UID</th>
             <th>Labels</th>
+            <th>Group</th>
             <th>Type</th>
             <th>
                 {{ "gps"|timeselect:"gps" }}
@@ -32,6 +33,7 @@
                 <span title="{{labelling.creator.name}}  {{labelling.created|utc}}" style="color: {{labelling.label.defaultColor}}">{{ labelling.label.name }}</span>
              {% endfor %}
         </td>
+        <td>{{ object.group.name }} </td>
         <td>{{ object.get_analysisType_display }} </td>
         <td>{% if object.gpstime%}
                 <!-- <span title="{{ object.gpstime|gpsdate }}">{{ object.gpstime }}</span> -->
-- 
GitLab