LinkDesk/backend/create_example_data.py

320 lines
11 KiB
Python

#!/usr/bin/env python3
"""
Script to create comprehensive example data for the VFX project management system.
This includes episodes, assets, and project members for the Dragon Quest project.
"""
import sqlite3
import json
from datetime import date, datetime
from pathlib import Path
def get_database_path():
"""Get the database path."""
possible_paths = [
"vfx_project_management.db",
"database.db"
]
for path in possible_paths:
if Path(path).exists():
return path
return "vfx_project_management.db"
def create_example_episodes(cursor, project_id):
"""Create example episodes for the project."""
episodes_data = [
{
"name": "The Dragon's Awakening",
"episode_number": 1,
"description": "Opening sequence where the ancient dragon awakens from its thousand-year slumber. Features extensive particle effects, environmental destruction, and creature animation.",
"status": "in_progress"
},
{
"name": "The Quest Begins",
"episode_number": 2,
"description": "Heroes embark on their journey through magical forests and mystical landscapes. Requires complex environment work and magical effect sequences.",
"status": "planning"
},
{
"name": "Battle of the Crystal Caves",
"episode_number": 3,
"description": "Epic battle sequence in underground crystal caves with magical creatures. Heavy focus on lighting effects, crystal simulations, and creature interactions.",
"status": "planning"
},
{
"name": "The Final Confrontation",
"episode_number": 4,
"description": "Climactic battle between heroes and the dragon. Most VFX-intensive episode featuring fire effects, destruction, magical spells, and complex creature animation.",
"status": "planning"
}
]
episode_ids = []
current_time = datetime.now().isoformat()
for episode_data in episodes_data:
# Check if episode already exists
cursor.execute("""
SELECT id FROM episodes
WHERE project_id = ? AND episode_number = ?
""", (project_id, episode_data["episode_number"]))
existing_episode = cursor.fetchone()
if existing_episode:
episode_ids.append(existing_episode[0])
continue
insert_query = """
INSERT INTO episodes (
project_id, name, episode_number, description, status,
created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, ?)
"""
cursor.execute(insert_query, (
project_id,
episode_data["name"],
episode_data["episode_number"],
episode_data["description"],
episode_data["status"],
current_time,
current_time
))
episode_ids.append(cursor.lastrowid)
return episode_ids
def create_example_assets(cursor, project_id):
"""Create example assets for the project."""
assets_data = [
{
"name": "Ancient Dragon",
"category": "characters",
"description": "Main antagonist dragon character with detailed scales, wings, and fire-breathing capabilities. Requires complex rigging and animation systems.",
"status": "in_progress"
},
{
"name": "Hero Character - Warrior",
"category": "characters",
"description": "Main protagonist warrior character with armor, weapons, and facial animation capabilities.",
"status": "completed"
},
{
"name": "Hero Character - Mage",
"category": "characters",
"description": "Magical character with spell-casting animations and mystical effects integration.",
"status": "in_progress"
},
{
"name": "Crystal Cave Environment",
"category": "sets",
"description": "Underground cave system with glowing crystals, stalactites, and magical lighting effects.",
"status": "in_progress"
},
{
"name": "Enchanted Forest",
"category": "sets",
"description": "Magical forest environment with animated trees, floating particles, and dynamic lighting.",
"status": "not_started"
},
{
"name": "Dragon's Lair",
"category": "sets",
"description": "Massive cave environment where the dragon resides, featuring treasure piles and ancient architecture.",
"status": "not_started"
},
{
"name": "Excalibur Sword",
"category": "props",
"description": "Legendary sword with magical glow effects and particle systems.",
"status": "approved"
},
{
"name": "Magic Staff",
"category": "props",
"description": "Mage's staff with crystal orb and magical energy effects.",
"status": "in_progress"
},
{
"name": "Dragon Armor Set",
"category": "props",
"description": "Protective armor made from dragon scales with metallic and organic textures.",
"status": "not_started"
},
{
"name": "Dragon Wings",
"category": "props",
"description": "Detailed dragon wing assets for close-up shots and animation reference.",
"status": "in_progress"
},
{
"name": "Flying Carpet",
"category": "vehicles",
"description": "Magical flying carpet for transportation sequences with cloth simulation.",
"status": "completed"
},
{
"name": "War Chariot",
"category": "vehicles",
"description": "Battle chariot for epic combat sequences with destruction capabilities.",
"status": "not_started"
}
]
asset_ids = []
current_time = datetime.now().isoformat()
for asset_data in assets_data:
# Check if asset already exists
cursor.execute("""
SELECT id FROM assets
WHERE project_id = ? AND name = ?
""", (project_id, asset_data["name"]))
existing_asset = cursor.fetchone()
if existing_asset:
asset_ids.append(existing_asset[0])
continue
insert_query = """
INSERT INTO assets (
project_id, name, category, description, status,
created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, ?)
"""
cursor.execute(insert_query, (
project_id,
asset_data["name"],
asset_data["category"],
asset_data["description"],
asset_data["status"],
current_time,
current_time
))
asset_ids.append(cursor.lastrowid)
return asset_ids
def create_example_data():
"""Create comprehensive example data for the VFX project."""
print("Creating Example VFX Project Data")
print("=" * 40)
db_path = get_database_path()
print(f"Using database: {db_path}")
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# Get the Dragon Quest project ID
cursor.execute("SELECT id FROM projects WHERE code_name = 'DRAGON_QUEST_2024'")
project_result = cursor.fetchone()
if not project_result:
print("❌ Dragon Quest project not found. Please run create_example_project.py first.")
return False
project_id = project_result[0]
print(f"✅ Found Dragon Quest project (ID: {project_id})")
# Create episodes
print("\n📺 Creating example episodes...")
episode_ids = create_example_episodes(cursor, project_id)
print(f"✅ Created/found {len(episode_ids)} episodes")
# Create assets
print("\n🎨 Creating example assets...")
asset_ids = create_example_assets(cursor, project_id)
print(f"✅ Created/found {len(asset_ids)} assets")
# Commit all changes
conn.commit()
# Show summary
print(f"\n📊 Summary:")
print(f" Project: Dragon Quest: The Awakening")
print(f" Episodes: {len(episode_ids)}")
print(f" Assets: {len(asset_ids)}")
# Show episode breakdown
cursor.execute("""
SELECT name, episode_number, status
FROM episodes
WHERE project_id = ?
ORDER BY episode_number
""", (project_id,))
episodes = cursor.fetchall()
print(f"\n📺 Episodes:")
for episode in episodes:
status_emoji = {"not_started": "", "planning": "📋", "in_progress": "🎬", "completed": ""}
print(f" {status_emoji.get(episode[2], '')} Episode {episode[1]}: {episode[0]} ({episode[2].replace('_', ' ').title()})")
# Show asset breakdown by category
cursor.execute("""
SELECT category, COUNT(*) as count
FROM assets
WHERE project_id = ?
GROUP BY category
ORDER BY count DESC
""", (project_id,))
asset_categories = cursor.fetchall()
print(f"\n🎨 Assets by Category:")
category_emojis = {"characters": "👤", "sets": "🌍", "props": "⚔️", "vehicles": "🚗"}
for category, count in asset_categories:
emoji = category_emojis.get(category, "📦")
print(f" {emoji} {category.title()}: {count}")
# Show asset status breakdown
cursor.execute("""
SELECT status, COUNT(*) as count
FROM assets
WHERE project_id = ?
GROUP BY status
ORDER BY count DESC
""", (project_id,))
asset_statuses = cursor.fetchall()
print(f"\n📈 Asset Status:")
status_emojis = {"not_started": "", "planning": "📋", "in_progress": "🎬", "completed": ""}
for status, count in asset_statuses:
emoji = status_emojis.get(status, "")
print(f" {emoji} {status.replace('_', ' ').title()}: {count}")
return True
except sqlite3.Error as e:
print(f"❌ Database error: {e}")
if conn:
conn.rollback()
return False
except Exception as e:
print(f"❌ Unexpected error: {e}")
if conn:
conn.rollback()
return False
finally:
if conn:
conn.close()
if __name__ == "__main__":
print("VFX Project Management - Example Data Creator")
print("=" * 50)
success = create_example_data()
if success:
print("\n🎬 Example data created successfully!")
print("The Dragon Quest project now has realistic episodes and assets for testing.")
else:
print("\n❌ Failed to create example data.")