8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-22 19:33:11 +00:00

Fonctions mass_achivage pour objects multiples

This commit is contained in:
Gabriel Detraz 2019-03-17 04:46:55 +01:00 committed by detraz
parent 706903f8c9
commit e0194ba4e3
4 changed files with 95 additions and 35 deletions

View file

@ -41,6 +41,8 @@ from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.forms import ValidationError from django.forms import ValidationError
from django.utils import timezone from django.utils import timezone
from django.db import transaction
from reversion import revisions as reversion
from django.utils.functional import cached_property from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from macaddress.fields import MACAddressField, default_dialect from macaddress.fields import MACAddressField, default_dialect
@ -1134,6 +1136,21 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
""" Sans commentaire, désassigne une ipv4""" """ Sans commentaire, désassigne une ipv4"""
self.ipv4 = None self.ipv4 = None
@classmethod
def mass_unassign_ipv4(cls, interface_list):
"""Unassign ipv4 to multiple interfaces"""
with transaction.atomic(), reversion.create_revision():
interface_list.update(ipv4=None)
reversion.set_comment(_("IPv4 unassigning"))
@classmethod
def mass_assign_ipv4(cls, interface_list):
for interface in interface_list:
with transaction.atomic(), reversion.create_revision():
interface.assign_ipv4()
interface.save()
reversion.set_comment(_("IPv4 assigning"))
def update_type(self): def update_type(self):
""" Lorsque le machinetype est changé de type d'ip, on réassigne""" """ Lorsque le machinetype est changé de type d'ip, on réassigne"""
self.clean() self.clean()

View file

@ -297,6 +297,11 @@ class MassArchiveForm(forms.Form):
du formulaire la date de depart avant laquelle archiver les du formulaire la date de depart avant laquelle archiver les
users""" users"""
date = forms.DateTimeField(help_text='%d/%m/%y') date = forms.DateTimeField(help_text='%d/%m/%y')
full_archive = forms.BooleanField(
label=_("Make a full archive operation ? (WARNING : CRITICAL OPERATION IF TRUE)"),
initial=False,
required=False
)
def clean(self): def clean(self):
cleaned_data = super(MassArchiveForm, self).clean() cleaned_data = super(MassArchiveForm, self).clean()

View file

