from django.core.management.base import BaseCommand from django.db.models import Sum from django.utils import timezone from labs.models import User, UserCreditDetail class Command(BaseCommand): def handle(self, *args, **options): users = User.objects.select_related("credit_summary").all().iterator(chunk_size=200) total_count = User.objects.count() processed_count = 0 for user in users: summary_free_credits = user.credit_summary.free_credits summary_paid_credits = user.credit_summary.paid_credits detail_free_credits = user.credit_details.filter( credit_type=UserCreditDetail.CreditType.FREE, expires_at__gte=timezone.now(), ).aggregate(Sum("amount"))["amount__sum"] or 0 detail_paid_credits = user.credit_details.filter( credit_type=UserCreditDetail.CreditType.PAID, ).aggregate(Sum("amount"))["amount__sum"] or 0 if summary_free_credits != detail_free_credits or summary_paid_credits != detail_paid_credits: print( f"User {user.id} has incorrect credit balance: " f"{summary_free_credits} != {detail_free_credits} or " f"{summary_paid_credits} != {detail_paid_credits}" ) processed_count += 1 if processed_count % 100 == 0: print(f"Validated {processed_count} / {total_count}")