Skip to content

Commit

Permalink
[#1715] Added management command to delete expired contact invitations
Browse files Browse the repository at this point in the history
  • Loading branch information
pi-sigma committed Sep 28, 2023
1 parent 09f11b9 commit 7b42015
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from datetime import timedelta

from django.conf import settings
from django.core.management.base import BaseCommand
from django.utils import timezone

from open_inwoner.utils.logentry import system_action

from ...models import Invite


class Command(BaseCommand):
help = (
"Delete contact invitations which are older than a predefined period "
"(the default is defined in `settings.INVITE_EXPIRY_DAYS`)"
)

def handle(self, *args, **kwargs):
now = timezone.now()
expired_invitations = Invite.objects.select_related("inviter").filter(
created_on__lt=now - timedelta(days=settings.INVITE_EXPIRY_DAYS)
)
inviters = set(invite.inviter for invite in expired_invitations)

for user in inviters:
my_expired_invitations = expired_invitations.filter(inviter__id=user.id)
invites_info = [
f"{invite.invitee_email} (invited on {invite.created_on.strftime('%Y-%m-%d')})"
for invite in my_expired_invitations
]
message = f"Expired contact invitations from {user.first_name} {user.last_name} deleted"

system_action(message, user=user, deleted_invitations=invites_info)

expired_invitations.delete()
38 changes: 38 additions & 0 deletions src/open_inwoner/accounts/tests/test_commands.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from django.core.management import call_command
from django.test import TestCase

from freezegun import freeze_time
from timeline_logger.models import TimelineLog

from ..models import Invite
from .factories import InviteFactory


class DeleteContactInvitationsTest(TestCase):
@freeze_time("2023-09-26", as_arg=True)
def test_delete_expired_invitations(frozen_time, self):

invite1 = InviteFactory.create()

frozen_time.move_to("2023-10-01")

invite2 = InviteFactory.create()

frozen_time.move_to("2023-10-27")

call_command("delete_invitations")

# check remaining invites
invitations = Invite.objects.all()
self.assertEqual(len(invitations), 1)
self.assertEqual(invitations[0].invitee_email, invite2.invitee_email)

# check logs
logs = TimelineLog.objects.all()
self.assertEqual(len(logs), 1)

log_data = logs[0].extra_data
self.assertEqual(
log_data["deleted_invitations"][0],
f"{invite1.invitee_email} (invited on {invite1.created_on.strftime('%Y-%m-%d')})",
)
3 changes: 1 addition & 2 deletions src/open_inwoner/conf/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -779,9 +779,8 @@
}
}


# invite expires in X days after sending
INVITE_EXPIRY = 14
INVITE_EXPIRY_DAYS = config("INVITE_EXPIRY_DAYS", default=30)

# zgw-consumers
ZGW_CONSUMERS_TEST_SCHEMA_DIRS = [
Expand Down
10 changes: 8 additions & 2 deletions src/open_inwoner/utils/logentry.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,12 @@ def user_action(request, object, message):


def system_action(
message, *, content_object=None, user=None, log_level=logging.INFO, exc_info=None
message,
content_object=None,
user=None,
log_level=logging.INFO,
exc_info=None,
**kwargs,
):
"""
Log a generic action done by business logic.
Expand All @@ -163,5 +168,6 @@ def system_action(
"action_flag": LOG_ACTIONS[5],
"message": message,
"log_level": log_level,
},
}
| kwargs,
)

0 comments on commit 7b42015

Please sign in to comment.