mirror of https://gitlab.federez.net/re2o/re2o
committed by
chirac
1 changed files with 99 additions and 0 deletions
@ -0,0 +1,99 @@ |
|||
# ⁻*- mode: python; coding: utf-8 -*- |
|||
# 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 © 2019 Hugo Levy--Falk |
|||
# |
|||
# 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. |
|||
|
|||
import argparse |
|||
import datetime |
|||
|
|||
from django.core.management.base import BaseCommand, CommandError |
|||
from django.utils.timezone import make_aware |
|||
|
|||
from re2o.utils import all_has_access |
|||
from users.models import User |
|||
|
|||
def valid_date(s): |
|||
try: |
|||
return make_aware(datetime.datetime.strptime(s, "%d/%m/%Y")) |
|||
except ValueError: |
|||
msg = "Not a valid date: '{0}'.".format(s) |
|||
raise argparse.ArgumentTypeError(msg) |
|||
|
|||
class Command(BaseCommand): |
|||
help = "Allow unactive users archiving by unassigning their IP addresses." |
|||
|
|||
def add_arguments(self, parser): |
|||
parser.add_argument( |
|||
'--full', |
|||
'-f', |
|||
action='store_true', |
|||
help="Full archive users, i.e. delete their email address, machines and remove them from the LDAP." |
|||
) |
|||
parser.add_argument( |
|||
'--date', |
|||
'-d', |
|||
default=datetime.date.today().strftime('%d/%m/%Y'), |
|||
type=valid_date, |
|||
help="Users which membership ends sooner than this date will be archived.", |
|||
) |
|||
parser.add_argument( |
|||
'--show', |
|||
'-s', |
|||
action='store_true', |
|||
help="Only show a list of users, without doing anything." |
|||
) |
|||
parser.add_argument( |
|||
'-y', |
|||
action='store_true', |
|||
help='Do not ask for confirmation befor full archiving.' |
|||
) |
|||
|
|||
def handle(self, *args, **kwargs): |
|||
full_archive = kwargs["full"] |
|||
date = kwargs["date"] |
|||
force = kwargs["y"] |
|||
show = kwargs["show"] |
|||
|
|||
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 show: |
|||
self.stdout.write( |
|||
"%s users found : " % to_archive_list.count() |
|||
) |
|||
self.stdout.write('\n'.join(map(str, to_archive_list.all()))) |
|||
return |
|||
|
|||
if full_archive and not force: |
|||
self.stdout.write( |
|||
self.style.WARNING( |
|||
"Please confirm full archiving (it is a critical operation !) [Y/n]" |
|||
) |
|||
) |
|||
if input() != 'Y': |
|||
self.stdout.write("Leaving without archiving.") |
|||
return |
|||
if full_archive: |
|||
self.stdout.write("Full archiving users with a membership ending prior to %s" % date.strftime("%d/%m/%Y")) |
|||
User.mass_full_archive(to_archive_list) |
|||
else: |
|||
self.stdout.write("Archiving users with a membership ending prior to %s" % date.strftime("%d/%m/%Y")) |
|||
to_archive_list = to_archive_list.exclude(state=User.STATE_ARCHIVE) |
|||
User.mass_archive(to_archive_list) |
|||
self.stdout.write(self.style.SUCCESS("%s users were archived." % to_archive_list.count())) |
|||
|
|||
Loading…
Reference in new issue