diff options
| author | Tom Christie | 2013-06-26 21:18:13 +0100 | 
|---|---|---|
| committer | Tom Christie | 2013-06-26 21:18:13 +0100 | 
| commit | 69e5e3cc0db481e4fad7ac34bf28b73f4786e790 (patch) | |
| tree | 9543d737204fa7f766f9d497117247fc92424b86 | |
| parent | 715bd47dfababd39be9b3295ada99f2107d7c00c (diff) | |
| download | django-rest-framework-69e5e3cc0db481e4fad7ac34bf28b73f4786e790.tar.bz2 | |
Use timezone aware datetimes with oauth2 provider, when supported.  Closes #947.
| -rw-r--r-- | rest_framework/authentication.py | 9 | ||||
| -rw-r--r-- | rest_framework/compat.py | 10 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 5 | 
3 files changed, 18 insertions, 6 deletions
diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py index f659a172..10298027 100644 --- a/rest_framework/authentication.py +++ b/rest_framework/authentication.py @@ -3,14 +3,13 @@ Provides various authentication policies.  """  from __future__ import unicode_literals  import base64 -from datetime import datetime  from django.contrib.auth import authenticate  from django.core.exceptions import ImproperlyConfigured  from rest_framework import exceptions, HTTP_HEADER_ENCODING  from rest_framework.compat import CsrfViewMiddleware  from rest_framework.compat import oauth, oauth_provider, oauth_provider_store -from rest_framework.compat import oauth2_provider +from rest_framework.compat import oauth2_provider, provider_now  from rest_framework.authtoken.models import Token @@ -320,9 +319,9 @@ class OAuth2Authentication(BaseAuthentication):          try:              token = oauth2_provider.models.AccessToken.objects.select_related('user') -            # TODO: Change to timezone aware datetime when oauth2_provider add -            # support to it. -            token = token.get(token=access_token, expires__gt=datetime.now()) +            # provider_now switches to timezone aware datetime when +            # the oauth2_provider version supports to it. +            token = token.get(token=access_token, expires__gt=provider_now())          except oauth2_provider.models.AccessToken.DoesNotExist:              raise exceptions.AuthenticationFailed('Invalid token') diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 69853730..b748dcc5 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -2,6 +2,7 @@  The `compat` module provides support for backwards compatibility with older  versions of django/python, and compatibility wrappers around optional packages.  """ +  # flake8: noqa  from __future__ import unicode_literals @@ -489,12 +490,21 @@ try:      from provider.oauth2 import forms as oauth2_provider_forms      from provider import scope as oauth2_provider_scope      from provider import constants as oauth2_constants +    from provider import __version__ as provider_version +    if provider_version in ('0.2.3', '0.2.4'): +        # 0.2.3 and 0.2.4 are supported version that do not support +        # timezone aware datetimes +        from datetime.datetime import now as provider_now +    else: +        # Any other supported version does use timezone aware datetimes +        from django.utils.timezone import now as provider_now  except ImportError:      oauth2_provider = None      oauth2_provider_models = None      oauth2_provider_forms = None      oauth2_provider_scope = None      oauth2_constants = None +    provider_now = None  # Handle lazy strings  from django.utils.functional import Promise diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 5a8fd89f..023f7ccf 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -915,7 +915,10 @@ class HyperlinkedModelSerializer(ModelSerializer):                  view_name=self.opts.view_name,                  lookup_field=self.opts.lookup_field              ) -            fields.insert(0, 'url', url_field) +            ret = self._dict_class() +            ret['url'] = url_field +            ret.update(fields) +            fields = ret          return fields  | 
