diff --git a/logs/templates/logs/aff_stats_droits.html b/logs/templates/logs/aff_stats_droits.html
index bf672b67..6e424223 100644
--- a/logs/templates/logs/aff_stats_droits.html
+++ b/logs/templates/logs/aff_stats_droits.html
@@ -66,7 +66,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
{{utilisateur.last}}
{% endif %}
+ {% if droit != 'Superuser' %}
+ {% else %}
+
+ {% endif %}
@@ -79,4 +83,4 @@ with this program; if not, write to the Free Software Foundation, Inc.,
-{% endfor %}
\ No newline at end of file
+{% endfor %}
diff --git a/logs/views.py b/logs/views.py
index afb0a118..0acd4bd9 100644
--- a/logs/views.py
+++ b/logs/views.py
@@ -41,7 +41,7 @@ from django.urls import reverse
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
-from django.db.models import Count, Max
+from django.db.models import Count, Max, F
from reversion.models import Revision
from reversion.models import Version, ContentType
@@ -469,9 +469,14 @@ def stats_droits(request):
for droit in ListRight.objects.all().select_related('group_ptr'):
stats_list[droit] = droit.user_set.all().annotate(
num=Count('revision'),
- last=Max('revision__date_created')
+ last=Max('revision__date_created'),
)
+ stats_list['Superuser'] = User.objects.filter(is_superuser=True).annotate(
+ num=Count('revision'),
+ last=Max('revision__date_created'),
+ )
+
return render(
request,
'logs/stats_droits.html',
diff --git a/users/forms.py b/users/forms.py
index 03571fc3..b9d2b826 100644
--- a/users/forms.py
+++ b/users/forms.py
@@ -454,7 +454,7 @@ class StateForm(FormRevMixin, ModelForm):
super(StateForm, self).__init__(*args, prefix=prefix, **kwargs)
-class GroupForm(FormRevMixin, ModelForm):
+class GroupForm(FieldPermissionFormMixin, FormRevMixin, ModelForm):
""" Gestion des groupes d'un user"""
groups = forms.ModelMultipleChoiceField(
Group.objects.all(),
@@ -464,11 +464,13 @@ class GroupForm(FormRevMixin, ModelForm):
class Meta:
model = User
- fields = ['groups']
+ fields = ['is_superuser', 'groups']
def __init__(self, *args, **kwargs):
prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(GroupForm, self).__init__(*args, prefix=prefix, **kwargs)
+ if 'is_superuser' in self.fields:
+ self.fields['is_superuser'].label = "Superuser"
class SchoolForm(FormRevMixin, ModelForm):
diff --git a/users/models.py b/users/models.py
index 0b89986e..1e27e0f2 100644
--- a/users/models.py
+++ b/users/models.py
@@ -812,6 +812,18 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
"Droit requis pour éditer les groupes de l'user"
)
+ @staticmethod
+ def can_change_is_superuser(user_request, *_args, **_kwargs):
+ """ Check if an user can change a is_superuser flag
+
+ :param user_request: The user who request
+ :returns: a message and a boolean which is True if permission is granted.
+ """
+ return (
+ user_request.is_superuser,
+ "Droit superuser requis pour éditer le flag superuser"
+ )
+
def can_view(self, user_request, *_args, **_kwargs):
"""Check if an user can view an user object.
diff --git a/users/templates/users/aff_listright.html b/users/templates/users/aff_listright.html
index be94b146..8906b38e 100644
--- a/users/templates/users/aff_listright.html
+++ b/users/templates/users/aff_listright.html
@@ -33,6 +33,44 @@ with this program; if not, write to the Free Software Foundation, Inc.,
+ {% if superuser_right %}
+
+ Superuser
+
+ True
+
+
+ Utilisateurs ({{ superuser_right.count }})
+
+
+
+ Donne tous les droits sur Re2o.
+
+
+
+
+
+
+
+
+
+
+ {% for user in superuser_right %}
+
+ {{user}}
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+ {% endif %}
{% for listright in listright_list %}
@@ -48,9 +86,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Ensemble des permissions ({{ listright.permissions.all|length }})
-
-
- {{ listright.details }}
+
+
+ {{ listright.details }}
{% include 'buttons/edit.html' with href='users:edit-listright' id=listright.id %}
{% include 'buttons/history.html' with href='users:history' name='listright' id=listright.id %}
diff --git a/users/urls.py b/users/urls.py
index 05f72be0..5d868196 100644
--- a/users/urls.py
+++ b/users/urls.py
@@ -43,6 +43,9 @@ urlpatterns = [
url(r'^del_group/(?P[0-9]+)/(?P[0-9]+)$',
views.del_group,
name='del-group'),
+ url(r'^del_superuser/(?P[0-9]+)$',
+ views.del_superuser,
+ name='del-superuser'),
url(r'^new_serviceuser/$', views.new_serviceuser, name='new-serviceuser'),
url(r'^edit_serviceuser/(?P[0-9]+)$',
views.edit_serviceuser,
diff --git a/users/views.py b/users/views.py
index dd898946..34a08313 100644
--- a/users/views.py
+++ b/users/views.py
@@ -246,7 +246,7 @@ def state(request, user, userid):
@can_edit(User, 'groups')
def groups(request, user, userid):
""" View to edit the groups of a user """
- group_form = GroupForm(request.POST or None, instance=user)
+ group_form = GroupForm(request.POST or None, instance=user, user=request.user)
if group_form.is_valid():
if group_form.changed_data:
group_form.save()
@@ -294,6 +294,16 @@ def del_group(request, user, listrightid, **_kwargs):
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
+@login_required
+@can_edit(User, 'is_superuser')
+def del_superuser(request, user, **_kwargs):
+ """Remove the superuser right of an user."""
+ user.is_superuser = False
+ user.save()
+ messages.success(request, "%s n'est plus superuser" % user)
+ return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
+
+
@login_required
@can_create(ServiceUser)
def new_serviceuser(request):
@@ -763,10 +773,14 @@ def index_listright(request):
""" Affiche l'ensemble des droits"""
listright_list = ListRight.objects.order_by('unix_name')\
.prefetch_related('permissions').prefetch_related('user_set')
+ superuser_right = User.objects.filter(is_superuser=True)
return render(
request,
'users/index_listright.html',
- {'listright_list': listright_list}
+ {
+ 'listright_list': listright_list,
+ 'superuser_right' : superuser_right,
+ }
)