Make django pick up app- and module-specific admin email addresses for stack trace messages.

- Legacy-Id: 3204
This commit is contained in:
Henrik Levkowetz 2011-07-23 12:48:08 +00:00
parent aeff74a467
commit 7a2859db46
2 changed files with 18 additions and 4 deletions

View file

@ -164,7 +164,8 @@ class BaseHandler(object):
except:
request_repr = "Request repr() unavailable"
message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
mail_admins(subject, message, fail_silently=True, html_message=html)
extra_emails = self._get_extra_emails(exc_info)
mail_admins(subject, message, fail_silently=True, html_message=html, extra_emails=extra_emails)
# Return an HttpResponse that displays a friendly error message.
callback, param_dict = resolver.resolve500()
return callback(request, **param_dict)
@ -174,6 +175,17 @@ class BaseHandler(object):
import traceback
return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))
def _get_extra_emails(self, exc_info=None):
"Helper function to retrieve app-specific admin email lists."
etype, value, tb = exc_info or sys.exc_info()
admins = []
while tb is not None:
f = tb.tb_frame
if "DEBUG_EMAILS" in f.f_globals:
admins += f.f_globals["DEBUG_EMAILS"]
tb = tb.tb_next
return admins
def apply_response_fixes(self, request, response):
"""
Applies each of the functions in self.response_fixes to the request and

View file

@ -409,12 +409,14 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
for subject, message, sender, recipient in datatuple]
return connection.send_messages(messages)
def mail_admins(subject, message, fail_silently=False, html_message=None):
def mail_admins(subject, message, fail_silently=False, html_message=None, extra_emails=[]):
"""Sends a message to the admins, as defined by the ADMINS setting."""
if not settings.ADMINS:
if not (settings.ADMINS or extra_emails):
return
emails = set(list(settings.ADMINS) + extra_emails);
print " * Admin email addresses:", emails
from django.core.mail import EmailMultiAlternatives
msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS])
msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in emails])
if html_message:
msg.attach_alternative(html_message, "text/html")
msg.send(fail_silently=fail_silently)