Skip to content

Commit f9547f6

Browse files
committed
Merge pull request #144 from caruccio/custom-token
Add support for custom Token model
2 parents 334a29c + c087899 commit f9547f6

File tree

7 files changed

+31
-14
lines changed

7 files changed

+31
-14
lines changed

docs/configuration.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ Configuration
3636

3737
- REGISTER_SERIALIZER - serializer class in ``rest_auth.register.views.RegisterView``, default value ``rest_auth.register.serializers.RegisterSerializer``
3838

39+
- **REST_AUTH_TOKEN_MODEL** - model class for tokens, default value ``rest_framework.authtoken.models``
3940

41+
- **REST_AUTH_TOKEN_CREATOR** - callable to create tokens, default value ``rest_auth.utils.default_create_token``.
4042

4143
- **REST_SESSION_LOGIN** - Enable session login in Login API view (default: True)
4244

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

4647
- **LOGOUT_ON_PASSWORD_CHANGE** - set to False if you want to keep the current user logged in after a password change

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: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,25 @@
33
from rest_framework.permissions import AllowAny
44
from rest_framework.generics import CreateAPIView
55
from rest_framework import status
6-
from rest_framework.authtoken.models import Token
76
from rest_framework.exceptions import MethodNotAllowed
87

98
from allauth.account.views import ConfirmEmailView
109
from allauth.account.utils import complete_signup
1110
from allauth.account import app_settings as allauth_settings
1211

13-
from rest_auth.app_settings import TokenSerializer
12+
from rest_auth.app_settings import (TokenSerializer,
13+
create_token)
1414
from rest_auth.registration.serializers import (SocialLoginSerializer,
1515
VerifyEmailSerializer)
16-
from .app_settings import RegisterSerializer
1716
from rest_auth.views import LoginView
17+
from rest_auth.models import TokenModel
18+
from .app_settings import RegisterSerializer
1819

1920

2021
class RegisterView(CreateAPIView):
2122
serializer_class = RegisterSerializer
2223
permission_classes = (AllowAny, )
24+
token_model = TokenModel
2325

2426
def create(self, request, *args, **kwargs):
2527
serializer = self.get_serializer(data=request.data)
@@ -32,7 +34,7 @@ def create(self, request, *args, **kwargs):
3234

3335
def perform_create(self, serializer):
3436
user = serializer.save(self.request)
35-
Token.objects.get_or_create(user=user)
37+
create_token(self.token_model, user, serializer)
3638
complete_signup(self.request._request, user,
3739
allauth_settings.EMAIL_VERIFICATION,
3840
None)

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
@@ -114,7 +115,7 @@ class TokenSerializer(serializers.ModelSerializer):
114115
"""
115116

116117
class Meta:
117-
model = Token
118+
model = TokenModel
118119
fields = ('key',)
119120

120121

rest_auth/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,8 @@ 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, user, serializer):
15+
token, _ = token_model.objects.get_or_create(user=user)
16+
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.user, self.serializer)
4039
if getattr(settings, 'REST_SESSION_LOGIN', True):
4140
login(self.request, self.user)
4241

0 commit comments

Comments
 (0)