Make django pick up app- and module-specific admin email addresses for stack trace messages.
- Legacy-Id: 3204
This commit is contained in:
parent
aeff74a467
commit
7a2859db46
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue