aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMjumbe Wawatu Poe2012-09-07 17:05:21 -0400
committerMjumbe Wawatu Poe2012-09-07 17:05:21 -0400
commit7d9125bcb69950e54bb9c2ca61f59403c1018178 (patch)
treebb020483d1eeffdbbfa3fa0ab2682c99142c2e3e
parent72bdd0fcec7faa32d7f24e0698736f9433b56f3f (diff)
downloaddjango-rest-framework-7d9125bcb69950e54bb9c2ca61f59403c1018178.tar.bz2
Fix Django 1.3 compatibility
-rw-r--r--djangorestframework/compat.py53
-rw-r--r--djangorestframework/fields.py6
-rw-r--r--djangorestframework/settings.py5
-rw-r--r--djangorestframework/utils/encoders.py4
4 files changed, 62 insertions, 6 deletions
diff --git a/djangorestframework/compat.py b/djangorestframework/compat.py
index 7ced70c5..f21dc4ef 100644
--- a/djangorestframework/compat.py
+++ b/djangorestframework/compat.py
@@ -366,6 +366,59 @@ else:
return self._accept(request)
+# timezone support is new in Django 1.4
+try:
+ from django.utils import timezone
+except ImportError:
+ timezone = None
+
+# dateparse is ALSO new in Django 1.4
+try:
+ from django.utils.dateparse import parse_date, parse_datetime
+except ImportError:
+ import datetime
+ import re
+
+ date_re = re.compile(
+ r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})$'
+ )
+
+ datetime_re = re.compile(
+ r'(?P<year>\d{4})-(?P<month>\d{1,2})-(?P<day>\d{1,2})'
+ r'[T ](?P<hour>\d{1,2}):(?P<minute>\d{1,2})'
+ r'(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?'
+ r'(?P<tzinfo>Z|[+-]\d{1,2}:\d{1,2})?$'
+ )
+
+ time_re = re.compile(
+ r'(?P<hour>\d{1,2}):(?P<minute>\d{1,2})'
+ r'(?::(?P<second>\d{1,2})(?:\.(?P<microsecond>\d{1,6})\d{0,6})?)?'
+ )
+
+ def parse_date(value):
+ match = date_re.match(value)
+ if match:
+ kw = dict((k, int(v)) for k, v in match.groupdict().iteritems())
+ return datetime.date(**kw)
+
+ def parse_time(value):
+ match = time_re.match(value)
+ if match:
+ kw = match.groupdict()
+ if kw['microsecond']:
+ kw['microsecond'] = kw['microsecond'].ljust(6, '0')
+ kw = dict((k, int(v)) for k, v in kw.iteritems() if v is not None)
+ return datetime.time(**kw)
+
+ def parse_datetime(value):
+ """Parse datetime, but w/o the timezone awareness in 1.4"""
+ match = datetime_re.match(value)
+ if match:
+ kw = match.groupdict()
+ if kw['microsecond']:
+ kw['microsecond'] = kw['microsecond'].ljust(6, '0')
+ kw = dict((k, int(v)) for k, v in kw.iteritems() if v is not None)
+ return datetime.datetime(**kw)
# Markdown is optional
try:
diff --git a/djangorestframework/fields.py b/djangorestframework/fields.py
index a44eb417..13b0e37d 100644
--- a/djangorestframework/fields.py
+++ b/djangorestframework/fields.py
@@ -8,10 +8,10 @@ from django.core.exceptions import ValidationError
from django.conf import settings
from django.db import DEFAULT_DB_ALIAS
from django.db.models.related import RelatedObject
-from django.utils import timezone
-from django.utils.dateparse import parse_date, parse_datetime
from django.utils.encoding import is_protected_type, smart_unicode
from django.utils.translation import ugettext_lazy as _
+from djangorestframework.compat import parse_date, parse_datetime
+from djangorestframework.compat import timezone
def is_simple_callable(obj):
@@ -317,7 +317,7 @@ class DateField(Field):
if value is None:
return value
if isinstance(value, datetime.datetime):
- if settings.USE_TZ and timezone.is_aware(value):
+ if timezone and settings.USE_TZ and timezone.is_aware(value):
# Convert aware datetimes to the default time zone
# before casting them to dates (#17742).
default_timezone = timezone.get_default_timezone()
diff --git a/djangorestframework/settings.py b/djangorestframework/settings.py
index 8bb03555..e5181f4b 100644
--- a/djangorestframework/settings.py
+++ b/djangorestframework/settings.py
@@ -88,7 +88,10 @@ def import_from_string(val, setting):
module_path, class_name = '.'.join(parts[:-1]), parts[-1]
module = importlib.import_module(module_path)
return getattr(module, class_name)
- except:
+ except Exception, e:
+ import traceback
+ tb = traceback.format_exc()
+ import pdb; pdb.set_trace()
msg = "Could not import '%s' for API setting '%s'" % (val, setting)
raise ImportError(msg)
diff --git a/djangorestframework/utils/encoders.py b/djangorestframework/utils/encoders.py
index ba7c8553..74876017 100644
--- a/djangorestframework/utils/encoders.py
+++ b/djangorestframework/utils/encoders.py
@@ -3,8 +3,8 @@ Helper classes for parsers.
"""
import datetime
import decimal
-from django.utils import timezone
from django.utils import simplejson as json
+from djangorestframework.compat import timezone
class JSONEncoder(json.JSONEncoder):
@@ -25,7 +25,7 @@ class JSONEncoder(json.JSONEncoder):
elif isinstance(o, datetime.date):
return o.isoformat()
elif isinstance(o, datetime.time):
- if timezone.is_aware(o):
+ if timezone and timezone.is_aware(o):
raise ValueError("JSON can't represent timezone-aware times.")
r = o.isoformat()
if o.microsecond: