Skip to content

Commit 7a2859d

Browse files
committed
Make django pick up app- and module-specific admin email addresses for stack trace messages.
- Legacy-Id: 3204
1 parent aeff74a commit 7a2859d

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

django/core/handlers/base.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ def handle_uncaught_exception(self, request, resolver, exc_info):
164164
except:
165165
request_repr = "Request repr() unavailable"
166166
message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
167-
mail_admins(subject, message, fail_silently=True, html_message=html)
167+
extra_emails = self._get_extra_emails(exc_info)
168+
mail_admins(subject, message, fail_silently=True, html_message=html, extra_emails=extra_emails)
168169
# Return an HttpResponse that displays a friendly error message.
169170
callback, param_dict = resolver.resolve500()
170171
return callback(request, **param_dict)
@@ -174,6 +175,17 @@ def _get_traceback(self, exc_info=None):
174175
import traceback
175176
return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))
176177

178+
def _get_extra_emails(self, exc_info=None):
179+
"Helper function to retrieve app-specific admin email lists."
180+
etype, value, tb = exc_info or sys.exc_info()
181+
admins = []
182+
while tb is not None:
183+
f = tb.tb_frame
184+
if "DEBUG_EMAILS" in f.f_globals:
185+
admins += f.f_globals["DEBUG_EMAILS"]
186+
tb = tb.tb_next
187+
return admins
188+
177189
def apply_response_fixes(self, request, response):
178190
"""
179191
Applies each of the functions in self.response_fixes to the request and

django/core/mail.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,12 +409,14 @@ def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
409409
for subject, message, sender, recipient in datatuple]
410410
return connection.send_messages(messages)
411411

412-
def mail_admins(subject, message, fail_silently=False, html_message=None):
412+
def mail_admins(subject, message, fail_silently=False, html_message=None, extra_emails=[]):
413413
"""Sends a message to the admins, as defined by the ADMINS setting."""
414-
if not settings.ADMINS:
414+
if not (settings.ADMINS or extra_emails):
415415
return
416+
emails = set(list(settings.ADMINS) + extra_emails);
417+
print " * Admin email addresses:", emails
416418
from django.core.mail import EmailMultiAlternatives
417-
msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS])
419+
msg = EmailMultiAlternatives(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in emails])
418420
if html_message:
419421
msg.attach_alternative(html_message, "text/html")
420422
msg.send(fail_silently=fail_silently)

0 commit comments

Comments
 (0)