You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

190 lines
7.0 KiB

from uuid import uuid4
from urllib.parse import urlsplit
from facepy import GraphAPI
from facepy.exceptions import FacepyError
from django.contrib.auth import get_user_model, logout, login, views
from django.contrib.auth.forms import AuthenticationForm
from django.core.files.base import ContentFile
from django.http import JsonResponse
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import FormView, View, TemplateView
from django.views.generic.edit import BaseFormView
from django.shortcuts import redirect
from apps.notification.utils import send_email
from apps.config.models import Config
from .forms import LearnerRegistrationForm
from .tokens import verification_email_token
User = get_user_model()
class LearnerRegistrationView(FormView):
form_class = LearnerRegistrationForm
template_name = "auth/registration-learner.html"
def form_valid(self, form):
first_name = form.cleaned_data['first_name']
last_name = form.cleaned_data['last_name']
email = form.cleaned_data['email']
password = form.cleaned_data['password']
user, created = User.objects.get_or_create(
username=email, email=email,
first_name=first_name, last_name=last_name
)
if not created:
return JsonResponse({
"success": False,
'errors': {'__all__': [{'message': 'Возможно вы уже зарегистрированы?'}]}
}, status=400)
user.set_password(password)
user.save()
login(self.request, user)
# fixme: change email text
# fixme: async send email
config = Config.load()
refferer = urlsplit(self.request.META.get('HTTP_REFERER'))
refferer = refferer[0] + '://' + refferer[1]
token = verification_email_token.make_token(user)
url = refferer + str(reverse_lazy('lilcity:verification-email', args=[token]))
send_email('Verification Email', email, "notification/email/verification_email.html", url=url, config=config)
return JsonResponse({"success": True}, status=201)
def form_invalid(self, form):
return JsonResponse(form.errors.get_json_data(escape_html=True), status=400)
class LogoutView(View):
def get(self, request, *args, **kwargs):
logout(request)
return redirect('/')
class LoginView(FormView):
form_class = AuthenticationForm
template_name = "auth/login.html"
def form_valid(self, form):
login(self.request, form.get_user())
return JsonResponse({"success": True})
def form_invalid(self, form):
return JsonResponse({"success": False, "errors": form.errors.get_json_data(escape_html=True)}, status=400)
class VerificationEmailView(View):
def get(self, request, *args, **kwargs):
is_valid_token = verification_email_token.check_token(
request.user, kwargs.get('token'))
if is_valid_token:
request.user.is_email_proved = True
request.user.save()
login(request, request.user)
return redirect(reverse_lazy('lilcity:success-verification-email'))
else:
return JsonResponse({"success": False}, status=400)
class SuccessVerificationEmailView(TemplateView):
template_name = 'auth/success-verification.html'
class PasswordResetView(views.PasswordContextMixin, BaseFormView):
email_template_name = 'auth/password_reset.txt'
subject_template_name = "auth/password_reset_subject.txt"
form_class = views.PasswordResetForm
extra_email_context = None
from_email = None
html_email_template_name = "auth/password_reset.html"
title = 'Password reset'
token_generator = views.default_token_generator
def form_valid(self, form):
refferer = urlsplit(self.request.META.get('HTTP_REFERER'))
refferer = refferer[0] + '://' + refferer[1]
config = Config.load()
extra_email_context = {'config': config}
if self.extra_email_context and isinstance(self.extra_email_context, dict):
extra_email_context.update(self.extra_email_context)
opts = {
'domain_override': refferer,
'use_https': self.request.is_secure(),
'token_generator': self.token_generator,
'from_email': self.from_email,
'email_template_name': self.email_template_name,
'subject_template_name': self.subject_template_name,
'request': self.request,
'html_email_template_name': self.html_email_template_name,
'extra_email_context': extra_email_context,
}
form.save(**opts)
return JsonResponse({"success": True})
class PasswordResetConfirmView(views.PasswordResetConfirmView):
template_name = "auth/password_reset_confirm.html"
success_url = reverse_lazy('lilcity:password_reset_complete')
class PasswordResetComplete(views.PasswordResetCompleteView):
template_name = 'auth/password_reset_complete.html'
@method_decorator(csrf_exempt, name="dispatch")
class FacebookLoginOrRegistration(View):
def post(self, requests, *args, **kwargs):
access_token = requests.POST.get('access_token')
graph = GraphAPI(access_token)
try:
data = graph.get('/me?fields=email, first_name, last_name')
photo_data = graph.get('/me/picture?height=120')
except FacepyError:
return JsonResponse({"success": False})
fb_id = data.get('id')
try:
user = User.objects.get(fb_id=fb_id)
except User.DoesNotExist:
email = requests.POST.get('email') or data.get('email')
if not email:
return JsonResponse({"success": False,
"errors": {"email": 'is field required'}
})
else:
try:
user = User.objects.get(email=email)
except User.DoesNotExist:
first_name = data.get('first_name', '')
last_name = data.get('last_name', '')
user = User.objects.create_user(username=email, email=email, first_name=first_name, last_name=last_name, password=uuid4().hex)
user.is_email_proved = True
user.fb_id = fb_id
if photo_data:
photo = ContentFile(photo_data)
fname = str(fb_id) + '.jpg'
user.photo.save(fname, photo, save=True)
user.save()
login(requests, user=user)
return JsonResponse({"success": True})
else:
if not user.photo and photo_data:
photo = ContentFile(photo_data)
fname = str(fb_id) + '.jpg'
user.photo.save(fname, photo, save=True)
login(requests, user=user)
return JsonResponse({"success": True})