image library
created using VS Codey Copilot Agent with Claude Sonnet 4
This commit is contained in:
parent
bdf06863d2
commit
52dbe89582
14 changed files with 1366 additions and 3 deletions
0
hub/services/management/__init__.py
Normal file
0
hub/services/management/__init__.py
Normal file
0
hub/services/management/commands/__init__.py
Normal file
0
hub/services/management/commands/__init__.py
Normal file
293
hub/services/management/commands/migrate_images.py
Normal file
293
hub/services/management/commands/migrate_images.py
Normal file
|
@ -0,0 +1,293 @@
|
|||
from django.core.management.base import BaseCommand
|
||||
from django.core.files.base import ContentFile
|
||||
from django.utils.text import slugify
|
||||
from hub.services.models import (
|
||||
ImageLibrary,
|
||||
Service,
|
||||
CloudProvider,
|
||||
ConsultingPartner,
|
||||
Article,
|
||||
)
|
||||
import os
|
||||
import shutil
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Migrate existing images to the Image Library"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
"--dry-run",
|
||||
action="store_true",
|
||||
help="Show what would be migrated without actually doing it",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--force",
|
||||
action="store_true",
|
||||
help="Force migration even if images already exist in library",
|
||||
)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
"""
|
||||
Main command handler to migrate existing images to the library.
|
||||
"""
|
||||
dry_run = options["dry_run"]
|
||||
force = options["force"]
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(
|
||||
f'Starting image migration {"(DRY RUN)" if dry_run else ""}'
|
||||
)
|
||||
)
|
||||
|
||||
# Migrate different types of images
|
||||
self.migrate_service_logos(dry_run, force)
|
||||
self.migrate_cloud_provider_logos(dry_run, force)
|
||||
self.migrate_partner_logos(dry_run, force)
|
||||
self.migrate_article_images(dry_run, force)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(
|
||||
f'Image migration completed {"(DRY RUN)" if dry_run else ""}'
|
||||
)
|
||||
)
|
||||
|
||||
def migrate_service_logos(self, dry_run, force):
|
||||
"""
|
||||
Migrate service logos to the image library.
|
||||
"""
|
||||
self.stdout.write("Migrating service logos...")
|
||||
|
||||
services = Service.objects.filter(logo__isnull=False).exclude(logo="")
|
||||
|
||||
for service in services:
|
||||
if not service.logo:
|
||||
continue
|
||||
|
||||
# Check if image already exists in library
|
||||
existing_image = ImageLibrary.objects.filter(
|
||||
name=f"{service.name} Logo"
|
||||
).first()
|
||||
|
||||
if existing_image and not force:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(
|
||||
f" - Skipping {service.name} logo (already exists)"
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
if dry_run:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Would migrate: {service.name} logo")
|
||||
)
|
||||
continue
|
||||
|
||||
# Create image library entry
|
||||
image_lib = ImageLibrary(
|
||||
name=f"{service.name} Logo",
|
||||
slug=slugify(f"{service.name}-logo"),
|
||||
description=f"Logo for {service.name} service",
|
||||
alt_text=f"{service.name} logo",
|
||||
category="logo",
|
||||
tags=f"service, logo, {service.name.lower()}",
|
||||
)
|
||||
|
||||
# Copy the image file
|
||||
if service.logo and os.path.exists(service.logo.path):
|
||||
with open(service.logo.path, "rb") as f:
|
||||
image_lib.image.save(
|
||||
os.path.basename(service.logo.name),
|
||||
ContentFile(f.read()),
|
||||
save=True,
|
||||
)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Migrated: {service.name} logo")
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(
|
||||
f" - Failed to migrate: {service.name} logo (file not found)"
|
||||
)
|
||||
)
|
||||
|
||||
def migrate_cloud_provider_logos(self, dry_run, force):
|
||||
"""
|
||||
Migrate cloud provider logos to the image library.
|
||||
"""
|
||||
self.stdout.write("Migrating cloud provider logos...")
|
||||
|
||||
providers = CloudProvider.objects.filter(logo__isnull=False).exclude(logo="")
|
||||
|
||||
for provider in providers:
|
||||
if not provider.logo:
|
||||
continue
|
||||
|
||||
# Check if image already exists in library
|
||||
existing_image = ImageLibrary.objects.filter(
|
||||
name=f"{provider.name} Logo"
|
||||
).first()
|
||||
|
||||
if existing_image and not force:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(
|
||||
f" - Skipping {provider.name} logo (already exists)"
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
if dry_run:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Would migrate: {provider.name} logo")
|
||||
)
|
||||
continue
|
||||
|
||||
# Create image library entry
|
||||
image_lib = ImageLibrary(
|
||||
name=f"{provider.name} Logo",
|
||||
slug=slugify(f"{provider.name}-logo"),
|
||||
description=f"Logo for {provider.name} cloud provider",
|
||||
alt_text=f"{provider.name} logo",
|
||||
category="logo",
|
||||
tags=f"cloud, provider, logo, {provider.name.lower()}",
|
||||
)
|
||||
|
||||
# Copy the image file
|
||||
if provider.logo and os.path.exists(provider.logo.path):
|
||||
with open(provider.logo.path, "rb") as f:
|
||||
image_lib.image.save(
|
||||
os.path.basename(provider.logo.name),
|
||||
ContentFile(f.read()),
|
||||
save=True,
|
||||
)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Migrated: {provider.name} logo")
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(
|
||||
f" - Failed to migrate: {provider.name} logo (file not found)"
|
||||
)
|
||||
)
|
||||
|
||||
def migrate_partner_logos(self, dry_run, force):
|
||||
"""
|
||||
Migrate consulting partner logos to the image library.
|
||||
"""
|
||||
self.stdout.write("Migrating consulting partner logos...")
|
||||
|
||||
partners = ConsultingPartner.objects.filter(logo__isnull=False).exclude(logo="")
|
||||
|
||||
for partner in partners:
|
||||
if not partner.logo:
|
||||
continue
|
||||
|
||||
# Check if image already exists in library
|
||||
existing_image = ImageLibrary.objects.filter(
|
||||
name=f"{partner.name} Logo"
|
||||
).first()
|
||||
|
||||
if existing_image and not force:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(
|
||||
f" - Skipping {partner.name} logo (already exists)"
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
if dry_run:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Would migrate: {partner.name} logo")
|
||||
)
|
||||
continue
|
||||
|
||||
# Create image library entry
|
||||
image_lib = ImageLibrary(
|
||||
name=f"{partner.name} Logo",
|
||||
slug=slugify(f"{partner.name}-logo"),
|
||||
description=f"Logo for {partner.name} consulting partner",
|
||||
alt_text=f"{partner.name} logo",
|
||||
category="logo",
|
||||
tags=f"consulting, partner, logo, {partner.name.lower()}",
|
||||
)
|
||||
|
||||
# Copy the image file
|
||||
if partner.logo and os.path.exists(partner.logo.path):
|
||||
with open(partner.logo.path, "rb") as f:
|
||||
image_lib.image.save(
|
||||
os.path.basename(partner.logo.name),
|
||||
ContentFile(f.read()),
|
||||
save=True,
|
||||
)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Migrated: {partner.name} logo")
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(
|
||||
f" - Failed to migrate: {partner.name} logo (file not found)"
|
||||
)
|
||||
)
|
||||
|
||||
def migrate_article_images(self, dry_run, force):
|
||||
"""
|
||||
Migrate article images to the image library.
|
||||
"""
|
||||
self.stdout.write("Migrating article images...")
|
||||
|
||||
articles = Article.objects.filter(image__isnull=False).exclude(image="")
|
||||
|
||||
for article in articles:
|
||||
if not article.image:
|
||||
continue
|
||||
|
||||
# Check if image already exists in library
|
||||
existing_image = ImageLibrary.objects.filter(
|
||||
name=f"{article.title} Image"
|
||||
).first()
|
||||
|
||||
if existing_image and not force:
|
||||
self.stdout.write(
|
||||
self.style.WARNING(
|
||||
f" - Skipping {article.title} image (already exists)"
|
||||
)
|
||||
)
|
||||
continue
|
||||
|
||||
if dry_run:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Would migrate: {article.title} image")
|
||||
)
|
||||
continue
|
||||
|
||||
# Create image library entry
|
||||
image_lib = ImageLibrary(
|
||||
name=f"{article.title} Image",
|
||||
slug=slugify(f"{article.title}-image"),
|
||||
description=f"Feature image for article: {article.title}",
|
||||
alt_text=f"{article.title} feature image",
|
||||
category="article",
|
||||
tags=f"article, {article.title.lower()}",
|
||||
)
|
||||
|
||||
# Copy the image file
|
||||
if article.image and os.path.exists(article.image.path):
|
||||
with open(article.image.path, "rb") as f:
|
||||
image_lib.image.save(
|
||||
os.path.basename(article.image.name),
|
||||
ContentFile(f.read()),
|
||||
save=True,
|
||||
)
|
||||
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(f" - Migrated: {article.title} image")
|
||||
)
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.ERROR(
|
||||
f" - Failed to migrate: {article.title} image (file not found)"
|
||||
)
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue