from io import BytesIO from django.core.files.base import ContentFile from django.core.management.base import BaseCommand from PIL import Image as PillowImage from wagtail.images import get_image_model from wagtail.models import Page, Site from home.models import GalleryItem, HomePage, LessonInfo, Show, SiteSettings, TeacherProfile class Command(BaseCommand): help = "Create or refresh the Italian demo content without creating duplicates." def placeholder(self, title: str, filename: str, color: str): image_model = get_image_model() existing = image_model.objects.filter(title=title).first() if existing: return existing output = BytesIO() PillowImage.new("RGB", (1200, 800), color=color).save( output, format="JPEG", quality=85, ) return image_model.objects.create( title=title, file=ContentFile(output.getvalue(), name=filename), ) def handle(self, *args, **options): hero_image = self.placeholder("Prova in sala", "demo-hero.jpg", "#D8C7AE") laboratory_image = self.placeholder( "Esercizio di gruppo", "demo-laboratory.jpg", "#A9A497" ) teacher_image = self.placeholder("Il maestro", "demo-teacher.jpg", "#B8674C") show_image = self.placeholder("Locandina Tracce", "demo-show.jpg", "#515D53") second_show_image = self.placeholder( "Locandina Sottovoce", "demo-show-sottovoce.jpg", "#B8674C" ) gallery_images = [ self.placeholder("Lezione", "demo-gallery-lesson.jpg", "#D8C7AE"), self.placeholder("Backstage", "demo-gallery-backstage.jpg", "#A4513B"), self.placeholder("In scena", "demo-gallery-show.jpg", "#515D53"), self.placeholder("Il gruppo", "demo-gallery-group.jpg", "#4A433A"), ] homepage = HomePage.objects.first() if homepage is None: homepage = HomePage( title="Home", slug="laboratorio", hero_title="Il teatro diventa presenza.", hero_subtitle=( "Un laboratorio dove corpo, voce, ascolto e relazione " "diventano scena." ), ) Page.get_first_root_node().add_child(instance=homepage) homepage.hero_title = "Il teatro diventa presenza." homepage.hero_subtitle = ( "Un laboratorio dove corpo, voce, ascolto e relazione diventano scena." ) homepage.hero_image = hero_image homepage.intro_title = "Uno spazio per esserci davvero" homepage.intro_body = ( "

Ogni incontro è uno spazio di pratica: si prova, si sbaglia, " "si ascolta, si ricomincia. Il gruppo diventa materia viva, la scena " "diventa occasione di scoperta.

" ) homepage.cta_primary_label = "Vieni a conoscerci" homepage.cta_primary_url = "#contatti" homepage.cta_secondary_label = "Guarda la galleria" homepage.cta_secondary_url = "#galleria" homepage.laboratory_title = "Il laboratorio" homepage.laboratory_body = ( "

Corpo, voce e improvvisazione sono strumenti per allenare " "l'ascolto, la relazione e una presenza scenica autentica.

" ) homepage.laboratory_image = laboratory_image homepage.save_revision().publish() homepage.feature_cards.all().delete() cards = [ ( "Per chi inizia", "Non serve esperienza: servono curiosità e voglia di mettersi in gioco.", ), ( "Per chi vuole crescere", "Una pratica costante per conoscere meglio corpo, voce e presenza.", ), ( "Per chi ama il gruppo", "La scena nasce dall'ascolto e dalla fiducia costruita insieme.", ), ] for order, (title, text) in enumerate(cards): homepage.feature_cards.create(title=title, text=text, sort_order=order) homepage.save_revision().publish() site = Site.objects.filter(is_default_site=True).first() if site is None: site = Site.objects.create( hostname="localhost", port=8000, site_name="Azione!Lab", root_page=homepage, is_default_site=True, ) else: update_fields = [] if site.root_page_id != homepage.id: site.root_page = homepage update_fields.append("root_page") if site.site_name != "Azione!Lab": site.site_name = "Azione!Lab" update_fields.append("site_name") if update_fields: site.save(update_fields=update_fields) settings, _ = SiteSettings.objects.get_or_create(site=site) settings.laboratory_name = "Azione!Lab" settings.short_claim = "Il teatro diventa presenza." settings.email = "ciao@laboratorioteatrale.it" settings.phone = "+39 333 123 4567" settings.whatsapp = "+39 333 123 4567" settings.instagram = "https://www.instagram.com/" settings.facebook = "https://www.facebook.com/" settings.address = "Via dell'Epomeo 9999, Napoli" settings.footer_text = "Uno spazio di ricerca, ascolto e presenza." settings.save() teacher = TeacherProfile.objects.order_by("id").first() or TeacherProfile() teacher.name = "Ernesto Estatico" teacher.photo = teacher_image teacher.short_bio = ( "Attore, regista e formatore. Accompagna gruppi e persone " "nella ricerca di una presenza scenica sincera." ) teacher.full_bio = ( "

Da oltre quindici anni lavora tra formazione, creazione " "collettiva e spettacolo dal vivo.

" ) teacher.quote = "Il teatro non è fingere: è imparare a essere presenti." teacher.save() LessonInfo.objects.update_or_create( day_time="Ogni mercoledì, 19:30–22:00", defaults={ "location": "Spazio Teatro, Via dell'Epomeo 9999, Napoli", "audience": "Adulti, con o senza esperienza precedente.", "description": ( "

Training fisico e vocale, improvvisazione, ascolto, " "composizione e lavoro sulla scena.

" ), "trial_lesson": "La prima lezione di prova è gratuita su prenotazione.", "notes": "Abbigliamento comodo consigliato.", }, ) Show.objects.update_or_create( title="Tracce", year=2025, defaults={ "short_description": ( "Un lavoro corale sulle storie che lasciamo e che ci attraversano." ), "description": ( "

Esito scenico nato dalle improvvisazioni e dalle scritture " "del gruppo.

" ), "poster": show_image, "location": "Teatro di Quartiere", "cast": "Allieve e allievi del laboratorio", "order": 0, "visible_on_home": True, }, ) Show.objects.update_or_create( title="Sottovoce", year=2024, defaults={ "short_description": ( "Un attraversamento delicato delle parole che restano inascoltate." ), "description": ( "

Un progetto costruito attraverso voce, silenzio e movimento.

" ), "poster": second_show_image, "location": "Spazio Teatro", "cast": "Laboratorio annuale", "order": 1, "visible_on_home": True, }, ) gallery_entries = [ (GalleryItem.Category.LESSONS, "Ascolto e movimento"), (GalleryItem.Category.BACKSTAGE, "Prima dello spettacolo"), (GalleryItem.Category.SHOWS, "Una scena di Tracce"), (GalleryItem.Category.GROUP, "Il laboratorio, insieme"), ] for order, (image, (category, caption)) in enumerate( zip(gallery_images, gallery_entries, strict=True) ): GalleryItem.objects.update_or_create( image=image, defaults={ "category": category, "caption": caption, "order": order, "visible_on_home": True, }, ) self.stdout.write(self.style.SUCCESS("Demo content is ready."))