|
@ -0,0 +1,37 @@ |
|
|
|
|
|
from datetime import timedelta |
|
|
|
|
|
|
|
|
|
|
|
from django.contrib.auth.models import User |
|
|
|
|
|
from django.core.management.base import BaseCommand |
|
|
|
|
|
from django.db.models import Count |
|
|
|
|
|
from django.utils import timezone |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Command(BaseCommand): |
|
|
|
|
|
help = """Prune old, inactive user accounts. |
|
|
|
|
|
|
|
|
|
|
|
Conditions for removing an user account: |
|
|
|
|
|
- created 1+ month ago and never logged in. |
|
|
|
|
|
Use case: visitor types in their email at the website but |
|
|
|
|
|
never follows through with login. |
|
|
|
|
|
|
|
|
|
|
|
- not logged in for 1 month, and has no checks |
|
|
|
|
|
Use case: user wants to remove their account. So they |
|
|
|
|
|
remove all checks and leave the account at that. |
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
def handle(self, *args, **options): |
|
|
|
|
|
cutoff = timezone.now() - timedelta(days=31) |
|
|
|
|
|
|
|
|
|
|
|
# Old accounts, never logged in |
|
|
|
|
|
q = User.objects |
|
|
|
|
|
q = q.filter(date_joined__lt=cutoff, last_login=None) |
|
|
|
|
|
n1, _ = q.delete() |
|
|
|
|
|
|
|
|
|
|
|
# Not logged in for 1 month, 0 checks |
|
|
|
|
|
q = User.objects |
|
|
|
|
|
q = q.annotate(n_checks=Count("check")) |
|
|
|
|
|
q = q.filter(last_login__lt=cutoff, n_checks=0) |
|
|
|
|
|
n2, _ = q.delete() |
|
|
|
|
|
|
|
|
|
|
|
return "Done! Pruned %d user accounts." % (n1 + n2) |