diff --git a/gestioncof/views.py b/gestioncof/views.py index 6c7bf337..87ee9d2e 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(): + # je ne vois pas bien pourquoi il faut un 2e "pop"... + qd["service"] = qd.pop("url").pop() + + # La méthode _replace est documentée ! + new_url = parse_result._replace(query=urlencode(qd)) + print(qd) + print(urlunparse(new_url)) + return redirect(urlunparse(new_url)) + + @login_required def logout(request, next_page=None): if next_page is None: @@ -107,7 +132,7 @@ def logout(request, next_page=None): if profile and profile.login_clipper: msg = _("Déconnexion de GestioCOF et CAS réussie. À bientôt {}.") - logout_view = CasLogoutView.as_view() + logout_view = CustomCasLogoutView.as_view() else: msg = _("Déconnexion de GestioCOF réussie. À bientôt {}.") logout_view = DjangoLogoutView.as_view(