Display superusers in rights list

This commit is contained in:
Yohann D'ANELLO 2020-08-31 21:11:00 +02:00
parent ca6f7cac9a
commit b8c1cfba40
5 changed files with 166 additions and 110 deletions

View File

@ -2,8 +2,12 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
import django_tables2 as tables import django_tables2 as tables
from django.contrib.auth.models import User
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils.html import format_html from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from django_tables2 import A
from member.models import Membership from member.models import Membership
from note_kfet.middlewares import get_current_authenticated_user from note_kfet.middlewares import get_current_authenticated_user
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
@ -48,3 +52,18 @@ class RightsTable(tables.Table):
template_name = 'django_tables2/bootstrap4.html' template_name = 'django_tables2/bootstrap4.html'
fields = ('user.last_name', 'user.first_name', 'user', 'club', 'roles', ) fields = ('user.last_name', 'user.first_name', 'user', 'club', 'roles', )
model = Membership model = Membership
class SuperuserTable(tables.Table):
username = tables.LinkColumn(
"member:user_detail",
args=[A("pk")],
)
class Meta:
model = User
fields = ('last_name', 'first_name', 'username', )
attrs = {
'class': 'table table-condensed table-striped table-hover',
'style': 'table-layout: fixed;'
}

View File

@ -1,92 +1,117 @@
{% extends "base.html" %} {% extends "base.html" %}
{% comment %} {% comment %}
SPDX-License-Identifier: GPL-3.0-or-later SPDX-License-Identifier: GPL-3.0-or-later
{% endcomment %} {% endcomment %}
{% load i18n %} {% load i18n %}
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block contenttitle %}{% endblock %} {% block contenttitle %}{% endblock %}
{% block content %} {% block content %}
{% if user.is_authenticated %}
<div class="card bg-light mb-3">
<h3 class="card-header text-center">
{% trans "Users that have surnormal rights" %}
</h3>
{% render_table special_memberships_table %}
</div>
{% endif %}
<div class="card bg-light">
<h3 class="card-header text-center">
{% trans "Roles description" %}
</h3>
<div class="card-body">
{% if user.is_authenticated %} {% if user.is_authenticated %}
<div class="form-check"> <div class="card bg-light mb-3">
<label for="owned_only" class="form-check-label"> <h3 class="card-header text-center">
<input id="owned_only" name="owned_only" type="checkbox" class="checkboxinput form-check-input"> {% trans "Users that have surnormal rights" %}
{% trans "Filter with roles that I have in at least one club" %} </h3>
</label> <div class="card-body">
</div> <div class="card">
{% endif %} <div class="card-head">
</div> <h4 class="card-header text-center">
<div class="accordion" id="accordionRoles"> <a href="#" data-toggle="collapse" data-target="#card-superusers">{% trans "Superusers" %}</a>
{% regroup active_memberships by roles as memberships_per_role %} </h4>
{% for role in roles %} </div>
<div class="card {% if not role.clubs %}no-club{% endif %}"> <div class="card-body collapse show" id="card-superusers">
<div class="card-header py-1" id="{{ role|slugify }} "> {% render_table superusers %}
<a href="#" class="text-decoration-none" data-toggle="collapse" data-target="#collapse{{ role|slugify }}" </div>
aria-expanded="true" aria-controls="collapse{{ role|slugify }}"> </div>
{{ role }} <hr>
{% if role.weirole %}(<em>Pour le WEI</em>){% endif %} <div class="card">
{% if role.for_club %}(<em>Pour le club {{ role.for_club }} uniquement</em>){% endif %} <div class="card-head">
{% if role.clubs %} <h4 class="card-header text-center">
<small><span class="badge badge-success">{% trans "Owned" %} : {{ role.clubs|join:", " }}</span></small> <a href="#" data-toggle="collapse" data-target="#card-clubs">{% trans "Club managers" %}</a>
{% endif %} </h4>
</a> </div>
</div> <div class="card-body collapse show" id="card-clubs">
{% render_table special_memberships_table %}
<div id="collapse{{ role|slugify }}" class="collapse" aria-labelledby="{{ role|slugify }}" </div>
data-parent="#accordionRoles"> </div>
<div class="card-body"> </div>
{% if role.clubs %} </div>
<div class="alert alert-success"> {% endif %}
{% trans "Own this role in the clubs" %} {{ role.clubs|join:", " }}
</div> <div class="card bg-light">
{% endif %} <h3 class="card-header text-center">
<ul> {% trans "Roles description" %}
{% for permission in role.permissions.all %} </h3>
<li data-toggle="tooltip" <div class="card-body">
title="{% trans "Mask:" %} {{ permission.mask }}, {% trans "Query:" %} {{ permission.query }}"> {% if user.is_authenticated %}
<b>{{ permission }}</b> ({{ permission.get_type_display }} <div class="form-check">
{{ permission.model }}{% if permission.permanent %}, <label for="owned_only" class="form-check-label">
{% trans "permanent" %}{% endif %})</li> <input id="owned_only" name="owned_only" type="checkbox" class="checkboxinput form-check-input">
{% empty %} {% trans "Filter with roles that I have in at least one club" %}
<em>{% trans "No associated permission" %}</em> </label>
{% endfor %} </div>
</ul> {% endif %}
</div>
<div class="accordion" id="accordionRoles">
{% regroup active_memberships by roles as memberships_per_role %}
{% for role in roles %}
<div class="card {% if not role.clubs %}no-club{% endif %}">
<div class="card-header py-1" id="{{ role|slugify }} ">
<a href="#" class="text-decoration-none" data-toggle="collapse"
data-target="#collapse{{ role|slugify }}"
aria-expanded="true" aria-controls="collapse{{ role|slugify }}">
{{ role }}
{% if role.weirole %}(<em>Pour le WEI</em>){% endif %}
{% if role.for_club %}(<em>Pour le club {{ role.for_club }} uniquement</em>){% endif %}
{% if role.clubs %}
<small><span class="badge badge-success">{% trans "Owned" %} :
{{ role.clubs|join:", " }}</span></small>
{% endif %}
</a>
</div>
<div id="collapse{{ role|slugify }}" class="collapse" aria-labelledby="{{ role|slugify }}"
data-parent="#accordionRoles">
<div class="card-body">
{% if role.clubs %}
<div class="alert alert-success">
{% trans "Own this role in the clubs" %} {{ role.clubs|join:", " }}
</div>
{% endif %}
<ul>
{% for permission in role.permissions.all %}
<li data-toggle="tooltip"
title="{% trans "Mask:" %} {{ permission.mask }}, {% trans "Query:" %} {{ permission.query }}">
<b>{{ permission }}</b> ({{ permission.get_type_display }}
{{ permission.model }}{% if permission.permanent %},
{% trans "permanent" %}{% endif %})
</li>
{% empty %}
<em>{% trans "No associated permission" %}</em>
{% endfor %}
</ul>
</div>
</div>
</div>
{% endfor %}
</div> </div>
</div>
</div> </div>
{% endfor %}
</div>
</div>
{% endblock %} {% endblock %}
{% block extrajavascript %} {% block extrajavascript %}
<script> <script>
$(document).ready(function () { $(document).ready(function () {
let checkbox = $("#owned_only"); let checkbox = $("#owned_only");
function update() { function update() {
if (checkbox.is(":checked")) if (checkbox.is(":checked"))
$(".no-club").addClass('d-none'); $(".no-club").addClass('d-none');
else else
$(".no-club").removeClass('d-none'); $(".no-club").removeClass('d-none');
} }
checkbox.change(update); checkbox.change(update);
update(); update();
}); });
</script> </script>
{% endblock %} {% endblock %}

