mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-11 10:12:22 +01:00
120 lines
4.3 KiB
Python
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"
|