Files
santeh-ray/users/views.py
Azimkin c8e65146ec
All checks were successful
Build and Push Docker Image / build (push) Successful in 41s
Fix home button routes and login redirects
2026-06-16 09:50:32 +02:00

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"