django2: is_authenticated/is_anonymous is now property only

https://docs.djangoproject.com/en/2.0/releases/1.10/#user-is-auth-anon-deprecation

blueprint django2-support
Change-Id: I57a39417f0595eae8d1c06d7e61d0a67078bb231
This commit is contained in:
Akihiro Motoki 2017-12-12 13:48:55 +09:00
parent 826720ada3
commit 1a252cb5e8
12 changed files with 27 additions and 66 deletions

View File

@ -48,7 +48,7 @@ def require_auth(view_func):
@functools.wraps(view_func, assigned=available_attrs(view_func)) @functools.wraps(view_func, assigned=available_attrs(view_func))
def dec(request, *args, **kwargs): def dec(request, *args, **kwargs):
if request.user.is_authenticated(): if request.user.is_authenticated:
return view_func(request, *args, **kwargs) return view_func(request, *args, **kwargs)
raise NotAuthenticated(_("Please log in to continue.")) raise NotAuthenticated(_("Please log in to continue."))
return dec return dec
@ -79,7 +79,7 @@ def require_perms(view_func, required):
@functools.wraps(view_func, assigned=available_attrs(view_func)) @functools.wraps(view_func, assigned=available_attrs(view_func))
def dec(request, *args, **kwargs): def dec(request, *args, **kwargs):
if request.user.is_authenticated(): if request.user.is_authenticated:
if request.user.has_perms(view_func._required_perms): if request.user.has_perms(view_func._required_perms):
return view_func(request, *args, **kwargs) return view_func(request, *args, **kwargs)
raise NotAuthorized(_("You are not authorized to access %s") raise NotAuthorized(_("You are not authorized to access %s")

View File

@ -49,7 +49,7 @@ class HorizonMiddleware(object):
request.horizon = {'dashboard': None, request.horizon = {'dashboard': None,
'panel': None, 'panel': None,
'async_messages': []} 'async_messages': []}
if not hasattr(request, "user") or not request.user.is_authenticated(): if not hasattr(request, "user") or not request.user.is_authenticated:
# proceed no further if the current request is already known # proceed no further if the current request is already known
# not to be authenticated # not to be authenticated
# it is CRITICAL to perform this check as early as possible # it is CRITICAL to perform this check as early as possible

View File

@ -116,7 +116,7 @@ class OperationLogMiddleware(object):
user = getattr(request, 'user', None) user = getattr(request, 'user', None)
if not user: if not user:
return return
if not request.user.is_authenticated(): if not request.user.is_authenticated:
return return
method = request.method.upper() method = request.method.upper()
if not (method in self.target_methods): if not (method in self.target_methods):

View File

@ -243,7 +243,7 @@ class KeystoneBackend(object):
The permissions are returned as ``"openstack.{{ role.name }}"``. The permissions are returned as ``"openstack.{{ role.name }}"``.
""" """
if user.is_anonymous() or obj is not None: if user.is_anonymous or obj is not None:
return set() return set()
# TODO(gabrielhurley): Integrate policy-driven RBAC # TODO(gabrielhurley): Integrate policy-driven RBAC
# when supported by Keystone. # when supported by Keystone.

View File

@ -15,11 +15,9 @@ import datetime
import hashlib import hashlib
import logging import logging
import django
from django.conf import settings from django.conf import settings
from django.contrib.auth import models from django.contrib.auth import models
from django.db import models as db_models from django.db import models as db_models
from django.utils import deprecation
from keystoneauth1 import exceptions as keystone_exceptions from keystoneauth1 import exceptions as keystone_exceptions
from keystoneclient.common import cms as keystone_cms from keystoneclient.common import cms as keystone_cms
import six import six
@ -278,50 +276,21 @@ class User(models.AbstractBaseUser, models.AnonymousUser):
return None return None
return not utils.is_token_valid(self.token, margin) return not utils.is_token_valid(self.token, margin)
if django.VERSION >= (1, 10): @property
@property def is_authenticated(self):
def is_authenticated(self): """Checks for a valid authentication."""
"""Checks for a valid authentication.""" if (self.token is not None and utils.is_token_valid(self.token)):
if (self.token is not None and utils.is_token_valid(self.token)): return True
return deprecation.CallableTrue else:
else: return False
return deprecation.CallableFalse
@property @property
def is_anonymous(self): def is_anonymous(self):
"""Return if the user is not authenticated. """Return if the user is not authenticated.
:returns: ``True`` if not authenticated,``False`` otherwise. :returns: ``True`` if not authenticated,``False`` otherwise.
""" """
return deprecation.CallableBool(not self.is_authenticated) return not self.is_authenticated
else:
def is_authenticated(self, margin=None):
"""Checks for a valid authentication.
:param margin:
A security time margin in seconds before end of authentication.
Will return ``False`` if authentication ends in less than
``margin`` seconds of time.
A default margin can be set by the TOKEN_TIMEOUT_MARGIN in the
django settings.
"""
return (self.token is not None and
utils.is_token_valid(self.token, margin))
def is_anonymous(self, margin=None):
"""Return if the user is not authenticated.
:returns: ``True`` if not authenticated,``False`` otherwise.
:param margin:
A security time margin in seconds before end of an eventual
authentication.
Will return ``True`` even if authenticated but that
authentication ends in less than ``margin`` seconds of time.
A default margin can be set by the TOKEN_TIMEOUT_MARGIN in the
django settings.
"""
return not self.is_authenticated(margin)
@property @property
def is_active(self): def is_active(self):
@ -340,7 +309,7 @@ class User(models.AbstractBaseUser, models.AnonymousUser):
@property @property
def authorized_tenants(self): def authorized_tenants(self):
"""Returns a memoized list of tenants this user may access.""" """Returns a memoized list of tenants this user may access."""
if self.is_authenticated() and self._authorized_tenants is None: if self.is_authenticated and self._authorized_tenants is None:
endpoint = self.endpoint endpoint = self.endpoint
try: try:
self._authorized_tenants = utils.get_project_list( self._authorized_tenants = utils.get_project_list(

View File

@ -69,7 +69,7 @@ def login(request, template_name=None, extra_context=None, **kwargs):
# dashboard straight away, unless the 'next' parameter is set as it # dashboard straight away, unless the 'next' parameter is set as it
# usually indicates requesting access to a page that requires different # usually indicates requesting access to a page that requires different
# permissions. # permissions.
if (request.user.is_authenticated() and if (request.user.is_authenticated and
auth.REDIRECT_FIELD_NAME not in request.GET and auth.REDIRECT_FIELD_NAME not in request.GET and
auth.REDIRECT_FIELD_NAME not in request.POST): auth.REDIRECT_FIELD_NAME not in request.POST):
return shortcuts.redirect(settings.LOGIN_REDIRECT_URL) return shortcuts.redirect(settings.LOGIN_REDIRECT_URL)
@ -114,7 +114,7 @@ def login(request, template_name=None, extra_context=None, **kwargs):
# Set the session data here because django's session key rotation # Set the session data here because django's session key rotation
# will erase it if we set it earlier. # will erase it if we set it earlier.
if request.user.is_authenticated(): if request.user.is_authenticated:
auth_user.set_session_from_user(request, request.user) auth_user.set_session_from_user(request, request.user)
regions = dict(forms.Login.get_region_choices()) regions = dict(forms.Login.get_region_choices())
region = request.user.endpoint region = request.user.endpoint

View File

@ -105,7 +105,7 @@ def ajax(authenticated=True, data_required=False,
@functools.wraps(function, @functools.wraps(function,
assigned=decorators.available_attrs(function)) assigned=decorators.available_attrs(function))
def _wrapped(self, request, *args, **kw): def _wrapped(self, request, *args, **kw):
if authenticated and not request.user.is_authenticated(): if authenticated and not request.user.is_authenticated:
return JSONResponse('not logged in', 401) return JSONResponse('not logged in', 401)
if not request.is_ajax(): if not request.is_ajax():
return JSONResponse('request must be AJAX', 400) return JSONResponse('request must be AJAX', 400)

View File

@ -44,7 +44,7 @@ def openstack(request):
# Auth/Keystone context # Auth/Keystone context
context.setdefault('authorized_tenants', []) context.setdefault('authorized_tenants', [])
if request.user.is_authenticated(): if request.user.is_authenticated:
context['authorized_tenants'] = [ context['authorized_tenants'] = [
tenant for tenant in tenant for tenant in
request.user.authorized_tenants if tenant.enabled] request.user.authorized_tenants if tenant.enabled]

View File

@ -72,7 +72,7 @@ class ProfilerMiddleware(object):
@staticmethod @staticmethod
def is_authenticated(request): def is_authenticated(request):
return hasattr(request, "user") and request.user.is_authenticated() return hasattr(request, "user") and request.user.is_authenticated
def is_enabled(self, request): def is_enabled(self, request):
return self.is_authenticated(request) and settings.DEBUG return self.is_authenticated(request) and settings.DEBUG

View File

@ -433,7 +433,7 @@ class TestCase(horizon_helpers.TestCase):
@staticmethod @staticmethod
def mock_rest_request(**args): def mock_rest_request(**args):
mock_args = { mock_args = {
'user.is_authenticated.return_value': True, 'user.is_authenticated': True,
'is_ajax.return_value': True, 'is_ajax.return_value': True,
'policy.check.return_value': True, 'policy.check.return_value': True,
'body': '' 'body': ''

View File

@ -23,7 +23,6 @@ class RestUtilsTestCase(test.TestCase):
return 'ok' return 'ok'
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(None, request) response = f(None, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 200) self.assertStatusCode(response, 200)
self.assertEqual("ok", response.json) self.assertEqual("ok", response.json)
@ -33,7 +32,6 @@ class RestUtilsTestCase(test.TestCase):
return 'ok' return 'ok'
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(None, request) response = f(None, request)
request.user.is_authenticated.assert_not_called()
self.assertStatusCode(response, 200) self.assertStatusCode(response, 200)
self.assertEqual("ok", response.json) self.assertEqual("ok", response.json)
@ -42,10 +40,9 @@ class RestUtilsTestCase(test.TestCase):
def f(self, request): def f(self, request):
return 'ok' return 'ok'
request = self.mock_rest_request(**{ request = self.mock_rest_request(**{
'user.is_authenticated.return_value': False 'user.is_authenticated': False
}) })
response = f(None, request) response = f(None, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 401) self.assertStatusCode(response, 401)
self.assertEqual("not logged in", response.json) self.assertEqual("not logged in", response.json)
@ -111,7 +108,6 @@ class RestUtilsTestCase(test.TestCase):
return utils.CreatedResponse('/api/spam/spam123') return utils.CreatedResponse('/api/spam/spam123')
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(None, request) response = f(None, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 201) self.assertStatusCode(response, 201)
self.assertEqual('/api/spam/spam123', response['location']) self.assertEqual('/api/spam/spam123', response['location'])
self.assertEqual(b'', response.content) self.assertEqual(b'', response.content)
@ -122,7 +118,6 @@ class RestUtilsTestCase(test.TestCase):
return utils.CreatedResponse('/api/spam/spam123', 'spam!') return utils.CreatedResponse('/api/spam/spam123', 'spam!')
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(None, request) response = f(None, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 201) self.assertStatusCode(response, 201)
self.assertEqual('/api/spam/spam123', response['location']) self.assertEqual('/api/spam/spam123', response['location'])
self.assertEqual("spam!", response.json) self.assertEqual("spam!", response.json)
@ -185,7 +180,6 @@ class JSONEncoderTestCase(test.TestCase):
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(self, request) response = f(self, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 200) self.assertStatusCode(response, 200)
self.assertEqual('application/json', response['content-type']) self.assertEqual('application/json', response['content-type'])
self.assertEqual(b'NaN', response.content) self.assertEqual(b'NaN', response.content)
@ -197,7 +191,6 @@ class JSONEncoderTestCase(test.TestCase):
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(self, request) response = f(self, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 200) self.assertStatusCode(response, 200)
self.assertEqual('application/json', response['content-type']) self.assertEqual('application/json', response['content-type'])
self.assertEqual(b'1e+999', response.content) self.assertEqual(b'1e+999', response.content)
@ -209,7 +202,6 @@ class JSONEncoderTestCase(test.TestCase):
request = self.mock_rest_request() request = self.mock_rest_request()
response = f(self, request) response = f(self, request)
request.user.is_authenticated.assert_called_once_with()
self.assertStatusCode(response, 200) self.assertStatusCode(response, 200)
self.assertEqual('application/json', response['content-type']) self.assertEqual('application/json', response['content-type'])
self.assertEqual(b'-1e+999', response.content) self.assertEqual(b'-1e+999', response.content)

View File

@ -56,7 +56,7 @@ def get_user_home(user):
@django.views.decorators.vary.vary_on_cookie @django.views.decorators.vary.vary_on_cookie
def splash(request): def splash(request):
if not request.user.is_authenticated(): if not request.user.is_authenticated:
raise exceptions.NotAuthenticated() raise exceptions.NotAuthenticated()
response = shortcuts.redirect(horizon.get_user_home(request.user)) response = shortcuts.redirect(horizon.get_user_home(request.user))