c836f642fa
This avoid the weird double username situation where we want to give the users the choice of their displayed name but at the same time we need them to never change their CAS username. Now CAS matches on email so we do not have problems.
105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
from django.views.generic import TemplateView, RedirectView
|
|
from django.views.generic.edit import UpdateView
|
|
from django.shortcuts import redirect
|
|
from django.urls import reverse
|
|
from django.dispatch import receiver
|
|
from django.contrib.auth import logout as auth_logout
|
|
from django.contrib.auth import user_logged_in, user_logged_out, user_login_failed
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
from django.contrib.auth.views import PasswordChangeView
|
|
from django.contrib import messages
|
|
|
|
from urllib.parse import quote as urlquote
|
|
|
|
from .forms import AccountSettingsForm
|
|
|
|
|
|
class LoginView(TemplateView):
|
|
template_name = "registration/login_switch.html"
|
|
|
|
def dispatch(self, request, *args, **kwargs):
|
|
if request.user.is_authenticated:
|
|
return redirect(self.get_next_url() or "/")
|
|
|
|
return super().dispatch(request, *args, **kwargs)
|
|
|
|
def get_next_url(self):
|
|
if self.request.method == "GET":
|
|
req_dict = self.request.GET
|
|
elif self.request.method == "POST":
|
|
req_dict = self.request.POST
|
|
return req_dict.get("next")
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
|
|
next_url = self.get_next_url()
|
|
if next_url:
|
|
context["pass_url"] = "{}?next={}".format(
|
|
reverse("accounts:password_login"), urlquote(next_url, safe="")
|
|
)
|
|
context["cas_url"] = "{}?next={}".format(
|
|
reverse("accounts:cas_ng_login"), urlquote(next_url, safe="")
|
|
)
|
|
else:
|
|
context["pass_url"] = reverse("accounts:password_login")
|
|
context["cas_url"] = reverse("accounts:cas_ng_login")
|
|
|
|
return context
|
|
|
|
|
|
class LogoutView(RedirectView):
|
|
permanent = False
|
|
|
|
def get_redirect_url(self, *args, **kwargs):
|
|
CAS_BACKEND_NAME = "accounts.backends.CasBackend"
|
|
if self.request.session["_auth_user_backend"] != CAS_BACKEND_NAME:
|
|
auth_logout(self.request)
|
|
if "next" in self.request.GET:
|
|
return self.request.GET["next"]
|
|
return reverse("mainsite:home")
|
|
|
|
if "next" in self.request.GET:
|
|
return "{}?next={}".format(
|
|
reverse("accounts:cas_ng_logout"),
|
|
urlquote(self.request.GET["next"], safe=""),
|
|
)
|
|
return reverse("accounts:cas_ng_logout")
|
|
|
|
|
|
@receiver(user_logged_in)
|
|
def on_login(request, user, **kwargs):
|
|
messages.success(request, "Connexion réussie. Bienvenue, {}.".format(user))
|
|
|
|
|
|
@receiver(user_logged_out)
|
|
def on_logout(request, **kwargs):
|
|
messages.info(request, "Vous avez bien été déconnecté·e.")
|
|
|
|
|
|
@receiver(user_login_failed)
|
|
def on_login_failed(request, **kwargs):
|
|
messages.error(request, "Connexion échouée.")
|
|
|
|
|
|
class PasswordChangeView(PasswordChangeView):
|
|
template_name = "registration/change_password.html"
|
|
|
|
def get_success_url(self):
|
|
messages.info(self.request, "Mot de passe mis à jour")
|
|
return reverse("accounts:account_settings")
|
|
|
|
|
|
class AccountSettingsView(LoginRequiredMixin, UpdateView):
|
|
template_name = "registration/account_settings.html"
|
|
form_class = AccountSettingsForm
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
def get_success_url(self):
|
|
return self.request.get_full_path()
|
|
|
|
def form_valid(self, form):
|
|
messages.success(self.request, "Paramètres du compte mis à jour")
|
|
return super().form_valid(form)
|