from datetime import timedelta from django.contrib.auth.models import User from django.core.management.base import BaseCommand from django.db.models import Count, F from django.utils.timezone import now from hc.accounts.models import Profile class Command(BaseCommand): help = """Prune old, inactive user accounts. Conditions for removing an user account: - created 1 month ago and never logged in. Does not belong to any team. Use case: visitor types in their email at the website but never follows through with login. """ def handle(self, *args, **options): month_ago = now() - timedelta(days=30) # Old accounts, never logged in, no team memberships q = User.objects.order_by("id") q = q.annotate(n_teams=Count("memberships")) q = q.filter(date_joined__lt=month_ago, last_login=None, n_teams=0) n, summary = q.delete() count = summary.get("auth.User", 0) self.stdout.write("Pruned %d never-logged-in user accounts." % count) # Profiles scheduled for deletion q = Profile.objects.order_by("id") q = q.filter(deletion_notice_date__lt=month_ago) # Exclude users who have logged in after receiving deletion notice q = q.exclude(user__last_login__gt=F("deletion_notice_date")) for profile in q: self.stdout.write("Deleting inactive %s" % profile.user.email) profile.user.delete() return "Done!"