@ -268,23 +268,30 @@ class Command(BaseCommand):
""" Fix all existing data integrity issues before starting main transaction """
from django.utils.text import slugify
from django.db.models import Count , Q
from django.db import connection
self . stdout . write ( ' = ' * 60 )
self . stdout . write ( ' PHASE 0: FIXING EXISTING DATA INTEGRITY ISSUES ' )
self . stdout . write ( ' = ' * 60 )
# Use raw SQL to find ALL records with empty slugs - more reliable
with connection . cursor ( ) as cursor :
cursor . execute ( """
SELECT id , number
FROM hadis_narratorlayer
WHERE slug IS NULL OR slug = ' ' OR TRIM ( slug ) = ' '
""" )
empty_slug_rows = cursor . fetchall ( )
self . stdout . write ( f ' Found {len(empty_slug_rows)} NarratorLayer records with empty slugs (via raw SQL) ' )
self . stdout . write ( ' Fixing NarratorLayer empty slugs... ' )
# Fix NarratorLayer empty slugs - be more aggressive
# First, let's see all layers
all_layers = NarratorLayer . objects . all ( )
self . stdout . write ( f ' Total layers in database: {all_layers.count()} ' )
# Fix each one
fixed_count = 0
for layer in all_layers :
needs_fix = False
# Check if slug is problematic
if not layer . slug or layer . slug . strip ( ) == ' ' :
needs_fix = True
self . stdout . write ( f ' Layer {layer.pk} (number={layer.number}) has empty slug ' )
if needs_fix :
for row_id , row_number in empty_slug_rows :
try :
layer = NarratorLayer . objects . get ( pk = row_id )
# Generate slug
try :
if layer . name and isinstance ( layer . name , list ) and len ( layer . name ) > 0 :
text = layer . name [ 0 ] . get ( ' text ' , ' ' ) . strip ( )
@ -307,9 +314,11 @@ class Command(BaseCommand):
layer . slug = new_slug
layer . save ( update_fields = [ ' slug ' ] )
fixed_count + = 1
self . stdout . write ( f ' Fixed layer {layer.pk} (number={layer.number}): " {new_slug} " ' )
self . stdout . write ( f ' ✓ Fixed layer {layer.pk} (number={layer.number}): " {new_slug} " ' )
except Exception as e :
self . stdout . write ( self . style . ERROR ( f ' ✗ Error fixing layer {row_id}: {str(e)} ' ) )
self . stdout . write ( f ' Fixed {fixed_count} layers with empty slugs ' )
self . stdout . write ( self . style . SUCCESS ( f ' Fixed {fixed_count} NarratorLayer records ' ) )
self . stdout . write ( ' Fixing TransmitterReliability duplicates... ' )
# Fix TransmitterReliability empty and duplicate slugs