From 79daf315c4504d55bfd6025567be8ec9f35d361c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Piln=C3=A1=C4=8Dek?= Date: Fri, 9 Oct 2020 13:16:15 +0200 Subject: [PATCH] Fix: authtoken.TokenProxy cannot be proxy when not installed (#7571) closes https://github.com/encode/django-rest-framework/issues/7442 --- rest_framework/authtoken/models.py | 3 ++- tests/test_authtoken.py | 11 ++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py index fd8a50e0e..540049295 100644 --- a/rest_framework/authtoken/models.py +++ b/rest_framework/authtoken/models.py @@ -49,5 +49,6 @@ class TokenProxy(Token): return self.user.pk class Meta: - proxy = True + proxy = 'rest_framework.authtoken' in settings.INSTALLED_APPS + abstract = 'rest_framework.authtoken' not in settings.INSTALLED_APPS verbose_name = "token" diff --git a/tests/test_authtoken.py b/tests/test_authtoken.py index 036e317ef..30e416d65 100644 --- a/tests/test_authtoken.py +++ b/tests/test_authtoken.py @@ -1,10 +1,11 @@ +import importlib from io import StringIO import pytest from django.contrib.admin import site from django.contrib.auth.models import User from django.core.management import CommandError, call_command -from django.test import TestCase +from django.test import TestCase, modify_settings from rest_framework.authtoken.admin import TokenAdmin from rest_framework.authtoken.management.commands.drf_create_token import \ @@ -21,6 +22,14 @@ class AuthTokenTests(TestCase): self.user = User.objects.create_user(username='test_user') self.token = Token.objects.create(key='test token', user=self.user) + def test_authtoken_can_be_imported_when_not_included_in_installed_apps(self): + import rest_framework.authtoken.models + with modify_settings(INSTALLED_APPS={'remove': 'rest_framework.authtoken'}): + importlib.reload(rest_framework.authtoken.models) + # Set the proxy and abstract properties back to the version, + # where authtoken is among INSTALLED_APPS. + importlib.reload(rest_framework.authtoken.models) + def test_model_admin_displayed_fields(self): mock_request = object() token_admin = TokenAdmin(self.token, self.site)