diff --git a/bda/tests/test_views.py b/bda/tests/test_views.py index 6bfa3257..7204a320 100644 --- a/bda/tests/test_views.py +++ b/bda/tests/test_views.py @@ -60,24 +60,20 @@ class BdATestHelpers: def check_restricted_access( self, url, validate_user=user_is_cof, redirect_url=None ): - def craft_redirect_url(user): - if redirect_url: - return redirect_url + for (user, client) in self.client_matrix: + resp = client.get(url, follow=True) + if validate_user(user): + self.assertEqual(200, resp.status_code) + elif redirect_url: + self.assertRedirects(resp, redirect_url) elif user is None: # client is not logged in login_url = "/login" if url: login_url += "?{}".format(urlencode({"next": url}, safe="/")) - return login_url + self.assertRedirects(resp, login_url) else: - return "/" - - for (user, client) in self.client_matrix: - resp = client.get(url, follow=True) - if validate_user(user): - self.assertEqual(200, resp.status_code) - else: - self.assertRedirects(resp, craft_redirect_url(user)) + self.assertEqual(403, resp.status_code) class TestBdAViews(BdATestHelpers, TestCase): diff --git a/gestioncof/decorators.py b/gestioncof/decorators.py index ef811730..9ccbac96 100644 --- a/gestioncof/decorators.py +++ b/gestioncof/decorators.py @@ -1,23 +1,55 @@ -from django.contrib.auth.decorators import user_passes_test +from functools import wraps + +from django.contrib.auth.decorators import user_passes_test, login_required +from django.core.exceptions import PermissionDenied +from django.shortcuts import render -def is_cof(user): - try: - profile = user.profile - return profile.is_cof - except Exception: - return False +def cof_required(view_func): + """Décorateur qui vérifie que l'utilisateur est connecté et membre du COF. + + - Si l'utilisteur n'est pas connecté, il est redirigé vers la page de + connexion + - Si l'utilisateur est connecté mais pas membre du COF, il obtient une + page d'erreur lui demandant de s'inscrire au COF + """ + + def is_cof(user): + try: + return user.profile.is_cof + except AttributeError: + return False + + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + if is_cof(request.user): + return view_func(request, *args, **kwargs) + + return render(request, "cof-denied.html", status=403) + + return login_required(_wrapped_view) -cof_required = user_passes_test(is_cof) +def buro_required(view_func): + """Décorateur qui vérifie que l'utilisateur est connecté et membre du burô. + - Si l'utilisateur n'est pas connecté, il est redirigé vers la page de + connexion + - Si l'utilisateur est connecté mais pas membre du burô, il obtient une + page d'erreur 403 Forbidden + """ -def is_buro(user): - try: - profile = user.profile - return profile.is_buro - except Exception: - return False + def is_buro(user): + try: + return user.profile.is_buro + except AttributeError: + return False + @wraps(view_func) + def _wrapped_view(request, *args, **kwargs): + if is_buro(request.user): + return view_func(request, *args, **kwargs) -buro_required = user_passes_test(is_buro) + return render(request, "buro-denied.html", status=403) + + return login_required(_wrapped_view) diff --git a/gestioncof/templates/buro-denied.html b/gestioncof/templates/buro-denied.html new file mode 100644 index 00000000..1e477751 --- /dev/null +++ b/gestioncof/templates/buro-denied.html @@ -0,0 +1,5 @@ +{% extends "base_title.html" %} + +{% block realcontent %} +

Section réservée au Burô.

+{% endblock %}