From bbc87fe9bfae62d7775f82f4360c0ba01900492c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Fri, 29 Apr 2016 11:43:20 +0300 Subject: [PATCH] pruneemails and pruneusers commands for database cleanup --- hc/accounts/management/commands/pruneusers.py | 37 +++++++++++++++++++ hc/api/management/commands/pruneemails.py | 14 +++++++ hc/api/views.py | 1 - 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 hc/accounts/management/commands/pruneusers.py create mode 100644 hc/api/management/commands/pruneemails.py diff --git a/hc/accounts/management/commands/pruneusers.py b/hc/accounts/management/commands/pruneusers.py new file mode 100644 index 00000000..055d3c46 --- /dev/null +++ b/hc/accounts/management/commands/pruneusers.py @@ -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) diff --git a/hc/api/management/commands/pruneemails.py b/hc/api/management/commands/pruneemails.py new file mode 100644 index 00000000..771cd86c --- /dev/null +++ b/hc/api/management/commands/pruneemails.py @@ -0,0 +1,14 @@ +from datetime import timedelta + +from django.core.management.base import BaseCommand +from django.utils import timezone +from djmail.models import Message + + +class Command(BaseCommand): + help = 'Prune stored email messages older than 7 days' + + def handle(self, *args, **options): + cutoff = timezone.now() - timedelta(days=7) + n, _ = Message.objects.filter(sent_at__lt=cutoff).delete() + return "Done! Pruned %d email messages." % n diff --git a/hc/api/views.py b/hc/api/views.py index 530baf19..e48a4d03 100644 --- a/hc/api/views.py +++ b/hc/api/views.py @@ -1,5 +1,4 @@ from datetime import timedelta as td -import json from django.db.models import F from django.http import HttpResponse, HttpResponseBadRequest, JsonResponse