Switch to side-by-side view

--- a/Allura/allura/command/reactor.py
+++ b/Allura/allura/command/reactor.py
@@ -2,6 +2,7 @@
 import time
 import json
 import string
+from pprint import pformat
 from multiprocessing import Process
 from weberror.errormiddleware import handle_exception
 
@@ -81,15 +82,6 @@
     parser.add_option('--dry_run', dest='dry_run', action='store_true', default=False,
                       help="get ready to run the reactor, but don't actually run it")
 
-    error_template = string.Template('''
-<ul>
-<li>Project: $project
-<li>App: $app
-<li>Routing key: $key
-<li>Exchange: $exchange
-<li>Message: $message
-</ul>
-''')
     def command(self):
         self.basic_setup()
         processes = [ RestartableProcess(target=self.periodic_main, log=base.log, args=()) ]
@@ -146,9 +138,8 @@
             time.sleep(5)
             if self.options.dry_run: return
 
-    def send_error_report(self, exc_info, **kw):
+    def send_error_report(self, exc_info):
         C = pylons.config['pylons.errorware']
-        error_message = self.error_template.safe_substitute(**kw)
         handle_exception(
             exc_info, sys.stderr,
             html=True,
@@ -162,7 +153,7 @@
             smtp_password=C.get('smtp_password'),
             smtp_use_tls=C.get('smtp_use_tls'),
             error_subject_prefix=C.get('error_subject_prefix'),
-            error_message=error_message,
+            error_message=C.get('error_message'),
             simple_html_error=C.get('simple_html_error'))
 
     def route_audit(self, tool_name, method):
@@ -170,6 +161,8 @@
         def callback(data, msg):
             msg.ack()
             try:
+                __traceback_supplement__ = (
+                    self.Supplement, pylons.c, data, msg, 'audit')
                 if 'project_id' in data:
                     try:
                         if data['project_id']:
@@ -204,14 +197,10 @@
                 base.log.exception(
                     'Exception audit handling %s: %s',
                     tool_name, method)
+                for k,v in self.Supplement(pylons.c, data, msg, 'audit').extraData().items():
+                    base.log.error('    %s: %s', k, v)
                 if self.options.dry_run: raise
-                self.send_error_report(
-                    sys.exc_info(),
-                    project=pylons.c.project.shortname if pylons.c.project else None,
-                    app=pylons.c.app.config.options.mount_point if pylons.c.app else None,
-                    key=msg.delivery_info['routing_key'],
-                    exchange='audit',
-                    message=data)
+                self.send_error_report(sys.exc_info())
             else:
                 ming.orm.ormsession.ThreadLocalORMSession.flush_all()
             finally:
@@ -224,6 +213,8 @@
         def callback(data, msg):
             msg.ack()
             try:
+                __traceback_supplement__ = (
+                    self.Supplement, pylons.c, data, msg, 'react')
                 # log.info('React(%s): %s', msg.delivery_info['routing_key'], data)
                 if 'user_id' in data:
                     try:
@@ -254,19 +245,34 @@
                     method(msg.delivery_info['routing_key'], data)
             except: # pragma no cover
                 base.log.exception('Exception react handling %s: %s', tool_name, method)
+                for k,v in self.Supplement(pylons.c, data, msg, 'audit').extraData().items():
+                    base.log.error('    %s: %s', k, v)
                 if self.options.dry_run: raise
-                self.send_error_report(
-                    sys.exc_info(),
-                    project=pylons.c.project.shortname if pylons.c.project else None,
-                    app=pylons.c.app.config.options.mount_point if pylons.c.app else None,
-                    key=msg.delivery_info['routing_key'],
-                    exchange='react',
-                    message=data)
+                self.send_error_report(sys.exc_info())
             else:
                 ming.orm.ormsession.ThreadLocalORMSession.flush_all()
             finally:
                 ming.orm.ormsession.ThreadLocalORMSession.close_all()
         return callback
+
+    class Supplement(object):
+        def __init__(self, c, data, msg, exchange):
+            self.c = c
+            self.data = data
+            self.msg = msg
+            self.exchange = exchange
+
+        def extraData(self):
+            project = getattr(self.c, 'project', None)
+            app = getattr(self.c, 'app', None)
+            user = getattr(self.c, 'user', None)
+            return dict(
+                project=project.shortname if project else None,
+                app=app.config.options.mount_point if app else None,
+                user=user.username if user else None,
+                key=self.msg.delivery_info['routing_key'],
+                exchange=self.exchange,
+                message=pformat(self.data))
 
 class SendMessageCommand(base.Command):
     min_args=3