From d9faefce2d5e8751093da9468dc3aac75b63b8bc Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Thu, 6 Oct 2022 23:07:36 +0200 Subject: [PATCH 2/6] misc: adapt clean-unused-account for keepalive (#67901) --- .../commands/clean-unused-accounts.py | 12 +++-- tests/test_commands.py | 45 +++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/authentic2/management/commands/clean-unused-accounts.py b/src/authentic2/management/commands/clean-unused-accounts.py index e24d4d1b..d6761856 100644 --- a/src/authentic2/management/commands/clean-unused-accounts.py +++ b/src/authentic2/management/commands/clean-unused-accounts.py @@ -23,7 +23,7 @@ from django.conf import settings from django.contrib.auth import get_user_model from django.core.management.base import BaseCommand from django.db import transaction -from django.db.models import F +from django.db.models import F, Q from django.utils import timezone, translation from authentic2 import app_settings @@ -87,10 +87,16 @@ class Command(BaseCommand): ou_users = self.user_qs.filter(ou=ou) # reset last_account_deletion_alert for users which connected since last alert - active_users = ou_users.filter(last_login__gte=F('last_account_deletion_alert')) + active_users = ou_users.filter( + Q(last_login__gte=F('last_account_deletion_alert')) + | Q(keepalive__gte=F('last_account_deletion_alert')) + ) active_users.update(last_account_deletion_alert=None) - inactive_users = ou_users.filter(last_login__lte=self.now - alert_delay) + inactive_users = ou_users.filter( + Q(last_login__lte=self.now - alert_delay) + & (Q(keepalive__isnull=True) | Q(keepalive__lte=self.now - alert_delay)) + ) # send first alert inactive_users_first_alert = inactive_users.filter(last_account_deletion_alert__isnull=True) diff --git a/tests/test_commands.py b/tests/test_commands.py index b684a3c8..f61f3c7e 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -131,6 +131,51 @@ def test_clean_unused_account_user_logs_in(app, db, simple_user, mailoutbox, fre assert len(mailoutbox) == 2 +def test_clean_unused_account_keepalive(app, db, simple_user, mailoutbox, freezer): + freezer.move_to('2018-01-01') + simple_user.ou.clean_unused_accounts_alert = 2 + simple_user.ou.clean_unused_accounts_deletion = 3 + simple_user.ou.save() + + simple_user.last_login = now() - datetime.timedelta(days=2) + simple_user.keepalive = now() + simple_user.save() + + call_command('clean-unused-accounts') + assert len(mailoutbox) == 0 + + +def test_clean_unused_account_keepalive_after_alert(app, db, simple_user, mailoutbox, freezer): + freezer.move_to('2018-01-01') + simple_user.ou.clean_unused_accounts_alert = 2 + simple_user.ou.clean_unused_accounts_deletion = 3 + simple_user.ou.save() + + simple_user.last_login = now() - datetime.timedelta(days=2) + simple_user.save() + + call_command('clean-unused-accounts') + assert len(mailoutbox) == 1 + + login(app, simple_user) + + # the day of deletion, nothing happens + freezer.move_to('2018-01-02') + assert len(mailoutbox) == 1 + + freezer.move_to('2018-01-03') + # set keepalive + simple_user.keepalive = now() + simple_user.save() + + # when new alert delay is reached, no mail is sent and last_account_deletion_alert is reset + freezer.move_to('2018-01-04') + call_command('clean-unused-accounts') + assert len(mailoutbox) == 1 + simple_user.refresh_from_db() + assert simple_user.last_account_deletion_alert is None + + def test_clean_unused_account_disabled_by_default(db, simple_user, mailoutbox): simple_user.last_login = now() - datetime.timedelta(days=2) simple_user.save() -- 2.37.2