From 1012d95fa49a45faa37f42553d13e1f96986e4c3 Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti Date: Wed, 11 Dec 2019 19:00:25 +0100 Subject: [PATCH 1/5] [accounts] patch the cleaning of invalid users Supervision key does not exist in Supervision tracks table for new users and waiting validation users. Fixes #539 --- .../management/commands/clean_invalid_users.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py index 2f47b8a3..85baf7b3 100644 --- a/beat/web/accounts/management/commands/clean_invalid_users.py +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -71,7 +71,8 @@ class Command(BaseCommand): count = 0 for invalid_profile in invalid_userprofiles_new_users: user = invalid_profile.user - supervisiontrack = SupervisionTrack.objects.get(supervision_key=invalid_profile.supervision_key) + # New user should not have a supervision track - Delete if any + supervisiontracks = SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key) registration_profile = RegistrationProfile.objects.get(user=invalid_profile.user) expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) @@ -79,12 +80,14 @@ class Command(BaseCommand): count += 1 user.delete() invalid_profile.delete() - supervisiontrack.delete() + for supervisiontrack in supervisiontracks: + 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) + # User waiting validation should not have a supervision track - Delete if any + supervisiontracks = SupervisionTrack.objects.filter(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_SUPERVISOR) @@ -92,7 +95,8 @@ class Command(BaseCommand): count += 1 user.delete() invalid_profile.delete() - supervisiontrack.delete() + for supervisiontrack in supervisiontracks: + 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())) -- GitLab From d06179612f873cba9205e391a9c541058a63310c Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti Date: Thu, 19 Dec 2019 17:19:21 +0100 Subject: [PATCH 2/5] [accounts] fix supervision track deletion --- .../management/commands/clean_invalid_users.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py index 85baf7b3..5d0a88ec 100644 --- a/beat/web/accounts/management/commands/clean_invalid_users.py +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -71,8 +71,6 @@ class Command(BaseCommand): count = 0 for invalid_profile in invalid_userprofiles_new_users: user = invalid_profile.user - # New user should not have a supervision track - Delete if any - supervisiontracks = SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key) registration_profile = RegistrationProfile.objects.get(user=invalid_profile.user) expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS) @@ -80,14 +78,12 @@ class Command(BaseCommand): count += 1 user.delete() invalid_profile.delete() - for supervisiontrack in supervisiontracks: - supervisiontrack.delete() + # New user should not have a supervision track - Delete if any + SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key).delete() registration_profile.delete() for invalid_profile in invalid_userprofiles_waiting_validation: user = invalid_profile.user - # User waiting validation should not have a supervision track - Delete if any - supervisiontracks = SupervisionTrack.objects.filter(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_SUPERVISOR) @@ -95,8 +91,8 @@ class Command(BaseCommand): count += 1 user.delete() invalid_profile.delete() - for supervisiontrack in supervisiontracks: - supervisiontrack.delete() + # User waiting validation should not have a supervision track - Delete if any + SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key).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())) -- GitLab From 0623cb41cadaab9a150cbd761485042a3505b7da Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti Date: Fri, 20 Dec 2019 17:45:45 +0100 Subject: [PATCH 3/5] [accounts] code refactoring for clean_invalid_users command --- .../commands/clean_invalid_users.py | 90 +++++++++++++------ 1 file changed, 61 insertions(+), 29 deletions(-) diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py index 5d0a88ec..eef7ddc9 100644 --- a/beat/web/accounts/management/commands/clean_invalid_users.py +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -27,12 +27,10 @@ ############################################################################### -from django.core.management.base import BaseCommand, CommandError +from django.core.management.base import BaseCommand -from datetime import date import datetime -from django.contrib.auth.models import User from django.conf import settings from ...models import SupervisionTrack @@ -40,72 +38,106 @@ from ...models import Profile from ....ui.registration.models import RegistrationProfile import sys -import random + class Command(BaseCommand): - help = 'Cleanup outdated invalid users' + help = "Cleanup outdated invalid users" def add_arguments(self, parser): - parser.add_argument('--noinput', action='store_false', dest='interactive', default=False, - help=('Tells Django to NOT prompt the user for input of any kind.')) - + parser.add_argument( + "--noinput", + action="store_false", + dest="interactive", + default=False, + help=("Tells Django to NOT prompt the user for input of any kind."), + ) def handle(self, *args, **options): clean = True - if options['interactive']: + if options["interactive"]: try: - answer = self.get_input_data('Delete user(s) that have not been validated by a supervisor? (y/n)? ', 'y').lower() + 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 answer != "y": + self.stdout.write("Cleanup canceled") + sys.exit(0) if clean: - invalid_userprofiles_new_users = Profile.objects.filter(status=Profile.NEWUSER) - invalid_userprofiles_waiting_validation = Profile.objects.filter(status=Profile.WAITINGVALIDATION) + 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 - 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(): + 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() # New user should not have a supervision track - Delete if any - SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key).delete() + SupervisionTrack.objects.filter( + supervision_key=invalid_profile.supervision_key + ).delete() registration_profile.delete() for invalid_profile in invalid_userprofiles_waiting_validation: user = invalid_profile.user - registration_profile = RegistrationProfile.objects.get(user=invalid_profile.user) - - expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR) - if user.profile.registration_date + expiration_date <= datetime.datetime.now(): + registration_profile = RegistrationProfile.objects.get( + user=invalid_profile.user + ) + + expiration_date = datetime.timedelta( + days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR + ) + if ( + user.profile.registration_date + expiration_date + <= datetime.datetime.now() + ): count += 1 user.delete() invalid_profile.delete() # User waiting validation should not have a supervision track - Delete if any - SupervisionTrack.objects.filter(supervision_key=invalid_profile.supervision_key).delete() + SupervisionTrack.objects.filter( + supervision_key=invalid_profile.supervision_key + ).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())) - + 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) + raw_value = input(message) - if default and raw_value == '': + if default and raw_value == "": raw_value = default return raw_value -- GitLab From 00b929d2028d25304f0798abaf24d5641d95c723 Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti Date: Mon, 23 Dec 2019 10:23:32 +0100 Subject: [PATCH 4/5] [accounts] removed unused code from clean_invalid_users command --- .../commands/clean_invalid_users.py | 121 +++++++++--------- 1 file changed, 59 insertions(+), 62 deletions(-) diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py index eef7ddc9..4a1e8f4b 100644 --- a/beat/web/accounts/management/commands/clean_invalid_users.py +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -27,17 +27,16 @@ ############################################################################### -from django.core.management.base import BaseCommand - +import sys import datetime +from django.core.management.base import BaseCommand from django.conf import settings -from ...models import SupervisionTrack -from ...models import Profile from ....ui.registration.models import RegistrationProfile -import sys +from ...models import SupervisionTrack +from ...models import Profile class Command(BaseCommand): @@ -54,7 +53,6 @@ class Command(BaseCommand): ) def handle(self, *args, **options): - clean = True if options["interactive"]: try: @@ -70,65 +68,64 @@ class Command(BaseCommand): self.stdout.write("Cleanup canceled") sys.exit(0) - if clean: - invalid_userprofiles_new_users = Profile.objects.filter( - status=Profile.NEWUSER + 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 + 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() + # New user should not have a supervision track - Delete if any + SupervisionTrack.objects.filter( + supervision_key=invalid_profile.supervision_key + ).delete() + registration_profile.delete() + + for invalid_profile in invalid_userprofiles_waiting_validation: + user = invalid_profile.user + registration_profile = RegistrationProfile.objects.get( + user=invalid_profile.user ) - invalid_userprofiles_waiting_validation = Profile.objects.filter( - status=Profile.WAITINGVALIDATION + + expiration_date = datetime.timedelta( + days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR ) - count = 0 - for invalid_profile in invalid_userprofiles_new_users: - user = invalid_profile.user - 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() - # New user should not have a supervision track - Delete if any - SupervisionTrack.objects.filter( - supervision_key=invalid_profile.supervision_key - ).delete() - registration_profile.delete() - - for invalid_profile in invalid_userprofiles_waiting_validation: - user = invalid_profile.user - registration_profile = RegistrationProfile.objects.get( - user=invalid_profile.user - ) - - expiration_date = datetime.timedelta( - days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR - ) - if ( - user.profile.registration_date + expiration_date - <= datetime.datetime.now() - ): - count += 1 - user.delete() - invalid_profile.delete() - # User waiting validation should not have a supervision track - Delete if any - SupervisionTrack.objects.filter( - supervision_key=invalid_profile.supervision_key - ).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() - ) + if ( + user.profile.registration_date + expiration_date + <= datetime.datetime.now() + ): + count += 1 + user.delete() + invalid_profile.delete() + # User waiting validation should not have a supervision track - Delete if any + SupervisionTrack.objects.filter( + supervision_key=invalid_profile.supervision_key + ).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): """ -- GitLab From 78182b642e75740a3bbad5ea986802df3da28e44 Mon Sep 17 00:00:00 2001 From: Flavio Tarsetti Date: Mon, 23 Dec 2019 12:04:33 +0100 Subject: [PATCH 5/5] [accounts] updated invalid users cleanup --- .../commands/clean_invalid_users.py | 67 +++++++++---------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/beat/web/accounts/management/commands/clean_invalid_users.py b/beat/web/accounts/management/commands/clean_invalid_users.py index 4a1e8f4b..f698b37f 100644 --- a/beat/web/accounts/management/commands/clean_invalid_users.py +++ b/beat/web/accounts/management/commands/clean_invalid_users.py @@ -68,64 +68,59 @@ class Command(BaseCommand): self.stdout.write("Cleanup canceled") sys.exit(0) - invalid_userprofiles_new_users = Profile.objects.filter( - status=Profile.NEWUSER - ) + 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 - registration_profile = RegistrationProfile.objects.get( - user=invalid_profile.user - ) + expiration_date_delta_new_users = datetime.timedelta( + days=settings.ACCOUNT_ACTIVATION_DAYS + ) + expiration_date_delta_waiting_validation = datetime.timedelta( + days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR + ) + + count += self.check_invalid_profiles( + invalid_userprofiles_new_users, expiration_date_delta_new_users + ) + count += self.check_invalid_profiles( + invalid_userprofiles_waiting_validation, + expiration_date_delta_waiting_validation, + ) - expiration_date = datetime.timedelta( - days=settings.ACCOUNT_ACTIVATION_DAYS + 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() ) - if ( - user.profile.registration_date + expiration_date - <= datetime.datetime.now() - ): - count += 1 - user.delete() - invalid_profile.delete() - # New user should not have a supervision track - Delete if any - SupervisionTrack.objects.filter( - supervision_key=invalid_profile.supervision_key - ).delete() - registration_profile.delete() + ) - for invalid_profile in invalid_userprofiles_waiting_validation: + def check_invalid_profiles(self, invalid_profiles_list, expiration_date_delta): + """ + Cleanup invalid profiles + """ + count_updated_users = 0 + for invalid_profile in invalid_profiles_list: user = invalid_profile.user registration_profile = RegistrationProfile.objects.get( user=invalid_profile.user ) - expiration_date = datetime.timedelta( - days=settings.ACCOUNT_ACTIVATION_DAYS_FROM_SUPERVISOR - ) if ( - user.profile.registration_date + expiration_date + user.profile.registration_date + expiration_date_delta <= datetime.datetime.now() ): - count += 1 + count_updated_users += 1 user.delete() invalid_profile.delete() - # User waiting validation should not have a supervision track - Delete if any + # User should not have a supervision track - Delete if any SupervisionTrack.objects.filter( supervision_key=invalid_profile.supervision_key ).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() - ) - ) + return count_updated_users def get_input_data(self, message, default=None): """ -- GitLab