diff --git a/backend/api/management/commands/seed_legacy_flavors.py b/backend/api/management/commands/seed_legacy_flavors.py index 3b26d81..c083259 100644 --- a/backend/api/management/commands/seed_legacy_flavors.py +++ b/backend/api/management/commands/seed_legacy_flavors.py @@ -43,14 +43,16 @@ class Command(BaseCommand): return None def handle(self, *args, **options): - # Remove old legacy entries - Flavor.objects.filter(is_legacy=True).delete() - Flavor.objects.filter(external_id__isnull=True).delete() + # We no longer delete everything to preserve user data like ratings + # Instead, we update existing entries. - 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] + cat_map = { + '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], + 'milkshake': Category.objects.get_or_create(name='Milkshake', defaults={'slug': 'milkshake'})[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): @@ -61,10 +63,24 @@ class Command(BaseCommand): return json_files = [f for f in os.listdir(legacy_dir) if f.endswith('.json')] - created_count = 0 + processed_count = 0 for json_file in json_files: file_path = os.path.join(legacy_dir, json_file) + file_lower = json_file.lower() + + # Determine category from filename + if 'energy' in file_lower: + file_cat = cat_map['energy'] + elif 'iced_tea' in file_lower or 'iced-tea' in file_lower: + file_cat = cat_map['iced-tea'] + elif 'hydration' in file_lower: + file_cat = cat_map['hydration'] + elif 'milkshake' in file_lower: + file_cat = cat_map['milkshake'] + else: + file_cat = None + with open(file_path, 'r', encoding='utf-8') as f: data_list = json.load(f) @@ -77,23 +93,37 @@ class Command(BaseCommand): full_desc = f"**Geschmack:** {taste}\n\n{desc}\n\n**Status:** {status_text}" - 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 + # Determine final category + cat = file_cat + if not cat: + # Fallback to name/desc detection if filename was ambiguous + if "hydration" in name.lower() or "hydration" in desc.lower(): + cat = cat_map['hydration'] + elif "iced tea" in name.lower() or "eistee" in name.lower(): + cat = cat_map['iced-tea'] + elif "milkshake" in name.lower(): + cat = cat_map['milkshake'] + elif any(k in name.lower() for k in ['bundle', 'set', 'box', 'probe', 'sample', 'taster', 'shaker', 'starter']): + cat = cat_map['packs'] + else: + cat = cat_map['energy'] # Ultimate fallback - flavor = Flavor( - name=name, - category=cat, - description=full_desc, - image_url=image_url, - is_available=False, - is_legacy=True, - external_id=None - ) + # Try to find existing flavor by name and category + flavor = Flavor.objects.filter(name=name, category=cat, is_legacy=True).first() + + if not flavor: + flavor = Flavor( + name=name, + category=cat, + is_legacy=True, + external_id=None + ) + self.stdout.write(f"Adding new legacy flavor: {name}") + else: + self.stdout.write(f"Updating legacy flavor: {name}") + + flavor.description = full_desc + flavor.is_available = False # Legacy is always unavailable via API if image_url: # Check if local file exists @@ -103,13 +133,15 @@ class Command(BaseCommand): if os.path.exists(abs_path): file_exists = True - if not file_exists: + # Download if missing OR if image_url changed + if not file_exists or flavor.image_url != image_url: rel_path = self.download_image(image_url, name) if rel_path: flavor.image = rel_path + self.stdout.write(f" -> Updated image for: {name}") + flavor.image_url = image_url flavor.save() - created_count += 1 - self.stdout.write(f"Added legacy flavor: {name}") + processed_count += 1 - self.stdout.write(self.style.SUCCESS(f"Finished! Created {created_count} legacy flavors.")) + self.stdout.write(self.style.SUCCESS(f"Finished! Processed {processed_count} legacy flavors.")) diff --git a/backend/media/flavors/legacy_burrsday-bunny.png b/backend/media/flavors/legacy_burrsday-bunny.png new file mode 100644 index 0000000..37edbff Binary files /dev/null and b/backend/media/flavors/legacy_burrsday-bunny.png differ diff --git a/backend/media/flavors/legacy_caipirinha-crab.png b/backend/media/flavors/legacy_caipirinha-crab.png new file mode 100644 index 0000000..5650519 Binary files /dev/null and b/backend/media/flavors/legacy_caipirinha-crab.png differ diff --git a/backend/media/flavors/legacy_colada-capybara.png b/backend/media/flavors/legacy_colada-capybara.png new file mode 100644 index 0000000..89bf422 Binary files /dev/null and b/backend/media/flavors/legacy_colada-capybara.png differ diff --git a/backend/media/flavors/legacy_cotton-candy-caterpillar.png b/backend/media/flavors/legacy_cotton-candy-caterpillar.png new file mode 100644 index 0000000..a506394 Binary files /dev/null and b/backend/media/flavors/legacy_cotton-candy-caterpillar.png differ diff --git a/backend/media/flavors/legacy_dolphin-daiquiri.png b/backend/media/flavors/legacy_dolphin-daiquiri.png index 9adcf21..3270c4c 100644 Binary files a/backend/media/flavors/legacy_dolphin-daiquiri.png and b/backend/media/flavors/legacy_dolphin-daiquiri.png differ diff --git a/backend/media/flavors/legacy_double-apple-x-green-tea.png b/backend/media/flavors/legacy_double-apple-x-green-tea.png new file mode 100644 index 0000000..f1316ab Binary files /dev/null and b/backend/media/flavors/legacy_double-apple-x-green-tea.png differ diff --git a/backend/media/flavors/legacy_energy-eel.png b/backend/media/flavors/legacy_energy-eel.png new file mode 100644 index 0000000..6b6e053 Binary files /dev/null and b/backend/media/flavors/legacy_energy-eel.png differ diff --git a/backend/media/flavors/legacy_hitschies-saure-drachenzunge-blau.png b/backend/media/flavors/legacy_hitschies-saure-drachenzunge-blau.png index 83176ae..68583d7 100644 Binary files a/backend/media/flavors/legacy_hitschies-saure-drachenzunge-blau.png and b/backend/media/flavors/legacy_hitschies-saure-drachenzunge-blau.png differ diff --git a/backend/media/flavors/legacy_hitschies-saure-krakenarme.png b/backend/media/flavors/legacy_hitschies-saure-krakenarme.png index d71a1d8..544004b 100644 Binary files a/backend/media/flavors/legacy_hitschies-saure-krakenarme.png and b/backend/media/flavors/legacy_hitschies-saure-krakenarme.png differ diff --git a/backend/media/flavors/legacy_hitschies-saure-spinnenbeine.png b/backend/media/flavors/legacy_hitschies-saure-spinnenbeine.png index 336929c..96f04e9 100644 Binary files a/backend/media/flavors/legacy_hitschies-saure-spinnenbeine.png and b/backend/media/flavors/legacy_hitschies-saure-spinnenbeine.png differ diff --git a/backend/media/flavors/legacy_holy-xmas.png b/backend/media/flavors/legacy_holy-xmas.png new file mode 100644 index 0000000..585fb3b Binary files /dev/null and b/backend/media/flavors/legacy_holy-xmas.png differ diff --git a/backend/media/flavors/legacy_kola-koala.webp b/backend/media/flavors/legacy_kola-koala.webp new file mode 100644 index 0000000..14337ac Binary files /dev/null and b/backend/media/flavors/legacy_kola-koala.webp differ diff --git a/backend/media/flavors/legacy_mojito-macaw.png b/backend/media/flavors/legacy_mojito-macaw.png new file mode 100644 index 0000000..ec22763 Binary files /dev/null and b/backend/media/flavors/legacy_mojito-macaw.png differ diff --git a/backend/media/flavors/legacy_pineapple-x-green-tea.png b/backend/media/flavors/legacy_pineapple-x-green-tea.png new file mode 100644 index 0000000..704da3b Binary files /dev/null and b/backend/media/flavors/legacy_pineapple-x-green-tea.png differ diff --git a/backend/media/flavors/legacy_starfruit-x-hibiscus-tea.png b/backend/media/flavors/legacy_starfruit-x-hibiscus-tea.png new file mode 100644 index 0000000..fcf2b9a Binary files /dev/null and b/backend/media/flavors/legacy_starfruit-x-hibiscus-tea.png differ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 80ac82f..def8cc3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -347,8 +347,7 @@ const App: React.FC = () => { borderColor: 'divider', bgcolor: (theme) => alpha(theme.palette.background.paper, 0.8), backdropFilter: 'blur(12px)', - color: 'text.primary', - zIndex: (theme) => theme.zIndex.drawer + 1 + color: 'text.primary' }} > diff --git a/legacy/energy_flavors.json b/legacy/energy_flavors.json new file mode 100644 index 0000000..ba7d6ff --- /dev/null +++ b/legacy/energy_flavors.json @@ -0,0 +1,86 @@ +[ + { + "Name": "Dolphin Daiquiri", + "Geschmack": "Erdbeere & Limette", + "Beschreibung": "Ein sommerlicher Klassiker aus der alten Squad-Reihe. Nachempfunden dem Strawberry Daiquiri Cocktail (alkoholfrei). Eine süße Erdbeernote gemischt mit spritziger Limette.", + "Status": "Discontinued", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/daiquiri-dolphin/2f2be0d2eb-1770905032/ne-0032-01.png" + }, + { + "Name": "Hitschies Saure Drachenzunge (Blau)", + "Geschmack": "Blaue Himbeere", + "Beschreibung": "Der Klassiker der Kollaboration. Schmeckt wie die blauen sauren Drachenzungen – süß, fruchtig und sauer.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/blaue-drachenzungen/65d13502ae-1770905033/ne-0028-01.png" + }, + { + "Name": "Hitschies Saure Krakenarme", + "Geschmack": "Orange & Vanille", + "Beschreibung": "Cremige Vanille trifft auf saure Orange. Erinnert stark an die originalen Krakenarme-Süßigkeiten oder Solero-Eis.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/krakenarme/33e8c8649b-1770905036/ne-0030-01.png" + }, + { + "Name": "Hitschies Saure Spinnenbeine", + "Geschmack": "Cola & Zitrone", + "Beschreibung": "Saurer Cola-Geschmack, angelehnt an die Hitschies Spinnenbeine Fruchtgummis.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/spinnenbeine/a1c99108e8-1770905035/ne-0029-01.png" + }, + { + "Name": "HOLY Xmas", + "Geschmack": "Pflaume & Zimt", + "Beschreibung": "Eine winterliche Limited Edition, die nach Pflaume und Zimt schmeckt.", + "Status": "Vaulted / Seasonal", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/holy-xmas/f8b4f0e89b-1770905045/ne-0006.png" + }, + { + "Name": "Energy Eel", + "Geschmack": "Guarana (Klassischer Energy)", + "Beschreibung": "Der Versuch eines 'klassischen' Energy-Geschmacks, basierend auf Guarana.", + "Status": "Vaulted / Limited", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/energy-eel/f48f40b53f-1770905031/ne-0024-01.png" + }, + { + "Name": "Caipirinha Crab", + "Geschmack": "Limette & Rohrzucker", + "Beschreibung": "Ein alkoholfreier Cocktail-Geschmack, inspiriert vom Caipirinha.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/caipirinha-crab/966b1dba40-1770905032/ne-0031-01.png" + }, + { + "Name": "Mojito Macaw", + "Geschmack": "Limette & Minze", + "Beschreibung": "Erfrischender Mojito-Geschmack mit deutlicher Minznote.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/mojito-macaw/ef1c75b720-1770905032/ne-0033-01.png" + }, + { + "Name": "BURRsday Bunny", + "Geschmack": "Litschi", + "Beschreibung": "Jubiläums-Sorte (zum 3. oder 4. Geburtstag). Exotischer, süßer Litschi-Geschmack.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/burrsday-bunny/2cf46a3a93-1770905037/bunny_20tub.png" + }, + { + "Name": "Colada Capybara", + "Geschmack": "Ananas & Kokosnuss", + "Beschreibung": "Piña Colada Style. Cremige Kokosnuss trifft auf fruchtige Ananas.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/colada-capybara/ec02595c46-1770905037/capybara_20tub.png" + }, + { + "Name": "Cotton Candy Caterpillar", + "Geschmack": "Zuckerwatte", + "Beschreibung": "Sehr süßer Zuckerwatte-Geschmack. (Wurde kurz nach Release wegen eines Deklarationsfehlers bzgl. Vegan/Laktose zurückgerufen).", + "Status": "Recalled / Vaulted", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-energy/cotton-candy-caterpillar/dbe0df4759-1770905039/energy_20tub_20caterpillar.png" + }, + { + "Name": "Kola Koala", + "Geschmack": "Cola", + "Beschreibung": "Klassischer Cola-Geschmack, oft Teil des Adventskalenders.", + "Status": "Limited Edition", + "Bild_URL": "https://www.picclickimg.com/bBkAAeSw~hhphERE/Holy-Energy-Koala-Kola-Einzelprobe-selbst-abgef%C3%BCllt.webp" + } +] diff --git a/legacy/hitschies_flavors.json b/legacy/hitschies_flavors.json deleted file mode 100644 index 4509d08..0000000 --- a/legacy/hitschies_flavors.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "Name": "Hitschies Saure Drachenzunge (Blau)", - "Geschmack": "Blaue Himbeere", - "Beschreibung": "Der Klassiker der Kollaboration. Schmeckt wie die blauen sauren Drachenzungen – süß, fruchtig und sauer.", - "Status": "Limited Edition", - "Bild_URL": "https://pbs.twimg.com/media/GRfMeG3b0AAafs-?format=jpg&name=small" - }, - { - "Name": "Hitschies Saure Krakenarme", - "Geschmack": "Orange & Vanille", - "Beschreibung": "Cremige Vanille trifft auf saure Orange. Erinnert stark an die originalen Krakenarme-Süßigkeiten oder Solero-Eis.", - "Status": "Limited Edition", - "Bild_URL": "https://scontent-fra5-2.xx.fbcdn.net/v/t39.30808-6/481459525_933111892304551_6012720927773596920_n.jpg?stp=dst-jpg_s640x640_tt6&_nc_cat=106&ccb=1-7&_nc_sid=127cfc&_nc_ohc=Cdh-KooVUtAQ7kNvwG7p0fQ&_nc_oc=Adl2bJS36wdLnSlo6JGyNrshZYY59GMvEx1CKDuvj-K_Cc_fEBP1H-bNuGX1_B9DH8U&_nc_zt=23&_nc_ht=scontent-fra5-2.xx&_nc_gid=70krAfOzN_hAUKL6i9aY_Q&oh=00_Afsk9sfWUdcMSaepQWZufWTlg314EkrwAAIbQbJMcrrGQA&oe=6998B737" - }, - { - "Name": "Hitschies Saure Spinnenbeine", - "Geschmack": "Cola & Zitrone", - "Beschreibung": "Saurer Cola-Geschmack, angelehnt an die Hitschies Spinnenbeine Fruchtgummis.", - "Status": "Limited Edition", - "Bild_URL": "https://pbs.twimg.com/media/GRjfH6NWIAAB8lZ?format=jpg&name=small" - } -] diff --git a/legacy/iced_tea_flavors.json b/legacy/iced_tea_flavors.json new file mode 100644 index 0000000..8398862 --- /dev/null +++ b/legacy/iced_tea_flavors.json @@ -0,0 +1,25 @@ +[ + { + "Name": "Double Apple x Green Tea", + "Geschmack": "Apfel x Grüntee (Doppelapfel)", + "Beschreibung": "Schmeckt intensiv nach Doppelapfel (bekannt von Shisha-Tabak) auf Grüntee-Basis.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-iced-tea/double-apple-x-green-tea/4c843d9352-1770905057/ni-0004-01.png" + }, + { + "Name": "Pineapple x Green Tea", + "Edition": "SpongeBob Edition", + "Geschmack": "Ananas x Grüntee", + "Beschreibung": "Teil der SpongeBob-Kollaboration. Fruchtige Ananas trifft auf herben Grüntee.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-iced-tea/pineapple-x-green-tea/e045627974-1770905051/spongebob_20tub.png" + }, + { + "Name": "Starfruit x Hibiscus Tea", + "Edition": "Patrick Star Edition", + "Geschmack": "Sternfrucht x Hibiskustee", + "Beschreibung": "Teil der SpongeBob-Kollaboration (Patrick). Exotische Sternfrucht auf Hibiskus-Basis.", + "Status": "Limited Edition", + "Bild_URL": "https://ochdenis.de/media/pages/holy/sorten/holy-iced-tea/starfruit-x-hibiscus-tea/22b053bd70-1770905052/patrick_20tub.png" + } +] diff --git a/legacy/other_flavors.json b/legacy/other_flavors.json deleted file mode 100644 index 304b213..0000000 --- a/legacy/other_flavors.json +++ /dev/null @@ -1,9 +0,0 @@ -[ - { - "Name": "Dolphin Daiquiri", - "Geschmack": "Erdbeere & Limette", - "Beschreibung": "Ein sommerlicher Klassiker aus der alten Squad-Reihe. Nachempfunden dem Strawberry Daiquiri Cocktail (alkoholfrei). Eine süße Erdbeernote gemischt mit spritziger Limette.", - "Status": "Discontinued", - "Bild_URL": "https://pbs.twimg.com/media/GOq80SWXAAEnLGG?format=jpg&name=large" - } -]