mirror of
https://github.com/narrrl/holy-flavor-rater.git
synced 2026-11-03 16:41:27 +01:00
96 lines
4.1 KiB
Python
96 lines
4.1 KiB
Python
import json
|
|
import os
|
|
import urllib.request
|
|
from django.core.management.base import BaseCommand
|
|
from django.core.files import File
|
|
from tempfile import NamedTemporaryFile
|
|
from django.conf import settings
|
|
from api.models import Category, Flavor
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Adds legacy flavors from JSON files in the legacy/ folder'
|
|
|
|
def download_image(self, url, flavor_name):
|
|
if not url:
|
|
return None
|
|
try:
|
|
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
|
|
with urllib.request.urlopen(req) as response:
|
|
img_temp = NamedTemporaryFile(delete=True)
|
|
img_temp.write(response.read())
|
|
img_temp.flush()
|
|
|
|
ext = url.split('.')[-1].split('?')[0]
|
|
if len(ext) > 4: ext = 'png'
|
|
filename = f"legacy_{flavor_name.replace(' ', '_').lower()}.{ext}"
|
|
return File(img_temp, name=filename)
|
|
except Exception as e:
|
|
self.stdout.write(self.style.WARNING(f"Could not download image for {flavor_name}: {e}"))
|
|
return None
|
|
|
|
def handle(self, *args, **options):
|
|
# 1. Remove old legacy flavors (ones without external_id or marked as legacy)
|
|
# To be safe, we only remove those marked as legacy or with no external_id
|
|
removed_count, _ = Flavor.objects.filter(is_legacy=True).delete()
|
|
Flavor.objects.filter(external_id__isnull=True).delete()
|
|
self.stdout.write(self.style.SUCCESS(f"Removed {removed_count} old legacy flavors."))
|
|
|
|
# Ensure main categories exist
|
|
energy = Category.objects.get_or_create(name='Energy', defaults={'slug': 'energy'})[0]
|
|
hydration = Category.objects.get_or_create(name='Hydration', defaults={'slug': 'hydration'})[0]
|
|
iced_tea = Category.objects.get_or_create(name='Iced Tea', defaults={'slug': 'iced-tea'})[0]
|
|
packs = Category.objects.get_or_create(name='Packs and other', defaults={'slug': 'packs-and-other'})[0]
|
|
|
|
legacy_dir = os.path.join(settings.BASE_DIR, '..', 'legacy')
|
|
if not os.path.exists(legacy_dir):
|
|
self.stdout.write(self.style.ERROR(f"Legacy directory not found at {legacy_dir}"))
|
|
return
|
|
|
|
json_files = [f for f in os.listdir(legacy_dir) if f.endswith('.json')]
|
|
|
|
created_count = 0
|
|
|
|
for json_file in json_files:
|
|
file_path = os.path.join(legacy_dir, json_file)
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
data_list = json.load(f)
|
|
|
|
for data in data_list:
|
|
name = data.get('Name')
|
|
desc = data.get('Beschreibung')
|
|
taste = data.get('Geschmack')
|
|
status_text = data.get('Status')
|
|
image_url = data.get('Bild_URL')
|
|
|
|
full_desc = f"**Geschmack:** {taste}\n\n{desc}\n\n**Status:** {status_text}"
|
|
|
|
# Determine category
|
|
cat = energy
|
|
if "hydration" in name.lower() or "hydration" in desc.lower():
|
|
cat = hydration
|
|
elif "iced tea" in name.lower() or "eistee" in name.lower():
|
|
cat = iced_tea
|
|
elif any(k in name.lower() for k in ['bundle', 'set', 'box', 'probe', 'sample', 'taster', 'shaker', 'starter']):
|
|
cat = packs
|
|
|
|
flavor = Flavor(
|
|
name=name,
|
|
category=cat,
|
|
description=full_desc,
|
|
image_url=image_url,
|
|
is_available=False,
|
|
is_legacy=True,
|
|
external_id=None
|
|
)
|
|
|
|
if image_url:
|
|
img_file = self.download_image(image_url, name)
|
|
if img_file:
|
|
flavor.image.save(img_file.name, img_file, save=False)
|
|
|
|
flavor.save()
|
|
created_count += 1
|
|
self.stdout.write(f"Added legacy flavor: {name}")
|
|
|
|
self.stdout.write(self.style.SUCCESS(f"Finished! Created {created_count} legacy flavors from JSON."))
|