|
|
|
@ -1,21 +1,31 @@ |
|
|
|
from datetime import timedelta |
|
|
|
from datetime import timedelta |
|
|
|
|
|
|
|
import string |
|
|
|
|
|
|
|
import logging |
|
|
|
|
|
|
|
from urllib.parse import urlencode |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from django.conf import settings |
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
from django.contrib.auth import get_user_model |
|
|
|
|
|
|
|
from django.db.models import Q |
|
|
|
from django.utils.translation import ugettext_lazy as _ |
|
|
|
from django.utils.translation import ugettext_lazy as _ |
|
|
|
from django.shortcuts import get_object_or_404 |
|
|
|
from django.shortcuts import get_object_or_404 |
|
|
|
from django.utils.timezone import now |
|
|
|
from django.utils.timezone import now |
|
|
|
|
|
|
|
from django.urls import reverse_lazy |
|
|
|
|
|
|
|
from phonenumber_field.serializerfields import PhoneNumberField |
|
|
|
|
|
|
|
|
|
|
|
from rest_framework import serializers |
|
|
|
from rest_framework import serializers |
|
|
|
from rest_framework.authtoken.views import ObtainAuthToken |
|
|
|
from rest_framework.authtoken.views import ObtainAuthToken |
|
|
|
from rest_framework.compat import authenticate |
|
|
|
from rest_framework.compat import authenticate |
|
|
|
from rest_framework.response import Response |
|
|
|
from rest_framework.response import Response |
|
|
|
from rest_framework.views import APIView |
|
|
|
from rest_framework.views import APIView |
|
|
|
from rest_framework.authtoken.models import Token |
|
|
|
|
|
|
|
from rest_framework import status |
|
|
|
from rest_framework import status |
|
|
|
|
|
|
|
from rest_framework.authentication import BasicAuthentication |
|
|
|
|
|
|
|
|
|
|
|
from apps.auth.models import TempToken |
|
|
|
from apps.auth.models import TempToken |
|
|
|
|
|
|
|
from apps.auth.tokens import verification_email_token |
|
|
|
|
|
|
|
from apps.notification.utils import send_email |
|
|
|
|
|
|
|
|
|
|
|
User = get_user_model() |
|
|
|
User = get_user_model() |
|
|
|
|
|
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AuthTokenSerializer(serializers.Serializer): |
|
|
|
class AuthTokenSerializer(serializers.Serializer): |
|
|
|
@ -56,6 +66,12 @@ class AuthTokenSerializer(serializers.Serializer): |
|
|
|
return attrs |
|
|
|
return attrs |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LandingRegistrationSerializer(serializers.Serializer): |
|
|
|
|
|
|
|
phone = PhoneNumberField(required=True) |
|
|
|
|
|
|
|
email = serializers.EmailField(required=True) |
|
|
|
|
|
|
|
first_name = serializers.CharField(required=True) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ObtainToken(ObtainAuthToken): |
|
|
|
class ObtainToken(ObtainAuthToken): |
|
|
|
serializer_class = AuthTokenSerializer |
|
|
|
serializer_class = AuthTokenSerializer |
|
|
|
|
|
|
|
|
|
|
|
@ -73,3 +89,52 @@ class ObtainTempToken(APIView): |
|
|
|
return Response({'temp_token': token.key}) |
|
|
|
return Response({'temp_token': token.key}) |
|
|
|
return Response(status=status.HTTP_400_BAD_REQUEST) |
|
|
|
return Response(status=status.HTTP_400_BAD_REQUEST) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LandingRegistrationView(APIView): |
|
|
|
|
|
|
|
serializer_class = LandingRegistrationSerializer |
|
|
|
|
|
|
|
authentication_classes = (BasicAuthentication,) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def post(self, request, *args, **kwargs): |
|
|
|
|
|
|
|
serializer = self.serializer_class(data=request.data, context={'request': request}) |
|
|
|
|
|
|
|
if not serializer.is_valid(): |
|
|
|
|
|
|
|
return Response({ |
|
|
|
|
|
|
|
'status': 'error', |
|
|
|
|
|
|
|
'errors': serializer.errors, |
|
|
|
|
|
|
|
}, status=400) |
|
|
|
|
|
|
|
email = serializer.validated_data['email'] |
|
|
|
|
|
|
|
phone = serializer.validated_data['phone'] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if User.objects.filter(Q(email=email) | Q(phone=phone)).count(): |
|
|
|
|
|
|
|
return Response({ |
|
|
|
|
|
|
|
'status': 'error', |
|
|
|
|
|
|
|
'errors': ['Возможно вы уже зарегистрированы?'], |
|
|
|
|
|
|
|
'user_exists': True, |
|
|
|
|
|
|
|
}, status=400) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
user = User( |
|
|
|
|
|
|
|
username=email, |
|
|
|
|
|
|
|
email=email, |
|
|
|
|
|
|
|
phone=phone, |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
name = serializer.validated_data['first_name'].split(' ') |
|
|
|
|
|
|
|
user.first_name = name[0] |
|
|
|
|
|
|
|
if len(name) > 1: |
|
|
|
|
|
|
|
user.last_name = name[1] |
|
|
|
|
|
|
|
password = User.objects.make_random_password(8, string.ascii_lowercase + string.digits) |
|
|
|
|
|
|
|
user.set_password(password) |
|
|
|
|
|
|
|
user.save() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
verification_token = verification_email_token.make_token(user) |
|
|
|
|
|
|
|
url = 'https://%s%s?%s' % (settings.MAIN_HOST, |
|
|
|
|
|
|
|
reverse_lazy('lilcity:verification-email', args=[verification_token, user.id]), |
|
|
|
|
|
|
|
urlencode({'next': 'https://lil.school/p/free-lesson'})) |
|
|
|
|
|
|
|
try: |
|
|
|
|
|
|
|
send_email('Регистрация в Lil School', email, "notification/email/landing_registration.html", url=url, |
|
|
|
|
|
|
|
user=user, password=password) |
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
|
|
|
|
logger.error(str(e)) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Response({ |
|
|
|
|
|
|
|
'status': 'ok', |
|
|
|
|
|
|
|
'url': url, |
|
|
|
|
|
|
|
}) |
|
|
|
|