import random from datetime import time, timedelta from django.core.management.base import BaseCommand from django.utils import timezone from core.models import ( AppUser, Library, Genre, ContentRating, MediaSource, Series, MediaItem, Channel, ScheduleTemplate, ScheduleBlock, Airing ) class Command(BaseCommand): help = 'Seeds the database with mock PYTV data including users, libraries, media, and channels.' def handle(self, *args, **kwargs): self.stdout.write("Flushing existing data...") # Since we cascade everything, deleting users usually drops almost everything AppUser.objects.filter(username__startswith='mock_').delete() Genre.objects.all().delete() ContentRating.objects.all().delete() self.stdout.write("Seeding Users...") admin_user = AppUser.objects.create_superuser('mock_admin', 'admin@pytv.local', 'admin') viewer_user = AppUser.objects.create_user('mock_viewer', 'viewer@pytv.local', 'password') self.stdout.write("Seeding Genres & Ratings...") g_action = Genre.objects.create(name="Action") g_comedy = Genre.objects.create(name="Comedy") g_drama = Genre.objects.create(name="Drama") g_scifi = Genre.objects.create(name="Sci-Fi") g_promo = Genre.objects.create(name="Promo/Bumper") r_pg = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-PG", min_age=8) r_14 = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-14", min_age=14) r_ma = ContentRating.objects.create(system_name="TV Parental Guidelines", code="TV-MA", min_age=17) self.stdout.write("Seeding Library & Media Sources...") lib = Library.objects.create( owner_user=admin_user, name="Main Broadcasting Library", visibility="public", description="The core streaming library for PYTV mock." ) source_movies = MediaSource.objects.create( library=lib, name="Mocked Local Movies", source_type="local_directory", uri="/mock/movies" ) source_tv = MediaSource.objects.create( library=lib, name="Mocked Local TV Shows", source_type="local_directory", uri="/mock/tv" ) source_bumpers = MediaSource.objects.create( library=lib, name="Network Bumpers", source_type="local_directory", uri="/mock/bumpers" ) self.stdout.write("Seeding Series & Media Items...") # Movies m1 = MediaItem.objects.create( media_source=source_movies, title="Space Rangers 3000", item_kind="movie", release_year=1999, runtime_seconds=5400, # 1.5 hours file_path="/mock/movies/space_rangers.mp4", content_rating=r_pg ) m1.genres.add(g_action, g_scifi) m2 = MediaItem.objects.create( media_source=source_movies, title="The Laughing Policeman", item_kind="movie", release_year=2005, runtime_seconds=6300, # 1.75 hours file_path="/mock/movies/laughing_policeman.mp4", content_rating=r_14 ) m2.genres.add(g_comedy, g_action) # Series s1 = Series.objects.create(title="Neon City Nights", description="Cyberpunk detective drama.", release_year=2024) for ep in range(1, 6): ep_item = MediaItem.objects.create( media_source=source_tv, series=s1, title=f"Episode {ep}", item_kind="episode", season_number=1, episode_number=ep, runtime_seconds=2700, # 45 mins file_path=f"/mock/tv/neon_city_nights/s01e0{ep}.mkv", content_rating=r_ma ) ep_item.genres.add(g_drama, g_scifi) # Bumpers for b in range(1, 4): bump = MediaItem.objects.create( media_source=source_bumpers, title=f"Station Bumper {b}", item_kind="bumper", runtime_seconds=15, file_path=f"/mock/bumpers/ident_{b}.mp4" ) bump.genres.add(g_promo) self.stdout.write("Seeding Channels and Scheduling Blocks...") ch1 = Channel.objects.create( owner_user=admin_user, library=lib, name="PYTV One", slug="pytv-1", channel_number=1, description="The flagship generic network.", scheduling_mode="template_driven", visibility="public" ) template = ScheduleTemplate.objects.create( channel=ch1, name="Standard Weekday", timezone_name="UTC", priority=10 ) # Prime time block b_prime = ScheduleBlock.objects.create( schedule_template=template, name="Prime Time Drama", block_type="programming", start_local_time=time(20, 0), end_local_time=time(23, 0), day_of_week_mask=127, # Everyday default_genre=g_drama, rotation_strategy="sequential", pad_strategy="fill_with_interstitials" ) ch2 = Channel.objects.create( owner_user=admin_user, library=lib, name="Tears of Steel Channel", slug="tears-of-steel", channel_number=2, description="All Sci-Fi all the time.", scheduling_mode="template_driven", visibility="public" ) template2 = ScheduleTemplate.objects.create( channel=ch2, name="Sci-Fi Everyday", timezone_name="UTC", priority=10 ) ScheduleBlock.objects.create( schedule_template=template2, name="Sci-Fi Block", block_type="programming", start_local_time=time(0, 0), end_local_time=time(23, 59, 59), day_of_week_mask=127, default_genre=g_scifi, rotation_strategy="random", pad_strategy="none" ) ch3 = Channel.objects.create( owner_user=admin_user, library=lib, name="Sintel Classics", slug="sintel-classics", channel_number=3, description="Classic movies and animation.", scheduling_mode="template_driven", visibility="public" ) template3 = ScheduleTemplate.objects.create( channel=ch3, name="Comedy and Action", timezone_name="UTC", priority=10 ) ScheduleBlock.objects.create( schedule_template=template3, name="Action Comedy", block_type="programming", start_local_time=time(0, 0), end_local_time=time(23, 59, 59), day_of_week_mask=127, default_genre=g_action, rotation_strategy="random", pad_strategy="none" ) self.stdout.write(self.style.SUCCESS("Successfully seeded the PYTV database with mock data."))