All checks were successful
Build and Push Docker Image / build (push) Successful in 41s
120 lines
4.1 KiB
Python
120 lines
4.1 KiB
Python
from django.contrib import messages
|
|
from django.contrib.auth import get_user_model, login as auth_login, logout as auth_logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.tokens import default_token_generator
|
|
from django.contrib.auth.views import (
|
|
PasswordResetCompleteView,
|
|
PasswordResetConfirmView,
|
|
PasswordResetDoneView,
|
|
PasswordResetView,
|
|
)
|
|
from django.shortcuts import redirect, render
|
|
from django.urls import reverse_lazy
|
|
from django.utils.encoding import force_str
|
|
from django.utils.http import url_has_allowed_host_and_scheme, urlsafe_base64_decode
|
|
from django.views.decorators.http import require_http_methods
|
|
|
|
from users.forms import LoginForm, ProfileForm, RegisterForm, SantehRayPasswordResetForm, SantehRaySetPasswordForm
|
|
from users.services import send_activation_email
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
# Create your views here.
|
|
def _get_safe_next_url(request):
|
|
next_url = request.POST.get("next") or request.GET.get("next")
|
|
if next_url and url_has_allowed_host_and_scheme(
|
|
url=next_url,
|
|
allowed_hosts={request.get_host()},
|
|
require_https=request.is_secure(),
|
|
):
|
|
return next_url
|
|
|
|
return None
|
|
|
|
|
|
@require_http_methods(["GET", "POST"])
|
|
def login(request):
|
|
next_url = _get_safe_next_url(request)
|
|
if request.user.is_authenticated:
|
|
return redirect(next_url or "users:profile")
|
|
|
|
form = LoginForm(request=request, data=request.POST or None)
|
|
if request.method == "POST" and form.is_valid():
|
|
auth_login(request, form.get_user())
|
|
return redirect(next_url or "users:profile")
|
|
|
|
return render(request, "users/login.html", context={"form": form, "next_url": next_url})
|
|
|
|
|
|
@require_http_methods(["GET", "POST"])
|
|
def register(request):
|
|
if request.user.is_authenticated:
|
|
return redirect("users:profile")
|
|
|
|
form = RegisterForm(request.POST or None)
|
|
if request.method == "POST" and form.is_valid():
|
|
user = form.save()
|
|
send_activation_email(request, user)
|
|
return render(request, "users/register_done.html", context={"email": user.email})
|
|
|
|
return render(request, "users/register.html", context={"form": form})
|
|
|
|
|
|
@require_http_methods(["POST"])
|
|
def logout(request):
|
|
auth_logout(request)
|
|
return redirect("users:login")
|
|
|
|
|
|
def activate(request, uidb64, token):
|
|
try:
|
|
uid = force_str(urlsafe_base64_decode(uidb64))
|
|
user = User.objects.get(pk=uid)
|
|
except (TypeError, ValueError, OverflowError, User.DoesNotExist):
|
|
user = None
|
|
|
|
if user and default_token_generator.check_token(user, token):
|
|
user.is_active = True
|
|
user.save(update_fields=["is_active"])
|
|
auth_login(request, user)
|
|
return render(request, "users/activation_success.html", context={"user": user})
|
|
|
|
return render(request, "users/activation_invalid.html", status=400)
|
|
|
|
|
|
@login_required
|
|
@require_http_methods(["GET", "POST"])
|
|
def profile(request):
|
|
form = ProfileForm(request.POST or None, instance=request.user)
|
|
if request.method == "POST" and form.is_valid():
|
|
form.save()
|
|
messages.success(request, "Данные профиля обновлены.")
|
|
return redirect("users:profile")
|
|
|
|
return render(request, "users/profile.html", context={"form": form})
|
|
|
|
|
|
class SantehRayPasswordResetView(PasswordResetView):
|
|
form_class = SantehRayPasswordResetForm
|
|
template_name = "users/password_reset.html"
|
|
email_template_name = "users/emails/password_reset_email.txt"
|
|
html_email_template_name = "users/emails/password_reset_email.html"
|
|
subject_template_name = "users/emails/password_reset_subject.txt"
|
|
success_url = reverse_lazy("users:password_reset_done")
|
|
|
|
|
|
class SantehRayPasswordResetDoneView(PasswordResetDoneView):
|
|
template_name = "users/password_reset_done.html"
|
|
|
|
|
|
class SantehRayPasswordResetConfirmView(PasswordResetConfirmView):
|
|
template_name = "users/password_reset_confirm.html"
|
|
success_url = reverse_lazy("users:password_reset_complete")
|
|
form_class = SantehRaySetPasswordForm
|
|
|
|
|
|
class SantehRayPasswordResetCompleteView(PasswordResetCompleteView):
|
|
template_name = "users/password_reset_complete.html"
|