diff --git a/club/views.py b/club/views.py index d713a1cc..eda5ac48 100644 --- a/club/views.py +++ b/club/views.py @@ -25,6 +25,7 @@ import csv from django.conf import settings +from django.contrib.auth.mixins import PermissionRequiredMixin from django.core.exceptions import NON_FIELD_ERRORS, PermissionDenied, ValidationError from django.core.paginator import InvalidPage, Paginator from django.db.models import Sum @@ -58,7 +59,6 @@ from core.views import ( DetailFormView, PageEditViewBase, TabedViewMixin, - UserIsRootMixin, ) from counter.models import Selling @@ -512,12 +512,13 @@ class MembershipSetOldView(CanEditMixin, DetailView): ) -class MembershipDeleteView(UserIsRootMixin, DeleteView): +class MembershipDeleteView(PermissionRequiredMixin, DeleteView): """Delete a membership (for admins only).""" model = Membership pk_url_kwarg = "membership_id" template_name = "core/delete_confirm.jinja" + permission_required = "club.delete_membership" def get_success_url(self): return reverse_lazy("core:user_clubs", kwargs={"user_id": self.object.user.id}) diff --git a/core/templates/core/user_clubs.jinja b/core/templates/core/user_clubs.jinja index 324f8389..51b6827f 100644 --- a/core/templates/core/user_clubs.jinja +++ b/core/templates/core/user_clubs.jinja @@ -30,7 +30,7 @@ {% if m.can_be_edited_by(user) %} {% trans %}Mark as old{% endtrans %} {% endif %} - {% if user.is_root %} + {% if user.has_perm("club.delete_membership") %} {% trans %}Delete{% endtrans %} {% endif %} @@ -59,7 +59,7 @@ {{ m.description }} {{ m.start_date }} {{ m.end_date }} - {% if user.is_root %} + {% if user.has_perm("club.delete_membership") %} {% trans %}Delete{% endtrans %} {% endif %} diff --git a/core/views/__init__.py b/core/views/__init__.py index f72addb6..debbc810 100644 --- a/core/views/__init__.py +++ b/core/views/__init__.py @@ -225,18 +225,6 @@ class CanViewMixin(GenericContentPermissionMixinBuilder): permission_function = can_view -class UserIsRootMixin(GenericContentPermissionMixinBuilder): - """Allow only root admins. - - Raises: - PermissionDenied: if the user isn't root - """ - - @staticmethod - def permission_function(obj: Any, user: User): - return user.is_root - - class FormerSubscriberMixin(AccessMixin): """Check if the user was at least an old subscriber. diff --git a/docs/tutorial/perms.md b/docs/tutorial/perms.md index c78292ab..0100f24c 100644 --- a/docs/tutorial/perms.md +++ b/docs/tutorial/perms.md @@ -154,7 +154,7 @@ Voici un exemple d'utilisation en reprenant l'objet Article crée précédemment ```python from django.views.generic import CreateView, ListView -from core.views import CanViewMixin, CanCreateMixin +from core.auth.mixins import CanViewMixin, CanCreateMixin from com.models import WeekmailArticle @@ -172,14 +172,14 @@ class ArticlesCreateView(CanCreateMixin, CreateView): Les mixins suivants sont implémentés : -- [CanCreateMixin][core.views.CanCreateMixin] : l'utilisateur peut-il créer l'objet ? -- [CanEditPropMixin][core.views.CanEditPropMixin] : l'utilisateur peut-il éditer les propriétés de l'objet ? -- [CanEditMixin][core.views.CanEditMixin] : L'utilisateur peut-il éditer l'objet ? -- [CanViewMixin][core.views.CanViewMixin] : L'utilisateur peut-il voir l'objet ? -- [UserIsRootMixin][core.views.UserIsRootMixin] : L'utilisateur a-t-il les droit root ? -- [FormerSubscriberMixin][core.views.FormerSubscriberMixin] : L'utilisateur a-t-il déjà été cotisant ? -- [UserIsLoggedMixin][core.views.UserIsLoggedMixin] : L'utilisateur est-il connecté ? - (à éviter ; préférez `LoginRequiredMixin`, fourni par Django) +- [CanCreateMixin][core.auth.mixins.CanCreateMixin] : l'utilisateur peut-il créer l'objet ? +- [CanEditPropMixin][core.auth.mixins.CanEditPropMixin] : l'utilisateur peut-il éditer les propriétés de l'objet ? +- [CanEditMixin][core.auth.mixins.CanEditMixin] : L'utilisateur peut-il éditer l'objet ? +- [CanViewMixin][core.auth.mixins.CanViewMixin] : L'utilisateur peut-il voir l'objet ? +- [FormerSubscriberMixin][core.auth.mixins.FormerSubscriberMixin] : L'utilisateur a-t-il déjà été cotisant ? +- [PermissionOrAuthorRequiredMixin][core.auth.mixins.PermissionOrAuthorRequiredMixin] : + L'utilisateur a-t-il la permission requise, ou bien est-il l'auteur de l'objet + auquel on veut accéder ? !!!danger "Performance"