# Generated by Django 5.1.9 on 2025-06-26 20:30 from django.db import migrations from django.conf import settings from core.models import AsyncMigrationStatus from core.redis import start_job_async_or_sync import logging logger = logging.getLogger(__name__) IS_SQLITE = settings.DJANGO_DB == settings.DJANGO_DB_SQLITE migration_name = '0055_task_proj_octlen_idx_async' sql_create_index = ( 'CREATE INDEX CONCURRENTLY IF NOT EXISTS task_proj_octlen_idx ' 'ON task (project_id, octet_length(data::text) DESC) ' 'INCLUDE (id);' ) sql_drop_index = ( 'DROP INDEX CONCURRENTLY IF EXISTS task_proj_octlen_idx;' ) def forward_migration(migration_name, db_alias): migration, created = AsyncMigrationStatus.objects.using(db_alias).get_or_create( name=migration_name, defaults={'status': AsyncMigrationStatus.STATUS_STARTED}, ) if not created: return logger.info(f'Start async migration {migration_name}') from django.db import connections cursor = connections[db_alias].cursor() cursor.execute(sql_create_index) migration.status = AsyncMigrationStatus.STATUS_FINISHED migration.save(using=db_alias) logger.info(f'Async migration {migration_name} complete') def backward_migration(migration_name, db_alias): migration = AsyncMigrationStatus.objects.using(db_alias).create( name=migration_name, status=AsyncMigrationStatus.STATUS_STARTED, ) logger.info(f'Start revert of async migration {migration_name}') from django.db import connections cursor = connections[db_alias].cursor() cursor.execute(sql_drop_index) migration.status = AsyncMigrationStatus.STATUS_FINISHED migration.save(using=db_alias) logger.info(f'Async migration {migration_name} revert complete') def forwards(apps, schema_editor): if IS_SQLITE: logger.info('SQLite execution') logger.info('Skipping async index creation for non-PostgreSQL databases') return db_alias = schema_editor.connection.alias start_job_async_or_sync(forward_migration, migration_name=migration_name, db_alias=db_alias) def backwards(apps, schema_editor): db_alias = schema_editor.connection.alias start_job_async_or_sync(backward_migration, migration_name=migration_name, db_alias=db_alias) class Migration(migrations.Migration): atomic = False dependencies = [ ("tasks", "0054_add_brin_index_updated_at"), ] operations = [ migrations.RunPython(forwards, backwards), ]