from django.core.management.base import BaseCommand from django.db import connection from django.contrib.auth.hashers import make_password import uuid class Command(BaseCommand): help = 'Reset database and create admin user' def handle(self, *args, **options): self.stdout.write('Resetting database...') # Drop all tables with connection.cursor() as cursor: cursor.execute(""" DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$; """) # Reset sequences cursor.execute(""" DO $$ DECLARE r RECORD; BEGIN FOR r IN (SELECT sequencename FROM pg_sequences WHERE schemaname = current_schema()) LOOP EXECUTE 'ALTER SEQUENCE ' || quote_ident(r.sequencename) || ' RESTART WITH 1'; END LOOP; END $$; """) self.stdout.write('All tables dropped and sequences reset.') # Run migrations from django.core.management import call_command call_command('migrate') self.stdout.write('Migrations applied.') # Create superuser using raw SQL try: with connection.cursor() as cursor: # Create user user_id = str(uuid.uuid4())[:10] cursor.execute(""" INSERT INTO accounts_user ( username, password, email, is_superuser, is_staff, is_active, date_joined, user_id, first_name, last_name, role, is_banned, ban_reason, theme_preference ) VALUES ( 'admin', %s, 'admin@thrillwiki.com', true, true, true, NOW(), %s, '', '', 'SUPERUSER', false, '', 'light' ) RETURNING id; """, [make_password('admin'), user_id]) result = cursor.fetchone() if result is None: raise Exception("Failed to create user - no ID returned") user_db_id = result[0] # Create profile profile_id = str(uuid.uuid4())[:10] cursor.execute(""" INSERT INTO accounts_userprofile ( profile_id, display_name, pronouns, bio, twitter, instagram, youtube, discord, coaster_credits, dark_ride_credits, flat_ride_credits, water_ride_credits, user_id, avatar ) VALUES ( %s, 'Admin', 'they/them', 'ThrillWiki Administrator', '', '', '', '', 0, 0, 0, 0, %s, '' ); """, [profile_id, user_db_id]) self.stdout.write('Superuser created.') except Exception as e: self.stdout.write(self.style.ERROR( f'Error creating superuser: {str(e)}')) raise self.stdout.write(self.style.SUCCESS('Database reset complete.'))