#!/usr/bin/env python3 """ Migration script to add new fields to the projects table: - code_name: Unique project code identifier - client_name: Client or studio name - project_type: TV, Cinema, or Game """ import sqlite3 import sys from pathlib import Path def migrate_project_fields(): """Add new fields to the projects table""" # Database path db_path = Path("vfx_project_management.db") if not db_path.exists(): print("Database file not found. Creating new database with updated schema.") return True try: # Connect to database conn = sqlite3.connect(db_path) cursor = conn.cursor() # Check if new columns already exist cursor.execute("PRAGMA table_info(projects)") columns = [column[1] for column in cursor.fetchall()] new_columns_needed = [] if 'code_name' not in columns: new_columns_needed.append('code_name') if 'client_name' not in columns: new_columns_needed.append('client_name') if 'project_type' not in columns: new_columns_needed.append('project_type') if not new_columns_needed: print("All new columns already exist. No migration needed.") return True print(f"Adding columns: {', '.join(new_columns_needed)}") # Add new columns if 'code_name' in new_columns_needed: cursor.execute("ALTER TABLE projects ADD COLUMN code_name VARCHAR") print("Added code_name column") if 'client_name' in new_columns_needed: cursor.execute("ALTER TABLE projects ADD COLUMN client_name VARCHAR") print("Added client_name column") if 'project_type' in new_columns_needed: cursor.execute("ALTER TABLE projects ADD COLUMN project_type VARCHAR") print("Added project_type column") # Update existing projects with default values cursor.execute("SELECT id, name FROM projects WHERE code_name IS NULL OR client_name IS NULL OR project_type IS NULL") existing_projects = cursor.fetchall() for project_id, project_name in existing_projects: # Generate default code_name from project name code_name = project_name.upper().replace(' ', '_')[:10] + f"_{project_id:03d}" cursor.execute(""" UPDATE projects SET code_name = COALESCE(code_name, ?), client_name = COALESCE(client_name, 'Default Client'), project_type = COALESCE(project_type, 'tv') WHERE id = ? """, (code_name, project_id)) print(f"Updated {len(existing_projects)} existing projects with default values") # Create unique index on code_name try: cursor.execute("CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_code_name ON projects(code_name)") print("Created unique index on code_name") except sqlite3.IntegrityError as e: print(f"Warning: Could not create unique index on code_name: {e}") print("You may need to manually ensure code_name values are unique") # Commit changes conn.commit() print("Migration completed successfully!") return True except Exception as e: print(f"Migration failed: {e}") if conn: conn.rollback() return False finally: if conn: conn.close() if __name__ == "__main__": success = migrate_project_fields() sys.exit(0 if success else 1)