Merge branch 'Aufinal/fix_cas_redirect' into 'master'

Fix la redirection lors d'un logout CAS

See merge request klub-dev-ens/gestioCOF!385
This commit is contained in:
Martin Pepin 2019-11-28 16:08:50 +01:00
commit 94d5e0f0ac

View file

@ -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)