diff --git a/gestioncof/views.py b/gestioncof/views.py index 6c7bf337..ced35cfc 100644 --- a/gestioncof/views.py +++ b/gestioncof/views.py @@ -2,6 +2,7 @@ import csv import uuid from datetime import timedelta from smtplib import SMTPRecipientsRefused +from urllib.parse import parse_qs, urlencode, urlparse, urlunparse from custommail.shortcuts import send_custom_mail from django.contrib import messages @@ -98,6 +99,30 @@ class LoginExtView(DjangoLoginView): return super().form_invalid(form) +class CustomCasLogoutView(CasLogoutView): + """ + Actuellement, le CAS de l'ENS est pété et n'a pas le bon paramètre GET + pour rediriger après déconnexion. On change la redirection à la main + dans la vue de logout. + """ + + def get(self, request): + # CasLogoutView.get() retourne un HttpResponseRedirect + response = super().get(request) + parse_result = urlparse(response.url) + qd = parse_qs(parse_result.query) + + if "url" in qd.keys(): + # Le 2e pop est nécessaire car CAS n'aime pas + # les paramètres sous forme de liste + qd["service"] = qd.pop("url").pop() + + # La méthode _replace est documentée ! + new_url = parse_result._replace(query=urlencode(qd)) + + return redirect(urlunparse(new_url)) + + @login_required def logout(request, next_page=None): if next_page is None: @@ -106,15 +131,20 @@ def logout(request, next_page=None): profile = getattr(request.user, "profile", None) if profile and profile.login_clipper: - msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") - logout_view = CasLogoutView.as_view() + if next_page is None: + # On ne voit pas les messages quand on se déconnecte de CAS + msg = None + else: + msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") + logout_view = CustomCasLogoutView.as_view() else: msg = _("Déconnexion de GestioCOF réussie. À bientôt {}.") logout_view = DjangoLogoutView.as_view( next_page=next_page, template_name="logout.html" ) - messages.success(request, msg.format(request.user.get_short_name())) + if msg is not None: + messages.success(request, msg.format(request.user.get_short_name())) return logout_view(request)