thirdparty/google_appengine/google/appengine/api/croninfo.py
changeset 1278 a7766286a7be
parent 828 f5fd65cc3bf3
child 2273 e4cb9c53db3e
--- a/thirdparty/google_appengine/google/appengine/api/croninfo.py	Thu Feb 12 10:24:37 2009 +0000
+++ b/thirdparty/google_appengine/google/appengine/api/croninfo.py	Thu Feb 12 12:30:36 2009 +0000
@@ -23,6 +23,15 @@
 
 
 
+import logging
+import sys
+import traceback
+
+try:
+  import pytz
+except ImportError:
+  pytz = None
+
 from google.appengine.cron import groc
 from google.appengine.api import validation
 from google.appengine.api import yaml_builder
@@ -30,10 +39,7 @@
 from google.appengine.api import yaml_object
 
 _URL_REGEX = r'^/.*$'
-
-
 _TIMEZONE_REGEX = r'^.{0,100}$'
-
 _DESCRIPTION_REGEX = r'^.{0,499}$'
 
 
@@ -55,6 +61,31 @@
     return value
 
 
+class TimezoneValidator(validation.Validator):
+  """Checks that a timezone can be correctly parsed and is known."""
+
+  def Validate(self, value):
+    """Validates a timezone."""
+    if value is None:
+      return
+    if not isinstance(value, basestring):
+      raise TypeError('timezone must be a string, not \'%r\'' % type(value))
+    if pytz is None:
+      return value
+    try:
+      pytz.timezone(value)
+    except pytz.UnknownTimeZoneError:
+      raise validation.ValidationError('timezone \'%s\' is unknown' % value)
+    except IOError:
+      return value
+    except:
+      e, v, t = sys.exc_info()
+      logging.warning("pytz raised an unexpected error: %s.\n" % (v) +
+                      "Traceback:\n" + "\n".join(traceback.format_tb(t)))
+      raise
+    return value
+
+
 CRON = 'cron'
 
 URL = 'url'
@@ -73,7 +104,7 @@
   ATTRIBUTES = {
       URL: _URL_REGEX,
       SCHEDULE: GrocValidator(),
-      TIMEZONE: validation.Optional(_TIMEZONE_REGEX),
+      TIMEZONE: TimezoneValidator(),
       DESCRIPTION: validation.Optional(_DESCRIPTION_REGEX)
   }