Files
thrillwiki_django_no_react/parks/management/commands/seed_data.py
2024-11-01 01:27:11 +00:00

286 lines
11 KiB
Python

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')