mirror of
https://github.com/Tivix/django-rest-auth.git
synced 2024-11-25 18:43:44 +03:00
Rewrite registration logic
This commit is contained in:
parent
f3151ad5c0
commit
10ae7acac9
|
@ -51,20 +51,9 @@ Registration
|
|||
- /rest-auth/registration/ (POST)
|
||||
|
||||
- username
|
||||
- password1
|
||||
- password2
|
||||
- password
|
||||
- email
|
||||
|
||||
.. note:: This endpoint is based on ``allauth.account.views.SignupView`` and uses the same form as in this view. To override fields you have to create custom Signup Form and define it in django settings:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
ACCOUNT_FORMS = {
|
||||
'signup': 'path.to.custom.SignupForm'
|
||||
}
|
||||
|
||||
See allauth documentation for more details.
|
||||
|
||||
- /rest-auth/registration/verify-email/ (POST)
|
||||
|
||||
- key
|
||||
|
|
|
@ -29,6 +29,14 @@ Configuration
|
|||
...
|
||||
}
|
||||
|
||||
- **REST_AUTH_REGISTRATION_SERIALIZERS**
|
||||
|
||||
You can define your custom serializers for registration endpoint.
|
||||
Possible key values:
|
||||
|
||||
- REGISTER_SERIALIZER - serializer class in ``rest_auth.register.views.RegisterView``, default value ``rest_auth.register.serializers.RegisterSerializer``
|
||||
|
||||
|
||||
|
||||
- **REST_SESSION_LOGIN** - Enable session login in Login API view (default: True)
|
||||
|
||||
|
|
11
rest_auth/registration/app_settings.py
Normal file
11
rest_auth/registration/app_settings.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from django.conf import settings
|
||||
|
||||
from rest_auth.registration.serializers import (
|
||||
RegisterSerializer as DefaultRegisterSerializer)
|
||||
from ..utils import import_callable
|
||||
|
||||
|
||||
serializers = getattr(settings, 'REST_AUTH_REGISTER_SERIALIZERS', {})
|
||||
|
||||
RegisterSerializer = import_callable(
|
||||
serializers.get('REGISTER_SERIALIZER', DefaultRegisterSerializer))
|
|
@ -1,6 +1,15 @@
|
|||
from django.http import HttpRequest
|
||||
from django.conf import settings
|
||||
|
||||
try:
|
||||
from allauth.account import app_settings as allauth_settings
|
||||
from allauth.utils import (email_address_exists,
|
||||
get_username_max_length)
|
||||
from allauth.account.adapter import get_adapter
|
||||
from allauth.account.utils import setup_user_email
|
||||
except ImportError:
|
||||
raise ImportError('allauth needs to be added to INSTALLED_APPS.')
|
||||
|
||||
from rest_framework import serializers
|
||||
from requests.exceptions import HTTPError
|
||||
# Import is needed only if we are using social login, in which
|
||||
|
@ -109,3 +118,44 @@ class SocialLoginSerializer(serializers.Serializer):
|
|||
attrs['user'] = login.account.user
|
||||
|
||||
return attrs
|
||||
|
||||
|
||||
class RegisterSerializer(serializers.Serializer):
|
||||
username = serializers.CharField(
|
||||
max_length=get_username_max_length(),
|
||||
min_length=allauth_settings.USERNAME_MIN_LENGTH,
|
||||
required=allauth_settings.USERNAME_REQUIRED)
|
||||
email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
|
||||
password = serializers.CharField(required=True, write_only=True)
|
||||
|
||||
def validate_username(self, username):
|
||||
username = get_adapter().clean_username(username)
|
||||
return username
|
||||
|
||||
def validate_email(self, email):
|
||||
email = get_adapter().clean_email(email)
|
||||
if allauth_settings.UNIQUE_EMAIL:
|
||||
if email and email_address_exists(email):
|
||||
raise serializers.ValidationError(
|
||||
"A user is already registered with this e-mail address.")
|
||||
return email
|
||||
|
||||
def validate_password(self, password):
|
||||
return get_adapter().clean_password(password)
|
||||
|
||||
def custom_signup(self, request, user):
|
||||
pass
|
||||
|
||||
def save(self, request):
|
||||
adapter = get_adapter()
|
||||
user = adapter.new_user(request)
|
||||
self.cleaned_data = self.validated_data
|
||||
self.cleaned_data['password1'] = self.cleaned_data['password']
|
||||
adapter.save_user(request, user, self)
|
||||
self.custom_signup(request, user)
|
||||
setup_user_email(request, user, [])
|
||||
return user
|
||||
|
||||
|
||||
class VerifyEmailSerializer(serializers.Serializer):
|
||||
key = serializers.CharField()
|
||||
|
|
|
@ -1,77 +1,41 @@
|
|||
from django.http import HttpRequest
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.generics import CreateAPIView
|
||||
from rest_framework import status
|
||||
from rest_framework.authtoken.models import Token
|
||||
from rest_framework.exceptions import MethodNotAllowed
|
||||
|
||||
from allauth.account.views import SignupView, ConfirmEmailView
|
||||
from allauth.account.views import ConfirmEmailView
|
||||
from allauth.account.utils import complete_signup
|
||||
from allauth.account import app_settings
|
||||
from allauth.account import app_settings as allauth_settings
|
||||
|
||||
from rest_auth.app_settings import TokenSerializer
|
||||
from rest_auth.registration.serializers import SocialLoginSerializer
|
||||
from rest_auth.registration.serializers import (SocialLoginSerializer,
|
||||
VerifyEmailSerializer)
|
||||
from .app_settings import RegisterSerializer
|
||||
from rest_auth.views import LoginView
|
||||
|
||||
|
||||
class RegisterView(APIView, SignupView):
|
||||
"""
|
||||
Accepts the credentials and creates a new user
|
||||
if user does not exist already
|
||||
Return the REST Token if the credentials are valid and authenticated.
|
||||
Calls allauth complete_signup method
|
||||
class RegisterView(CreateAPIView):
|
||||
serializer_class = RegisterSerializer
|
||||
|
||||
Accept the following POST parameters: username, email, password
|
||||
Return the REST Framework Token Object's key.
|
||||
"""
|
||||
def create(self, request, *args, **kwargs):
|
||||
serializer = self.get_serializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
user = self.perform_create(serializer)
|
||||
headers = self.get_success_headers(serializer.data)
|
||||
return Response(TokenSerializer(user.auth_token).data,
|
||||
status=status.HTTP_201_CREATED,
|
||||
headers=headers)
|
||||
|
||||
permission_classes = (AllowAny,)
|
||||
allowed_methods = ('POST', 'OPTIONS', 'HEAD')
|
||||
token_model = Token
|
||||
serializer_class = TokenSerializer
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||
|
||||
def put(self, *args, **kwargs):
|
||||
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||
|
||||
def form_valid(self, form):
|
||||
self.user = form.save(self.request)
|
||||
self.token, created = self.token_model.objects.get_or_create(
|
||||
user=self.user
|
||||
)
|
||||
if isinstance(self.request, HttpRequest):
|
||||
request = self.request
|
||||
else:
|
||||
request = self.request._request
|
||||
return complete_signup(request, self.user,
|
||||
app_settings.EMAIL_VERIFICATION,
|
||||
self.get_success_url())
|
||||
|
||||
def get_form_kwargs(self, *args, **kwargs):
|
||||
kwargs = super(RegisterView, self).get_form_kwargs(*args, **kwargs)
|
||||
kwargs['data'] = self.request.data
|
||||
return kwargs
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.initial = {}
|
||||
form_class = self.get_form_class()
|
||||
self.form = self.get_form(form_class)
|
||||
if self.form.is_valid():
|
||||
self.form_valid(self.form)
|
||||
return self.get_response()
|
||||
else:
|
||||
return self.get_response_with_errors()
|
||||
|
||||
def get_response(self):
|
||||
# serializer = self.user_serializer_class(instance=self.user)
|
||||
serializer = self.serializer_class(instance=self.token,
|
||||
context={'request': self.request})
|
||||
return Response(serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
def get_response_with_errors(self):
|
||||
return Response(self.form.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
def perform_create(self, serializer):
|
||||
user = serializer.save(self.request)
|
||||
Token.objects.get_or_create(user=user)
|
||||
complete_signup(self.request._request, user,
|
||||
allauth_settings.EMAIL_VERIFICATION,
|
||||
'/')
|
||||
return user
|
||||
|
||||
|
||||
class VerifyEmailView(APIView, ConfirmEmailView):
|
||||
|
@ -80,10 +44,12 @@ class VerifyEmailView(APIView, ConfirmEmailView):
|
|||
allowed_methods = ('POST', 'OPTIONS', 'HEAD')
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
return Response({}, status=status.HTTP_405_METHOD_NOT_ALLOWED)
|
||||
raise MethodNotAllowed('GET')
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.kwargs['key'] = self.request.data.get('key', '')
|
||||
serializer = VerifyEmailSerializer(data=request.data)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
self.kwargs['key'] = serializer.validated_data['key']
|
||||
confirmation = self.get_object()
|
||||
confirmation.confirm(self.request)
|
||||
return Response({'message': 'ok'}, status=status.HTTP_200_OK)
|
||||
|
|
Loading…
Reference in New Issue
Block a user