Merge branch 'feature/landing-registration' into 'master'

Feature/landing registration

See merge request lilschool/site!411
remotes/origin/hotfix/landing-validation
Danil 6 years ago
commit 9413105cd2
  1. 67
      api/v1/auth.py
  2. 3
      api/v1/urls.py
  3. 2
      api/v1/views.py
  4. 3
      apps/auth/views.py
  5. 19
      apps/notification/templates/notification/email/landing_registration.html

@ -1,21 +1,31 @@
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.db.models import Q
from django.utils.translation import ugettext_lazy as _
from django.shortcuts import get_object_or_404
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.authtoken.views import ObtainAuthToken
from rest_framework.compat import authenticate
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token
from rest_framework import status
from rest_framework.authentication import BasicAuthentication
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()
logger = logging.getLogger(__name__)
class AuthTokenSerializer(serializers.Serializer):
@ -56,6 +66,12 @@ class AuthTokenSerializer(serializers.Serializer):
return attrs
class LandingRegistrationSerializer(serializers.Serializer):
phone = PhoneNumberField(required=True)
email = serializers.EmailField(required=True)
first_name = serializers.CharField(required=True)
class ObtainToken(ObtainAuthToken):
serializer_class = AuthTokenSerializer
@ -73,3 +89,52 @@ class ObtainTempToken(APIView):
return Response({'temp_token': token.key})
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,
})

@ -6,7 +6,7 @@ from rest_framework.routers import DefaultRouter
from drf_yasg.views import get_schema_view
from drf_yasg import openapi
from .auth import ObtainToken, ObtainTempToken
from .auth import ObtainToken, ObtainTempToken, LandingRegistrationView
from .views import (
AuthorBalanceViewSet, AuthorRequestViewSet,
BannerViewSet, ConfigViewSet, CategoryViewSet,
@ -71,6 +71,7 @@ urlpatterns = [
path('author-balance-users/', AuthorBalanceUsersViewSet.as_view(), name='author-balance-users'),
path('api-token-auth/', ObtainToken.as_view(), name='api-token-auth'),
path('temp-auth-token/', ObtainTempToken.as_view(), name='temp-auth-token'),
path('landing-registration/', LandingRegistrationView.as_view(), name='landing-registration'),
path('configs/', ConfigViewSet.as_view(), name='configs'),
path('swagger(<str:format>.json|.yaml)', schema_view.without_ui(cache_timeout=None), name='schema-json'),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=None), name='schema-swagger-ui'),

@ -774,11 +774,13 @@ class NotifiedAboutBonuses(views.APIView):
b.save()
return Response({'status': 'ok'})
class PackageViewSet(ExtendedModelViewSet):
queryset = Package.objects.all()
serializer_class = PackageSerializer
permission_classes = (IsAdmin,)
class TagViewSet(ExtendedModelViewSet):
queryset = Tag.objects.all()
serializer_class = TagSerializer

@ -122,13 +122,14 @@ class VerificationEmailView(View):
user = User.objects.get(pk=kwargs.get('uid'))
is_valid_token = verification_email_token.check_token(
user, kwargs.get('token'))
next = request.GET.get('next')
if is_valid_token:
user.is_email_proved = True
user.save()
login(request, user)
self.request.session['referrer'] = None
return redirect(reverse_lazy('lilcity:success-verification-email'))
return redirect(next or reverse_lazy('lilcity:success-verification-email'))
else:
return JsonResponse({"success": False}, status=400)

@ -0,0 +1,19 @@
<p>Здравствуйте, {{ user.get_full_name }}! Вы только что записались на вводный урок в онлайн-школе Lil School!</p>
<p>Перейдите по ссылке, чтобы пройти вводный урок</p>
<p><a href="https://lil.school/p/free-lesson"
style="text-decoration: none; position: relative; padding: 13px 24px 12px; background-image: linear-gradient(-225deg, #D1FF7F 0%, #56FFFD 100%);
border-radius: 3px; font-size: 12px; color: #191919; text-transform: uppercase; letter-spacing: 2px; text-align: center; transition: all .2s; z-index: 2;"
>Пройти вводный урок</a>
</p>
<p>Доступ в личный кабинет:<br>
логин<br>
{{ user.email }}<br>
временный пароль<br>
{{ password }}
</p>
<p>Теперь у вас есть личный кабинет. Там хранятся учебные материалы, видео прошлых уроков, актуальное расписание и море вдохновения.</p>
<p>Желаем интересных уроков и свободы в творчестве!</p>
Loading…
Cancel
Save