mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 05:51:08 -05:00
286 lines
11 KiB
Python
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')
|