import json import os from django.core.management.base import BaseCommand from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.core.files.temp import NamedTemporaryFile from django.core.files import File import requests from parks.models import Park from rides.models import Ride, RollerCoasterStats from companies.models import Company, Manufacturer from reviews.models import Review from media.models import Photo from cities_light.models import Country, Region, City from django.contrib.auth.models import Permission import random from datetime import datetime, timedelta User = get_user_model() class Command(BaseCommand): help = 'Seeds the database with initial data' def handle(self, *args, **kwargs): self.stdout.write('Starting database seed...') # Create users and set permissions self.create_users() self.setup_permissions() # Create parks and rides self.stdout.write('Creating parks and rides from seed data...') self.create_companies() self.create_manufacturers() self.create_parks_and_rides() # Create reviews self.stdout.write('Creating reviews...') self.create_reviews() # Create top lists self.stdout.write('Creating top lists...') self.create_top_lists() self.stdout.write('Successfully seeded database') def setup_permissions(self): """Set up photo permissions for all users""" self.stdout.write('Setting up photo permissions...') # Get photo permissions photo_content_type = ContentType.objects.get_for_model(Photo) photo_permissions = Permission.objects.filter(content_type=photo_content_type) # Update all users users = User.objects.all() for user in users: for perm in photo_permissions: user.user_permissions.add(perm) user.save() self.stdout.write(f'Updated permissions for user: {user.username}') def create_users(self): self.stdout.write('Creating users...') # Try to get admin user try: admin = User.objects.get(username='admin') self.stdout.write('Admin user exists, updating permissions...') except User.DoesNotExist: admin = User.objects.create_superuser('admin', 'admin@example.com', 'admin') self.stdout.write('Created admin user') # Create regular users usernames = [ 'destiny89', 'destiny97', 'thompsonchris', 'chriscohen', 'littlesharon', 'wrichardson', 'christophermiles', 'jacksonangela', 'jennifer71', 'smithemily', 'brandylong', 'milleranna', 'tlopez', 'fgriffith', 'mariah80', 'kendradavis', 'rosarioashley', 'camposkaitlyn', 'lisaherrera', 'riveratiffany', 'codytucker', 'cheyenne78', 'christinagreen', 'eric57', 'steinsuzanne', 'david95', 'rstewart', 'josephhaynes', 'umedina', 'tylerbryant', 'lcampos', 'shellyford', 'ksmith', 'qeverett', 'waguilar', 'zbrowning', 'yalexander', 'wallacewilliam', 'bsuarez', 'ismith', 'joyceosborne', 'garythomas', 'tlewis', 'robertgonzales', 'medinashannon', 'yhanson', 'howellmorgan', 'taylorsusan', 'barnold', 'bryan20' ] for username in usernames: if not User.objects.filter(username=username).exists(): User.objects.create_user( username=username, email=f'{username}@example.com', password='password123' ) self.stdout.write(f'Created user: {username}') def create_companies(self): self.stdout.write('Creating companies...') # Delete existing companies Company.objects.all().delete() self.stdout.write('Deleted existing companies') companies = [ 'The Walt Disney Company', 'Cedar Fair', 'NBCUniversal', 'Merlin Entertainments', 'Mack Rides' ] for name in companies: Company.objects.create(name=name) self.stdout.write(f'Created company: {name}') def create_manufacturers(self): self.stdout.write('Creating manufacturers...') # Delete existing manufacturers Manufacturer.objects.all().delete() self.stdout.write('Deleted existing manufacturers') manufacturers = [ 'Walt Disney Imagineering', 'Bolliger & Mabillard', 'Intamin', 'Rocky Mountain Construction', 'Vekoma', 'Mack Rides', 'Oceaneering International' ] for name in manufacturers: Manufacturer.objects.create(name=name) self.stdout.write(f'Created manufacturer: {name}') def download_image(self, url): """Download image from URL and return as Django File object""" response = requests.get(url) if response.status_code == 200: img_temp = NamedTemporaryFile(delete=True) img_temp.write(response.content) img_temp.flush() return File(img_temp) return None def create_parks_and_rides(self): # Delete existing parks and rides Park.objects.all().delete() self.stdout.write('Deleted existing parks and rides') # Load seed data with open(os.path.join(os.path.dirname(__file__), 'seed_data.json')) as f: data = json.load(f) country_map = { 'US': 'United States', 'GB': 'United Kingdom', 'DE': 'Germany' } for park_data in data['parks']: try: country = Country.objects.get(code2=park_data['country']) # Create park park = Park.objects.create( name=park_data['name'], country=country, opening_date=park_data['opening_date'], status=park_data['status'], description=park_data['description'], website=park_data['website'], owner=Company.objects.get(name=park_data['owner']), size_acres=park_data['size_acres'] ) # Add park photos for photo_url in park_data['photos']: img_file = self.download_image(photo_url) if img_file: Photo.objects.create( image=img_file, content_type=ContentType.objects.get_for_model(park), object_id=park.id, is_primary=True # First photo is primary ) # Create rides for ride_data in park_data['rides']: ride = Ride.objects.create( name=ride_data['name'], park=park, category=ride_data['category'], opening_date=ride_data['opening_date'], status=ride_data['status'], manufacturer=Manufacturer.objects.get(name=ride_data['manufacturer']), description=ride_data['description'] ) # Add ride photos for photo_url in ride_data['photos']: img_file = self.download_image(photo_url) if img_file: Photo.objects.create( image=img_file, content_type=ContentType.objects.get_for_model(ride), object_id=ride.id, is_primary=True # First photo is primary ) # Add coaster stats if present if 'stats' in ride_data: RollerCoasterStats.objects.create( ride=ride, height_ft=ride_data['stats']['height_ft'], length_ft=ride_data['stats']['length_ft'], speed_mph=ride_data['stats']['speed_mph'], inversions=ride_data['stats']['inversions'], ride_time_seconds=ride_data['stats']['ride_time_seconds'] ) self.stdout.write(f'Created park and rides: {park.name}') except Country.DoesNotExist: self.stdout.write(f'Country not found: {park_data["country"]}') continue def create_reviews(self): # Delete existing reviews Review.objects.all().delete() self.stdout.write('Deleted existing reviews') users = list(User.objects.exclude(username='admin')) parks = list(Park.objects.all()) # Generate random dates within the last year today = datetime.now().date() one_year_ago = today - timedelta(days=365) for park in parks: # Create 3-5 reviews per park num_reviews = random.randint(3, 5) for _ in range(num_reviews): # Generate random visit date days_offset = random.randint(0, 365) visit_date = one_year_ago + timedelta(days=days_offset) Review.objects.create( user=random.choice(users), content_type=ContentType.objects.get_for_model(park), object_id=park.id, title=f'Great experience at {park.name}', content='Lorem ipsum dolor sit amet, consectetur adipiscing elit.', rating=random.randint(7, 10), visit_date=visit_date ) self.stdout.write(f'Created reviews for {park.name}') def create_top_lists(self): # Delete existing top lists # TopList.objects.all().delete() self.stdout.write('Deleted existing top lists') users = list(User.objects.exclude(username='admin')) parks = list(Park.objects.all()) for i, user in enumerate(users, 1): # Create top list for every 10th user if i % 10 == 0: # top_list = TopList.objects.create( # user=user, # name=f"{user.username}'s Top Parks", # description='My favorite theme parks' # ) # Add 3-5 random parks # selected_parks = random.sample(parks, random.randint(3, 5)) # for j, park in enumerate(selected_parks, 1): # TopListItem.objects.create( # top_list=top_list, # content_type=ContentType.objects.get_for_model(park), # object_id=park.id, # rank=j # ) self.stdout.write(f'Created top lists for {i}/50 users')