Skip to content

Commit c9d55f7

Browse files
committed
Add support for custom Token model
1 parent 4a56a9e commit c9d55f7

File tree

7 files changed

+29
-12
lines changed

7 files changed

+29
-12
lines changed

docs/configuration.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ Configuration
2929
...
3030
}
3131
32+
- **REST_AUTH_TOKEN_MODEL** - model class for tokens, default value ``rest_framework.authtoken.models``
3233

33-
- **REST_SESSION_LOGIN** - Enable session login in Login API view (default: True)
34+
- **REST_AUTH_TOKEN_CREATOR** - callable to create tokens, default value ``rest_auth.utils.default_create_token``.
3435

36+
- **REST_SESSION_LOGIN** - Enable session login in Login API view (default: True)
3537

3638
- **OLD_PASSWORD_FIELD_ENABLED** - set it to True if you want to have old password verification on password change enpoint (default: False)
3739

rest_auth/app_settings.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
PasswordResetSerializer as DefaultPasswordResetSerializer,
88
PasswordResetConfirmSerializer as DefaultPasswordResetConfirmSerializer,
99
PasswordChangeSerializer as DefaultPasswordChangeSerializer)
10-
from .utils import import_callable
10+
from .utils import import_callable, default_create_token
1111

12+
create_token = import_callable(
13+
getattr(settings, 'REST_AUTH_TOKEN_CREATOR', default_create_token))
1214

1315
serializers = getattr(settings, 'REST_AUTH_SERIALIZERS', {})
1416

rest_auth/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1-
# from django.db import models
1+
from django.conf import settings
2+
3+
from rest_framework.authtoken.models import Token as DefaultTokenModel
4+
5+
from .utils import import_callable
26

37
# Register your models here.
8+
9+
TokenModel = import_callable(
10+
getattr(settings, 'REST_AUTH_TOKEN_MODEL', DefaultTokenModel))

rest_auth/registration/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
from rest_framework.response import Response
44
from rest_framework.permissions import AllowAny
55
from rest_framework import status
6-
from rest_framework.authtoken.models import Token
76

87
from allauth.account.views import SignupView, ConfirmEmailView
98
from allauth.account.utils import complete_signup
@@ -12,6 +11,7 @@
1211
from rest_auth.app_settings import TokenSerializer
1312
from rest_auth.registration.serializers import SocialLoginSerializer
1413
from rest_auth.views import LoginView
14+
from rest_auth.models import TokenModel
1515

1616

1717
class RegisterView(APIView, SignupView):
@@ -27,7 +27,7 @@ class RegisterView(APIView, SignupView):
2727

2828
permission_classes = (AllowAny,)
2929
allowed_methods = ('POST', 'OPTIONS', 'HEAD')
30-
token_model = Token
30+
token_model = TokenModel
3131
serializer_class = TokenSerializer
3232

3333
def get(self, *args, **kwargs):

rest_auth/serializers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from django.utils.translation import ugettext_lazy as _
77
from django.utils.encoding import force_text
88

9+
from .models import TokenModel
10+
911
from rest_framework import serializers, exceptions
10-
from rest_framework.authtoken.models import Token
1112
from rest_framework.exceptions import ValidationError
1213

1314
# Get the UserModel
@@ -84,7 +85,7 @@ class TokenSerializer(serializers.ModelSerializer):
8485
"""
8586

8687
class Meta:
87-
model = Token
88+
model = TokenModel
8889
fields = ('key',)
8990

9091

rest_auth/utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,9 @@ def import_callable(path_or_callable):
99
assert isinstance(path_or_callable, string_types)
1010
package, attr = path_or_callable.rsplit('.', 1)
1111
return getattr(import_module(package), attr)
12+
13+
14+
def default_create_token(token_model, serializer):
15+
user = serializer.validated_data['user']
16+
token, _ = token_model.objects.get_or_create(user=user)
17+
return token

rest_auth/views.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
from rest_framework.response import Response
88
from rest_framework.generics import GenericAPIView
99
from rest_framework.permissions import IsAuthenticated, AllowAny
10-
from rest_framework.authtoken.models import Token
1110
from rest_framework.generics import RetrieveUpdateAPIView
1211

1312
from .app_settings import (
1413
TokenSerializer, UserDetailsSerializer, LoginSerializer,
1514
PasswordResetSerializer, PasswordResetConfirmSerializer,
16-
PasswordChangeSerializer
15+
PasswordChangeSerializer, create_token
1716
)
17+
from .models import TokenModel
1818

1919

2020
class LoginView(GenericAPIView):
@@ -30,13 +30,12 @@ class LoginView(GenericAPIView):
3030
"""
3131
permission_classes = (AllowAny,)
3232
serializer_class = LoginSerializer
33-
token_model = Token
33+
token_model = TokenModel
3434
response_serializer = TokenSerializer
3535

3636
def login(self):
3737
self.user = self.serializer.validated_data['user']
38-
self.token, created = self.token_model.objects.get_or_create(
39-
user=self.user)
38+
self.token = create_token(self.token_model, self.serializer)
4039
if getattr(settings, 'REST_SESSION_LOGIN', True):
4140
login(self.request, self.user)
4241

0 commit comments

Comments
 (0)