Merge pull request #251 from mjumbewu/1.3-support

Fix Django 1.3 compatibility
This commit is contained in:
Tom Christie 2012-09-07 22:40:05 -07:00
commit 274420c658
5 changed files with 72 additions and 7 deletions

View File

@ -366,6 +366,59 @@ else:
return self._accept(request) 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 # Markdown is optional
try: try:

View File

@ -8,10 +8,10 @@ from django.core.exceptions import ValidationError
from django.conf import settings from django.conf import settings
from django.db import DEFAULT_DB_ALIAS from django.db import DEFAULT_DB_ALIAS
from django.db.models.related import RelatedObject 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.encoding import is_protected_type, smart_unicode
from django.utils.translation import ugettext_lazy as _ 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): def is_simple_callable(obj):
@ -317,7 +317,7 @@ class DateField(Field):
if value is None: if value is None:
return value return value
if isinstance(value, datetime.datetime): 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 # Convert aware datetimes to the default time zone
# before casting them to dates (#17742). # before casting them to dates (#17742).
default_timezone = timezone.get_default_timezone() default_timezone = timezone.get_default_timezone()

View File

@ -88,7 +88,10 @@ def import_from_string(val, setting):
module_path, class_name = '.'.join(parts[:-1]), parts[-1] module_path, class_name = '.'.join(parts[:-1]), parts[-1]
module = importlib.import_module(module_path) module = importlib.import_module(module_path)
return getattr(module, class_name) 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) msg = "Could not import '%s' for API setting '%s'" % (val, setting)
raise ImportError(msg) raise ImportError(msg)

View File

@ -94,7 +94,16 @@ class TestContentParsing(TestCase):
""" """
data = {'qwerty': 'uiop'} data = {'qwerty': 'uiop'}
parsers = (FormParser, MultiPartParser) parsers = (FormParser, MultiPartParser)
request = factory.put('/', data, parsers=parsers)
from django import VERSION
if VERSION >= (1, 5):
from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
request = factory.put('/', encode_multipart(BOUNDARY, data), parsers=parsers,
content_type=MULTIPART_CONTENT)
else:
request = factory.put('/', data, parsers=parsers)
self.assertEqual(request.DATA.items(), data.items()) self.assertEqual(request.DATA.items(), data.items())
def test_standard_behaviour_determines_non_form_content_PUT(self): def test_standard_behaviour_determines_non_form_content_PUT(self):

View File

@ -3,8 +3,8 @@ Helper classes for parsers.
""" """
import datetime import datetime
import decimal import decimal
from django.utils import timezone
from django.utils import simplejson as json from django.utils import simplejson as json
from djangorestframework.compat import timezone
class JSONEncoder(json.JSONEncoder): class JSONEncoder(json.JSONEncoder):
@ -25,7 +25,7 @@ class JSONEncoder(json.JSONEncoder):
elif isinstance(o, datetime.date): elif isinstance(o, datetime.date):
return o.isoformat() return o.isoformat()
elif isinstance(o, datetime.time): 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.") raise ValueError("JSON can't represent timezone-aware times.")
r = o.isoformat() r = o.isoformat()
if o.microsecond: if o.microsecond: