diff --git a/beat/web/accounts/management/__init__.py b/beat/web/accounts/management/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/beat/web/accounts/management/commands/__init__.py b/beat/web/accounts/management/commands/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py new file mode 100644 index 0000000000000000000000000000000000000000..eef2dcffbde011552ac29fc6a7c850efaeaff025 --- /dev/null +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# vim: set fileencoding=utf-8 : +# encoding: utf-8 + +############################################################################### +# # +# Copyright (c) 2016 Idiap Research Institute, http://www.idiap.ch/ # +# Contact: beat.support@idiap.ch # +# # +# This file is part of the beat.web module of the BEAT platform. # +# # +# Commercial License Usage # +# Licensees holding valid commercial BEAT licenses may use this file in # +# accordance with the terms contained in a written agreement between you # +# and Idiap. For further information contact tto@idiap.ch # +# # +# Alternatively, this file may be used under the terms of the GNU Affero # +# Public License version 3 as published by the Free Software and appearing # +# in the file LICENSE.AGPL included in the packaging of this file. # +# The BEAT platform 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. # +# # +# You should have received a copy of the GNU Affero Public License along # +# with the BEAT platform. If not, see http://www.gnu.org/licenses/. # +# # +############################################################################### + + +from django.core.management.base import BaseCommand, CommandError + +from datetime import date +import datetime + +from django.contrib.auth.models import User +from django.conf import settings + +from ...models import SupervisionTrack +from ...models import Profile +from ....ui.registration.models import RegistrationProfile + +import sys +import random + +class Command(BaseCommand): + + help = 'Cleanup outdated invalid users' + + def add_arguments(self, parser): + parser.add_argument('--noinput', action='store_false', dest='interactive', default=True, + help=('Tells Django to NOT prompt the user for input of any kind.')) + + + def handle(self, *args, **options): + clean = True + + if options['interactive']: + try: + answer = self.get_input_data('Delete user(s) that have not been validated by a supervisor? (y/n)? ', 'y').lower() + except KeyboardInterrupt: + self.stderr.write("\nOperation canceled.") + sys.exit(1) + + if answer != 'y': + self.stdout.write('Cleanup canceled') + sys.exit(1) + + if clean: + invalid_userprofiles_new_users = Profile.objects.filter(status=Profile.NEWUSER) + invalid_userprofiles_waiting_validation = Profile.objects.filter(status=Profile.WAITINGVALIDATION) + count = 0 + for invalid_profile in invalid_userprofiles_new_users: + user = invalid_profile.user + supervisiontrack = SupervisionTrack.objects.get(supervision_key=invalid_profile.supervision_key) + registration_profile = RegistrationProfile.objects.get(user=invalid_profile.user) + + expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) + if user.profile.registration_date + expiration_date <= datetime.datetime.now(): + count += 1 + user.delete() + invalid_profile.delete() + supervisiontrack.delete() + registration_profile.delete() + + for invalid_profile in invalid_userprofiles_waiting_validation: + user = invalid_profile.user + supervisiontrack = SupervisionTrack.objects.get(supervision_key=invalid_profile.supervision_key) + registration_profile = RegistrationProfile.objects.get(user=invalid_profile.user) + + expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_GODFATHER) + if user.profile.registration_date + expiration_date <= datetime.datetime.now(): + count += 1 + user.delete() + invalid_profile.delete() + supervisiontrack.delete() + registration_profile.delete() + + self.stdout.write('{} Invalid user(s) successfully cleaned/'.format(count) + '{} Total user(s) checked:'.format(invalid_userprofiles_new_users.count()+invalid_userprofiles_waiting_validation.count())) + + + def get_input_data(self, message, default=None): + """ + Override this method if you want to customize data inputs or + validation exceptions. + """ + raw_value = raw_input(message) + + if default and raw_value == '': + raw_value = default + + return raw_value