Bin
2025-12-16 7423b0c6e1959f30a7e8e453e953310f32ce13c6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from django.db import migrations, connections
from core.redis import start_job_async_or_sync
from core.models import AsyncMigrationStatus
import logging
 
logger = logging.getLogger(__name__)
migration_name = '0033_projects_soft_delete_indexes_async'
 
 
def forward_migration(migration_name, db_alias):
    rec = AsyncMigrationStatus.objects.using(db_alias).create(name=migration_name, status=AsyncMigrationStatus.STATUS_STARTED)
    conn = connections[db_alias]
    if conn.vendor == 'postgresql':
        sqls = [
            'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_org_deleted_idx ON project (organization_id, deleted_at)',
            'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_deleted_at_idx ON project (deleted_at)',
            'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_purge_at_idx ON project (purge_at)',
        ]
    else:
        sqls = [
            'CREATE INDEX IF NOT EXISTS project_org_deleted_idx ON project (organization_id, deleted_at)',
            'CREATE INDEX IF NOT EXISTS project_deleted_at_idx ON project (deleted_at)',
            'CREATE INDEX IF NOT EXISTS project_purge_at_idx ON project (purge_at)',
        ]
    with conn.cursor() as c:
        for sql in sqls:
            c.execute(sql)
    rec.status = AsyncMigrationStatus.STATUS_FINISHED
    rec.save(using=db_alias)
 
 
def reverse_migration(migration_name, db_alias):
    rec = AsyncMigrationStatus.objects.using(db_alias).create(name=migration_name, status=AsyncMigrationStatus.STATUS_STARTED)
    conn = connections[db_alias]
    if conn.vendor == 'postgresql':
        sqls = [
            'DROP INDEX CONCURRENTLY IF EXISTS project_org_deleted_idx',
            'DROP INDEX CONCURRENTLY IF EXISTS project_deleted_at_idx',
            'DROP INDEX CONCURRENTLY IF EXISTS project_purge_at_idx',
        ]
    else:
        sqls = [
            'DROP INDEX IF EXISTS project_org_deleted_idx',
            'DROP INDEX IF EXISTS project_deleted_at_idx',
            'DROP INDEX IF EXISTS project_purge_at_idx',
        ]
    with conn.cursor() as c:
        for sql in sqls:
            c.execute(sql)
    rec.status = AsyncMigrationStatus.STATUS_FINISHED
    rec.save(using=db_alias)
 
 
def forwards(apps, schema_editor):
    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(reverse_migration, migration_name=migration_name, db_alias=db_alias)
 
 
class Migration(migrations.Migration):
    atomic = False
    dependencies = [
        ('projects', '0032_project_deleted_at_project_deleted_by_and_more'),
    ]
    operations = [
        migrations.RunPython(forwards, backwards),
    ]