View File

@ -4,6 +4,7 @@
from datetime import date from datetime import date
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import Q from django.db.models import Q
from django.forms import HiddenInput from django.forms import HiddenInput
@ -13,7 +14,7 @@ from member.models import Membership
from .backends import PermissionBackend from .backends import PermissionBackend
from .models import Role from .models import Role
from .tables import RightsTable from .tables import RightsTable, SuperuserTable
class ProtectQuerysetMixin: class ProtectQuerysetMixin:
@ -114,12 +115,13 @@ class RightsView(TemplateView):
special_memberships = Membership.objects.filter( special_memberships = Membership.objects.filter(
date_start__lte=date.today(), date_start__lte=date.today(),
date_end__gte=date.today(), date_end__gte=date.today(),
).filter(roles__in=Role.objects.filter(~(Q(name="Adhérent BDE") ).filter(roles__in=Role.objects.filter((~(Q(name="Adhérent BDE")
| Q(name="Adhérent Kfet") | Q(name="Adhérent Kfet")
| Q(name="Membre de club") | Q(name="Membre de club")
| Q(name="Adhérent WEI") | Q(name="Bureau de club"))
| Q(name="1A")))).order_by("club", "user__last_name")\ & Q(weirole__isnull=True)))).order_by("club", "user__last_name")\
.distinct().all() .distinct().all()
context["special_memberships_table"] = RightsTable(special_memberships) context["special_memberships_table"] = RightsTable(special_memberships, prefix="clubs-")
context["superusers"] = SuperuserTable(User.objects.filter(is_superuser=True).all(), prefix="superusers-")
return context return context

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-31 20:32+0200\n" "POT-Creation-Date: 2020-08-31 21:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -885,6 +885,7 @@ msgid "Add"
msgstr "" msgstr ""
#: apps/member/templates/member/club_detail.html:13 #: apps/member/templates/member/club_detail.html:13
#: apps/permission/templates/permission/all_rights.html:30
msgid "Club managers" msgid "Club managers"
msgstr "" msgstr ""
@ -1566,7 +1567,7 @@ msgid ""
msgstr "" msgstr ""
#: apps/permission/models.py:183 #: apps/permission/models.py:183
#: apps/permission/templates/permission/all_rights.html:63 #: apps/permission/templates/permission/all_rights.html:87
msgid "permanent" msgid "permanent"
msgstr "" msgstr ""
@ -1597,7 +1598,7 @@ msgid ""
"of model {app_label}.{model_name}." "of model {app_label}.{model_name}."
msgstr "" msgstr ""
#: apps/permission/signals.py:73 apps/permission/views.py:88 #: apps/permission/signals.py:73 apps/permission/views.py:89
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to add an instance of model {app_label}." "You don't have the permission to add an instance of model {app_label}."
@ -1615,53 +1616,57 @@ msgstr ""
msgid "Users that have surnormal rights" msgid "Users that have surnormal rights"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:21 #: apps/permission/templates/permission/all_rights.html:19
msgid "Superusers"
msgstr ""
#: apps/permission/templates/permission/all_rights.html:43
msgid "Roles description" msgid "Roles description"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:28 #: apps/permission/templates/permission/all_rights.html:50
msgid "Filter with roles that I have in at least one club" msgid "Filter with roles that I have in at least one club"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:44 #: apps/permission/templates/permission/all_rights.html:67
msgid "Owned" msgid "Owned"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:54 #: apps/permission/templates/permission/all_rights.html:78
msgid "Own this role in the clubs" msgid "Own this role in the clubs"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:60 #: apps/permission/templates/permission/all_rights.html:84
msgid "Mask:" msgid "Mask:"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:60 #: apps/permission/templates/permission/all_rights.html:84
msgid "Query:" msgid "Query:"
msgstr "" msgstr ""
#: apps/permission/templates/permission/all_rights.html:65 #: apps/permission/templates/permission/all_rights.html:90
msgid "No associated permission" msgid "No associated permission"
msgstr "" msgstr ""
#: apps/permission/views.py:55 #: apps/permission/views.py:56
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to update this instance of the model " "You don't have the permission to update this instance of the model "
"\"{model}\" with these parameters. Please correct your data and retry." "\"{model}\" with these parameters. Please correct your data and retry."
msgstr "" msgstr ""
#: apps/permission/views.py:59 #: apps/permission/views.py:60
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to create an instance of the model \"{model}\" " "You don't have the permission to create an instance of the model \"{model}\" "
"with these parameters. Please correct your data and retry." "with these parameters. Please correct your data and retry."
msgstr "" msgstr ""
#: apps/permission/views.py:95 note_kfet/templates/base.html:106 #: apps/permission/views.py:96 note_kfet/templates/base.html:106
msgid "Rights" msgid "Rights"
msgstr "" msgstr ""
#: apps/permission/views.py:100 #: apps/permission/views.py:101
msgid "All rights" msgid "All rights"
msgstr "" msgstr ""

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-08-31 20:32+0200\n" "POT-Creation-Date: 2020-08-31 21:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -910,6 +910,7 @@ msgid "Add"
msgstr "Ajouter" msgstr "Ajouter"
#: apps/member/templates/member/club_detail.html:13 #: apps/member/templates/member/club_detail.html:13
#: apps/permission/templates/permission/all_rights.html:30
msgid "Club managers" msgid "Club managers"
msgstr "Bureau du club" msgstr "Bureau du club"
@ -1611,7 +1612,7 @@ msgstr ""
"l'utilisateur est expirée." "l'utilisateur est expirée."
#: apps/permission/models.py:183 #: apps/permission/models.py:183
#: apps/permission/templates/permission/all_rights.html:63 #: apps/permission/templates/permission/all_rights.html:87
msgid "permanent" msgid "permanent"
msgstr "permanent" msgstr "permanent"
@ -1646,7 +1647,7 @@ msgstr ""
"Vous n'avez pas la permission de modifier le champ {field} sur l'instance du " "Vous n'avez pas la permission de modifier le champ {field} sur l'instance du "
"modèle {app_label}.{model_name}." "modèle {app_label}.{model_name}."
#: apps/permission/signals.py:73 apps/permission/views.py:88 #: apps/permission/signals.py:73 apps/permission/views.py:89
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to add an instance of model {app_label}." "You don't have the permission to add an instance of model {app_label}."
@ -1668,35 +1669,39 @@ msgstr ""
msgid "Users that have surnormal rights" msgid "Users that have surnormal rights"
msgstr "Liste des utilisateurs ayant des droits surnormaux" msgstr "Liste des utilisateurs ayant des droits surnormaux"
#: apps/permission/templates/permission/all_rights.html:21 #: apps/permission/templates/permission/all_rights.html:19
msgid "Superusers"
msgstr "Super-utilisateurs"
#: apps/permission/templates/permission/all_rights.html:43
msgid "Roles description" msgid "Roles description"
msgstr "Description de tous les rôles" msgstr "Description de tous les rôles"
#: apps/permission/templates/permission/all_rights.html:28 #: apps/permission/templates/permission/all_rights.html:50
msgid "Filter with roles that I have in at least one club" msgid "Filter with roles that I have in at least one club"
msgstr "Filtrer les rôles que je possède dans au moins un club" msgstr "Filtrer les rôles que je possède dans au moins un club"
#: apps/permission/templates/permission/all_rights.html:44 #: apps/permission/templates/permission/all_rights.html:67
msgid "Owned" msgid "Owned"
msgstr "Possédé" msgstr "Possédé"
#: apps/permission/templates/permission/all_rights.html:54 #: apps/permission/templates/permission/all_rights.html:78
msgid "Own this role in the clubs" msgid "Own this role in the clubs"
msgstr "Possède ce rôle dans les clubs" msgstr "Possède ce rôle dans les clubs"
#: apps/permission/templates/permission/all_rights.html:60 #: apps/permission/templates/permission/all_rights.html:84
msgid "Mask:" msgid "Mask:"
msgstr "Masque :" msgstr "Masque :"
#: apps/permission/templates/permission/all_rights.html:60 #: apps/permission/templates/permission/all_rights.html:84
msgid "Query:" msgid "Query:"
msgstr "Requête :" msgstr "Requête :"
#: apps/permission/templates/permission/all_rights.html:65 #: apps/permission/templates/permission/all_rights.html:90
msgid "No associated permission" msgid "No associated permission"
msgstr "Pas de permission associée" msgstr "Pas de permission associée"
#: apps/permission/views.py:55 #: apps/permission/views.py:56
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to update this instance of the model " "You don't have the permission to update this instance of the model "
@ -1705,7 +1710,7 @@ msgstr ""
"Vous n'avez pas la permission de modifier cette instance du modèle « {model} " "Vous n'avez pas la permission de modifier cette instance du modèle « {model} "
"» avec ces paramètres. Merci de les corriger et de réessayer." "» avec ces paramètres. Merci de les corriger et de réessayer."
#: apps/permission/views.py:59 #: apps/permission/views.py:60
#, python-brace-format #, python-brace-format
msgid "" msgid ""
"You don't have the permission to create an instance of the model \"{model}\" " "You don't have the permission to create an instance of the model \"{model}\" "
@ -1714,11 +1719,11 @@ msgstr ""
"Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » " "Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » "
"avec ces paramètres. Merci de les corriger et de réessayer." "avec ces paramètres. Merci de les corriger et de réessayer."
#: apps/permission/views.py:95 note_kfet/templates/base.html:106 #: apps/permission/views.py:96 note_kfet/templates/base.html:106
msgid "Rights" msgid "Rights"
msgstr "Droits" msgstr "Droits"
#: apps/permission/views.py:100 #: apps/permission/views.py:101
msgid "All rights" msgid "All rights"
msgstr "Tous les droits" msgstr "Tous les droits"