Files
santeh-ray/users/views.py
Azimkin 80164b833b
All checks were successful
Build and Push Docker Image / build (push) Successful in 46s
feat: implement user authentication features (registration, activation, and password reset)
- Added email templates for activation and password reset (`activation_email.html`, `password_reset_email.html`, etc.)
- Created forms for registration (`RegisterForm`) and login (`LoginForm`) with custom validation
- Developed new pages for account activation (`activation_success.html`, `activation_invalid.html`), password reset workflow, and profile
- Configured email backend and environment file handling in settings
- Updated header template to conditionally display profile or login links based on authentication status
- Enhanced CSS styles for authentication-related pages and forms
2026-04-15 18:27:23 +02:00

99 lines
3.3 KiB
Python

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, 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
def profile(request):
return render(request, "users/profile.html", context={})
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"