@ -527,47 +527,78 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
)['total'] or 0 )['total'] or 0
return somme_credit - somme_debit return somme_credit - somme_debit
def user_interfaces(self, active=True, all_interfaces=False): @classmethod
def users_interfaces(cls, users, active=True, all_interfaces=False):
""" Renvoie toutes les interfaces dont les machines appartiennent à """ Renvoie toutes les interfaces dont les machines appartiennent à
self. Par defaut ne prend que les interfaces actives""" self. Par defaut ne prend que les interfaces actives"""
if all_interfaces: if all_interfaces:
return Interface.objects.filter( return Interface.objects.filter(
machine__in=Machine.objects.filter(user=self) machine__in=Machine.objects.filter(user__in=users)
).select_related('domain__extension') ).select_related('domain__extension')
else: else:
return Interface.objects.filter( return Interface.objects.filter(
machine__in=Machine.objects.filter(user=self, active=active) machine__in=Machine.objects.filter(user__in=users, active=active)
).select_related('domain__extension') ).select_related('domain__extension')
def user_interfaces(self, active=True, all_interfaces=False):
""" Renvoie toutes les interfaces dont les machines appartiennent à
self. Par defaut ne prend que les interfaces actives"""
return self.users_interfaces([self], active=active, all_interfaces=all_interfaces)
def assign_ips(self): def assign_ips(self):
""" Assign une ipv4 aux machines d'un user """ """ Assign une ipv4 aux machines d'un user """
interfaces = self.user_interfaces() interfaces = self.user_interfaces()
for interface in interfaces: with transaction.atomic(), reversion.create_revision():
if not interface.ipv4: Interface.mass_assign_ipv4(interfaces)
with transaction.atomic(), reversion.create_revision(): reversion.set_comment(_("IPv4 assigning"))
interface.assign_ipv4()
reversion.set_comment(_("IPv4 assigning"))
interface.save()
def unassign_ips(self): def unassign_ips(self):
""" Désassigne les ipv4 aux machines de l'user""" """ Désassigne les ipv4 aux machines de l'user"""
interfaces = self.user_interfaces() interfaces = self.user_interfaces()
for interface in interfaces: with transaction.atomic(), reversion.create_revision():
with transaction.atomic(), reversion.create_revision(): Interface.mass_unassign_ipv4(interfaces)
interface.unassign_ipv4() reversion.set_comment(_("IPv4 unassigning"))
reversion.set_comment(_("IPv4 unassigning"))
interface.save() @classmethod
def mass_unassign_ips(cls, users_list):
interfaces = cls.users_interfaces(users_list)
with transaction.atomic(), reversion.create_revision():
Interface.mass_unassign_ipv4(interfaces)
reversion.set_comment(_("IPv4 assigning"))
@classmethod
def mass_disable_email(cls, queryset_users):
"""Disable email account and redirection"""
queryset_users.update(local_email_enabled=False)
queryset_users.update(local_email_redirect=False)
@classmethod
def mass_delete_data(cls, queryset_users):
"""This users will be completely archived, so only keep mandatory data"""
cls.mass_disable_email(queryset_users)
Machine.objects.filter(user__in=queryset_users).delete()
cls.ldap_delete_users(queryset_users)
def disable_email(self): def disable_email(self):
"""Disable email account and redirection""" """Disable email account and redirection"""
self.local_email_enabled = False self.local_email_enabled=False
self.local_email_redirect = False self.local_email_redirect=False
def delete_data(self): def delete_data(self):
"""This user will be completely archived, so only keep mandatory data""" """This user will be completely archived, so only keep mandatory data"""
self.disabled_email() self.disable_email()
self.user_interfaces(all_interfaces=True).delete() self.machine_set.all().delete()
self.ldap_del()
@classmethod
def mass_archive(cls, users_list):
cls.mass_unassign_ips(users_list)
users_list.update(state=User.STATE_ARCHIVE)
@classmethod
def mass_full_archive(cls, users_list):
cls.mass_unassign_ips(users_list)
cls.mass_delete_data(users_list)
users_list.update(state=User.STATE_FULL_ARCHIVE)
def archive(self): def archive(self):
""" Filling the user; no more active""" """ Filling the user; no more active"""
@ -660,6 +691,11 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser,
except LdapUser.DoesNotExist: except LdapUser.DoesNotExist:
pass pass
@classmethod
def ldap_delete_users(cls, queryset_users):
"""Delete multiple users in ldap"""
LdapUser.objects.filter(name__in=list(queryset_users.values_list('pseudo', flat=True)))
def notif_inscription(self): def notif_inscription(self):
""" Prend en argument un objet user, envoie un mail de bienvenue """ """ Prend en argument un objet user, envoie un mail de bienvenue """
template = loader.get_template('users/email_welcome') template = loader.get_template('users/email_welcome')

View file

@ -776,26 +776,28 @@ def del_listright(request, instances):
@can_change(User, 'state') @can_change(User, 'state')
def mass_archive(request): def mass_archive(request):
""" Permet l'archivage massif""" """ Permet l'archivage massif"""
to_archive_date = MassArchiveForm(request.POST or None) pagination_number = GeneralOption.get_cached_value('pagination_number')
to_archive_form = MassArchiveForm(request.POST or None)
to_archive_list = [] to_archive_list = []
if to_archive_date.is_valid(): if to_archive_form.is_valid():
date = to_archive_date.cleaned_data['date'] date = to_archive_form.cleaned_data['date']
to_archive_list = [user for user in full_archive = to_archive_form.cleaned_data['full_archive']
User.objects.exclude(state=User.STATE_ARCHIVE) to_archive_list = User.objects.exclude(id__in=all_has_access()).exclude(id__in=all_has_access(search_time=date)).exclude(state=User.STATE_NOT_YET_ACTIVE).exclude(state=User.STATE_FULL_ARCHIVE)
if not user.end_access() if not full_archive:
or user.end_access() < date] to_archive_list = to_archive_list.exclude(state=User.STATE_ARCHIVE)
number_to_archive = to_archive_list.count()
if "valider" in request.POST: if "valider" in request.POST:
for user in to_archive_list: if full_archive:
with transaction.atomic(), reversion.create_revision(): User.mass_full_archive(to_archive_list)
user.archive() else:
user.save() User.mass_archive(to_archive_list)
reversion.set_comment(_("Archiving")) messages.success(request, _("%s users were archived.") %
messages.success(request, _("%s users were archived.") % len( number_to_archive
to_archive_list )
))
return redirect(reverse('users:index')) return redirect(reverse('users:index'))
to_archive_list = re2o_paginator(request, to_archive_list, pagination_number)
return form( return form(
{'userform': to_archive_date, 'to_archive_list': to_archive_list}, {'userform': to_archive_form, 'to_archive_list': to_archive_list},
'users/mass_archive.html', 'users/mass_archive.html',
request request
) )