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 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. @require_http_methods(["GET", "POST"]) def login(request): if request.user.is_authenticated: return redirect("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("users:profile") return render(request, "users/login.html", context={"form": form}) @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"