add try/except for local timezone conversion to prevent timezone error (mail admins)
authorraph
Wed, 03 Mar 2010 10:29:05 +0100
changeset 201 e0032b64c314
parent 200 e5e8cdfde782
child 202 aa741039e87a
add try/except for local timezone conversion to prevent timezone error (mail admins)
src/cm/templatetags/com.py
src/cm/utils/log.py
--- a/src/cm/templatetags/com.py	Tue Mar 02 10:57:44 2010 +0100
+++ b/src/cm/templatetags/com.py	Wed Mar 03 10:29:05 2010 +0100
@@ -128,7 +128,8 @@
 from datetime import datetime
 from time import struct_time
 from cm.utils.timezone import tz_convert
-
+from pytz import UnknownTimeZoneError
+from cm.utils.log import error_mail_admins
 @register.filter
 def local_date(value, tz=None):
     """Formats a date according to the given local date format."""
@@ -137,7 +138,10 @@
     if isinstance(value,struct_time): 
         publication_date = datetime(value.tm_year,value.tm_mon,value.tm_mday,value.tm_hour,value.tm_min,value.tm_sec)
 
-    value = tz_convert(value,tz)
+    try:
+        value = tz_convert(value,tz)
+    except UnknownTimeZoneError:
+        error_mail_admins()
     
     arg = _(u"F j, Y \\a\\t g:i a") 
     return format(value, arg)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/cm/utils/log.py	Wed Mar 03 10:29:05 2010 +0100
@@ -0,0 +1,21 @@
+from django.conf import settings
+from django.core.mail import mail_admins
+import sys
+
+def _get_traceback(exc_info):
+    import traceback
+    return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))
+
+def error_mail_admins(subject='Error', request=None):
+    if request:        
+        subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), request.path)
+        
+    try:
+        request_repr = repr(request)
+    except:
+        request_repr = "Request repr() unavailable"
+        
+    exc_info = sys.exc_info()
+    message = "%s\n\n%s" % (_get_traceback(exc_info), request_repr)
+    
+    mail_admins(subject, message, fail_silently=True)