mirror of
https://gitlab2.federez.net/re2o/re2o
synced 2024-11-23 20:03:11 +00:00
Ajoute une fonction pour l'archivage de masse
This commit is contained in:
parent
d738448867
commit
d0ab02629d
6 changed files with 97 additions and 2 deletions
|
@ -26,6 +26,7 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
from django.contrib.auth.forms import ReadOnlyPasswordHashField
|
||||||
from django.core.validators import MinLengthValidator
|
from django.core.validators import MinLengthValidator
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from .models import User, ServiceUser, get_admin_right
|
from .models import User, ServiceUser, get_admin_right
|
||||||
|
|
||||||
|
@ -137,3 +138,13 @@ class ServiceUserChangeForm(forms.ModelForm):
|
||||||
class ResetPasswordForm(forms.Form):
|
class ResetPasswordForm(forms.Form):
|
||||||
pseudo = forms.CharField(label=u'Pseudo', max_length=255)
|
pseudo = forms.CharField(label=u'Pseudo', max_length=255)
|
||||||
email = forms.EmailField(max_length=255)
|
email = forms.EmailField(max_length=255)
|
||||||
|
|
||||||
|
class MassArchiveForm(forms.Form):
|
||||||
|
date = forms.DateTimeField(help_text='%d/%m/%y')
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data=super(MassArchiveForm, self).clean()
|
||||||
|
date = cleaned_data.get("date")
|
||||||
|
if date:
|
||||||
|
if date>timezone.now():
|
||||||
|
raise forms.ValidationError("Impossible d'archiver des utilisateurs dont la fin d'accès se situe dans le futur !")
|
||||||
|
|
|
@ -223,7 +223,7 @@ class User(AbstractBaseUser):
|
||||||
return date_max
|
return date_max
|
||||||
|
|
||||||
def end_whitelist(self):
|
def end_whitelist(self):
|
||||||
""" Renvoie la date de fin de ban d'un user, False sinon """
|
""" Renvoie la date de fin de whitelist d'un user, False sinon """
|
||||||
date_max = Whitelist.objects.filter(user=self).aggregate(models.Max('date_end'))['date_end__max']
|
date_max = Whitelist.objects.filter(user=self).aggregate(models.Max('date_end'))['date_end__max']
|
||||||
return date_max
|
return date_max
|
||||||
|
|
||||||
|
@ -252,6 +252,19 @@ class User(AbstractBaseUser):
|
||||||
return self.state == User.STATE_ACTIVE \
|
return self.state == User.STATE_ACTIVE \
|
||||||
and not self.is_ban() and (self.is_adherent() or self.is_whitelisted())
|
and not self.is_ban() and (self.is_adherent() or self.is_whitelisted())
|
||||||
|
|
||||||
|
def end_access(self):
|
||||||
|
""" Renvoie la date de fin normale d'accès (adhésion ou whiteliste)"""
|
||||||
|
if not self.end_adhesion():
|
||||||
|
if not self.end_whitelist():
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return self.end_whitelist()
|
||||||
|
else:
|
||||||
|
if not self.end_whitelist():
|
||||||
|
return self.end_adhesion()
|
||||||
|
else:
|
||||||
|
return max(self.end_adhesion(), self.end_whitelist())
|
||||||
|
|
||||||
def user_interfaces(self):
|
def user_interfaces(self):
|
||||||
return Interface.objects.filter(machine__in=Machine.objects.filter(user=self, active=True))
|
return Interface.objects.filter(machine__in=Machine.objects.filter(user=self, active=True))
|
||||||
|
|
||||||
|
|
46
users/templates/users/mass_archive.html
Normal file
46
users/templates/users/mass_archive.html
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{% extends "users/sidebar.html" %}
|
||||||
|
{% comment %}
|
||||||
|
Re2o est un logiciel d'administration développé initiallement au rezometz. Il
|
||||||
|
se veut agnostique au réseau considéré, de manière à être installable en
|
||||||
|
quelques clics.
|
||||||
|
|
||||||
|
Copyright © 2017 Gabriel Détraz
|
||||||
|
Copyright © 2017 Goulven Kermarec
|
||||||
|
Copyright © 2017 Augustin Lemesle
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
{% endcomment %}
|
||||||
|
|
||||||
|
{% load bootstrap3 %}
|
||||||
|
|
||||||
|
{% block title %} Utilisateurs à archiver{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<form class="form" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% bootstrap_form userform %}
|
||||||
|
<input type="submit" name="chercher" value="Chercher" class="btn btn-primary" id="submit-id-submit">
|
||||||
|
<input type="submit" name="valider" value="Valider définitivement" class="btn btn-primary" id="submit-id-submit">
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Les utilisateurs suivant seront archivés ({{ to_archive_list|length }}):</h3>
|
||||||
|
{% include "users/aff_users.html" with users_list=to_archive_list %}
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -55,6 +55,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
<i class="glyphicon glyphicon-trash"></i>
|
<i class="glyphicon glyphicon-trash"></i>
|
||||||
Retirer un droit
|
Retirer un droit
|
||||||
</a>
|
</a>
|
||||||
|
<a class="list-group-item list-group-item-danger" href="{% url "users:mass-archive" %}">
|
||||||
|
<i class="glyphicon glyphicon-book"></i>
|
||||||
|
Archiver en masse
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -50,6 +50,7 @@ urlpatterns = [
|
||||||
url(r'^mon_profil/$', views.mon_profil, name='mon-profil'),
|
url(r'^mon_profil/$', views.mon_profil, name='mon-profil'),
|
||||||
url(r'^process/(?P<token>[a-z0-9]{32})/$', views.process, name='process'),
|
url(r'^process/(?P<token>[a-z0-9]{32})/$', views.process, name='process'),
|
||||||
url(r'^reset_password/$', views.reset_password, name='reset-password'),
|
url(r'^reset_password/$', views.reset_password, name='reset-password'),
|
||||||
|
url(r'^mass_archive/$', views.mass_archive, name='mass-archive'),
|
||||||
url(r'^history/(?P<object>user)/(?P<id>[0-9]+)$', views.history, name='history'),
|
url(r'^history/(?P<object>user)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
url(r'^history/(?P<object>ban)/(?P<id>[0-9]+)$', views.history, name='history'),
|
url(r'^history/(?P<object>ban)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
url(r'^history/(?P<object>whitelist)/(?P<id>[0-9]+)$', views.history, name='history'),
|
url(r'^history/(?P<object>whitelist)/(?P<id>[0-9]+)$', views.history, name='history'),
|
||||||
|
|
|
@ -43,7 +43,7 @@ from users.models import DelRightForm, BanForm, WhitelistForm, DelSchoolForm, De
|
||||||
from users.models import EditInfoForm, InfoForm, BaseInfoForm, StateForm, RightForm, SchoolForm, ListRightForm
|
from users.models import EditInfoForm, InfoForm, BaseInfoForm, StateForm, RightForm, SchoolForm, ListRightForm
|
||||||
from cotisations.models import Facture
|
from cotisations.models import Facture
|
||||||
from machines.models import Machine, Interface
|
from machines.models import Machine, Interface
|
||||||
from users.forms import PassForm, ResetPasswordForm
|
from users.forms import MassArchiveForm, PassForm, ResetPasswordForm
|
||||||
from machines.views import unassign_ips, assign_ips
|
from machines.views import unassign_ips, assign_ips
|
||||||
|
|
||||||
from re2o.login import hashNT
|
from re2o.login import hashNT
|
||||||
|
@ -455,6 +455,26 @@ def del_listright(request):
|
||||||
return redirect("/users/index_listright/")
|
return redirect("/users/index_listright/")
|
||||||
return form({'userform': listright}, 'users/user.html', request)
|
return form({'userform': listright}, 'users/user.html', request)
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
@permission_required('bureau')
|
||||||
|
def mass_archive(request):
|
||||||
|
""" Permet l'archivage massif"""
|
||||||
|
to_archive_date = MassArchiveForm(request.POST or None)
|
||||||
|
to_archive_list = []
|
||||||
|
if to_archive_date.is_valid():
|
||||||
|
date = to_archive_date.cleaned_data['date']
|
||||||
|
to_archive_list = [user for user in User.objects.exclude(state=User.STATE_ARCHIVE) if not user.end_access() or user.end_access() < date]
|
||||||
|
if "valider" in request.POST:
|
||||||
|
for user in to_archive_list:
|
||||||
|
archive(user)
|
||||||
|
with transaction.atomic(), reversion.create_revision():
|
||||||
|
user.state=User.STATE_ARCHIVE
|
||||||
|
user.save()
|
||||||
|
reversion.set_comment("Archivage")
|
||||||
|
messages.success(request, "%s users ont été archivés" % len(to_archive_list))
|
||||||
|
return redirect("/users/")
|
||||||
|
return form({'userform': to_archive_date, 'to_archive_list': to_archive_list}, 'users/mass_archive.html', request)
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@permission_required('cableur')
|
@permission_required('cableur')
|
||||||
def index(request):
|
def index(request):
|
||||||
|
|
Loading…
Reference in a new issue