misc: adapt clean-unused-account for keepalive (#67901)

This commit is contained in:
Benjamin Dauvergne 2022-10-06 23:07:36 +02:00
parent fa52e3739c
commit ff581d6617
2 changed files with 54 additions and 3 deletions

View File

@ -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)

View File

@ -137,6 +137,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()