Files
MarietjeDjango/marietje/marietje/views.py

120 lines
4.3 KiB
Python

import random
import string
from django.conf import settings
from django.contrib import messages
from django.contrib.auth import get_user_model
from django.core.mail import send_mail
from django.shortcuts import render, redirect, get_object_or_404
from django.urls import reverse
from django.contrib.auth.views import LoginView
from django.views.generic import TemplateView
from .forms import ResetPasswordForm, AuthenticationForm
User = get_user_model()
class RegisterView(TemplateView):
template_name = "marietje/register.html"
def get(self, request, **kwargs):
if request.user.is_authenticated:
return redirect("index")
else:
return render(request, self.template_name)
class ActivateView(TemplateView):
def get(self, request, **kwargs):
user_id = kwargs.get("user_id")
token = kwargs.get("token")
user = get_object_or_404(User, pk=user_id)
if token == user.activation_token:
user.activation_token = None
user.save()
messages.add_message(request, messages.SUCCESS, "Successfully activated.", extra_tags="success")
else:
messages.add_message(
request,
messages.ERROR,
"Activation failed. If the problem persists, please contact " + settings.CONTACT_EMAIL + ".",
extra_tags="danger",
)
return redirect("login")
class ForgotPasswordView(TemplateView):
template_name = "marietje/forgotpassword.html"
def get(self, request, **kwargs):
return render(request, self.template_name)
def post(self, request, **kwargs):
user = User.objects.filter(username=request.POST.get("email")).first()
if user is None or user.activation_token:
messages.add_message(request, messages.ERROR, "No (active) user found.", extra_tags="danger")
return render(request, self.template_name)
user.reset_token = "".join(random.choice(string.ascii_letters + string.digits) for _ in range(32))
user.save()
reset_link = request.build_absolute_uri(reverse("resetpassword", args=[user.id, user.reset_token]))
send_mail(
"Marietje - Reset password",
"You have requested to reset your password. You can reset your password by following this link: "
+ reset_link
+ "\nIf you did not request to reset your password, you can ignore this email.",
settings.MAIL_FROM,
[user.email],
fail_silently=True,
)
messages.add_message(
request,
messages.INFO,
"Please check your email, " + user.email + ", for resetting your password.",
extra_tags="info",
)
return redirect("login")
class ResetPasswordView(TemplateView):
template_name = "marietje/resetpassword.html"
def get(self, request, **kwargs):
user_id = kwargs.get("user_id")
token = kwargs.get("token")
user = get_object_or_404(User, pk=user_id)
if not user.reset_token or token != user.reset_token:
messages.add_message(request, messages.ERROR, "Invalid password reset link.", extra_tags="danger")
return redirect("login")
return render(request, self.template_name, {"user_id": user.id, "reset_token": token})
def post(self, request, **kwargs):
user_id = kwargs.get("user_id")
token = kwargs.get("token")
user = get_object_or_404(User, pk=user_id)
if not user.reset_token or token != user.reset_token:
messages.add_message(request, messages.ERROR, "Invalid password reset link.", extra_tags="danger")
return redirect("login")
form = ResetPasswordForm(request.POST)
if not form.is_valid():
return render(request, self.template_name, {"user_id": user.id, "reset_token": token, "form": form})
user.reset_token = None
user.set_password(form.cleaned_data["password1"])
user.save()
messages.add_message(request, messages.SUCCESS, "Your password has been reset.", extra_tags="success")
return redirect("login")
class CustomLoginView(LoginView):
template_name = "marietje/login.html"
authentication_form = AuthenticationForm
class PrivacyView(TemplateView):
template_name = "marietje/privacy.html"