"""Management command to backfill image dimensions for existing cached images.""" from django.core.management.base import BaseCommand from twitch.models import DropBenefit from twitch.models import DropCampaign from twitch.models import Game from twitch.models import RewardCampaign class Command(BaseCommand): """Backfill image width and height fields for existing cached images.""" help = "Backfill image dimensions for existing cached images" def handle(self, *args, **options) -> None: # noqa: ARG002 """Execute the command.""" total_updated = 0 # Update Game box art self.stdout.write("Processing Game box_art_file...") for game in Game.objects.exclude(box_art_file=""): if game.box_art_file and not game.box_art_width: try: # Opening the file and saving triggers dimension calculation game.box_art_file.open() game.save() total_updated += 1 self.stdout.write(self.style.SUCCESS(f" Updated {game}")) except (OSError, ValueError, AttributeError) as exc: self.stdout.write(self.style.ERROR(f" Failed {game}: {exc}")) # Update DropCampaign images self.stdout.write("Processing DropCampaign image_file...") for campaign in DropCampaign.objects.exclude(image_file=""): if campaign.image_file and not campaign.image_width: try: campaign.image_file.open() campaign.save() total_updated += 1 self.stdout.write(self.style.SUCCESS(f" Updated {campaign}")) except (OSError, ValueError, AttributeError) as exc: self.stdout.write(self.style.ERROR(f" Failed {campaign}: {exc}")) # Update DropBenefit images self.stdout.write("Processing DropBenefit image_file...") for benefit in DropBenefit.objects.exclude(image_file=""): if benefit.image_file and not benefit.image_width: try: benefit.image_file.open() benefit.save() total_updated += 1 self.stdout.write(self.style.SUCCESS(f" Updated {benefit}")) except (OSError, ValueError, AttributeError) as exc: self.stdout.write(self.style.ERROR(f" Failed {benefit}: {exc}")) # Update RewardCampaign images self.stdout.write("Processing RewardCampaign image_file...") for reward in RewardCampaign.objects.exclude(image_file=""): if reward.image_file and not reward.image_width: try: reward.image_file.open() reward.save() total_updated += 1 self.stdout.write(self.style.SUCCESS(f" Updated {reward}")) except (OSError, ValueError, AttributeError) as exc: self.stdout.write(self.style.ERROR(f" Failed {reward}: {exc}")) self.stdout.write( self.style.SUCCESS(f"\nBackfill complete! Updated {total_updated} images."), )