from django.db.models import F from django.contrib.auth.models import User from django.core.management.base import BaseCommand from hc.accounts.models import Profile from hc.api.models import Check, Ping class Command(BaseCommand): help = """Prune pings based on limits in user profiles. This command prunes each check individually. So it does the work in small chunks instead of a few big SQL queries like the `prunepings` command. It is appropriate for initial pruning of the potentially huge api_ping table. """ def handle(self, *args, **options): # Create any missing user profiles for user in User.objects.filter(profile=None): Profile.objects.get_or_create(user_id=user.id) checks = Check.objects.filter(user__isnull=False) checks = checks.annotate(limit=F("user__profile__ping_log_limit")) for check in checks: q = Ping.objects.filter(owner_id=check.id) q = q.filter(n__lt=check.n_pings - check.limit) q = q.filter(n__gt=0) n_pruned, _ = q.delete() self.stdout.write("Pruned %d pings for check %s (%s)" % (n_pruned, check.id, check.name)) return "Done!"