diff --git a/apps/hadis/management/commands/seed_complete_hadis_data.py b/apps/hadis/management/commands/seed_complete_hadis_data.py index 483346f..0461b96 100644 --- a/apps/hadis/management/commands/seed_complete_hadis_data.py +++ b/apps/hadis/management/commands/seed_complete_hadis_data.py @@ -270,33 +270,46 @@ class Command(BaseCommand): from django.db.models import Count, Q self.stdout.write('Fixing NarratorLayer empty slugs...') - # Fix NarratorLayer empty slugs - empty_layers = NarratorLayer.objects.filter(Q(slug__isnull=True) | Q(slug='') | Q(slug=' ')) - self.stdout.write(f'Found {empty_layers.count()} layers with 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()}') - for layer in empty_layers: - try: - if layer.name and isinstance(layer.name, list) and len(layer.name) > 0: - text = layer.name[0].get('text', '').strip() - if text: - new_slug = slugify(text) + 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: + try: + if layer.name and isinstance(layer.name, list) and len(layer.name) > 0: + text = layer.name[0].get('text', '').strip() + if text: + new_slug = slugify(text) + else: + new_slug = f"layer-{layer.number}" else: new_slug = f"layer-{layer.number}" - else: + except (IndexError, KeyError, AttributeError, TypeError): new_slug = f"layer-{layer.number}" - except (IndexError, KeyError, AttributeError, TypeError): - new_slug = f"layer-{layer.number}" - - # Ensure uniqueness - counter = 1 - original_slug = new_slug - while NarratorLayer.objects.filter(slug=new_slug).exclude(pk=layer.pk).exists(): - new_slug = f"{original_slug}-{counter}" - counter += 1 - - layer.slug = new_slug - layer.save(update_fields=['slug']) - self.stdout.write(f' Fixed layer {layer.pk} (number={layer.number}): "{new_slug}"') + + # Ensure uniqueness + counter = 1 + original_slug = new_slug + while NarratorLayer.objects.filter(slug=new_slug).exclude(pk=layer.pk).exists(): + new_slug = f"{original_slug}-{counter}" + counter += 1 + + 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 {fixed_count} layers with empty slugs') self.stdout.write('Fixing TransmitterReliability duplicates...') # Fix TransmitterReliability empty and duplicate slugs @@ -458,34 +471,32 @@ class Command(BaseCommand): """Create narrator layers (slugs already fixed in Phase 0)""" # Create or get narrator layers - use filter().first() to avoid duplicates for layer_data in RUSSIAN_NARRATOR_LAYERS: - try: - # Try to find existing layer by number - layer = NarratorLayer.objects.filter(number=layer_data['number']).first() - - if layer: - # Layer already exists - self.stdout.write(f"Using existing layer {layer_data['number']}") - else: - # Create new layer + # Try to find existing layer by number first + layer = NarratorLayer.objects.filter(number=layer_data['number']).first() + + if layer: + # Layer already exists - just use it + self.stdout.write(f"Using existing layer {layer_data['number']}") + self.narrator_layers.append(layer) + else: + # Create new layer - but be defensive + try: layer = NarratorLayer.objects.create( number=layer_data['number'], name=[{'language_code': 'ru', 'text': layer_data['name']}], description=[{'language_code': 'ru', 'text': layer_data['description']}] ) self.stdout.write(f"Created new layer {layer_data['number']}") - - self.narrator_layers.append(layer) - except Exception as e: - self.stdout.write(self.style.ERROR( - f"Error with layer {layer_data['number']}: {str(e)}" - )) - # Try one more time to get by number - try: - layer = NarratorLayer.objects.filter(number=layer_data['number']).first() - if layer: - self.narrator_layers.append(layer) - except Exception as e2: - self.stdout.write(self.style.ERROR(f"Final attempt failed: {str(e2)}")) + self.narrator_layers.append(layer) + except Exception as e: + self.stdout.write(self.style.WARNING( + f"Could not create layer {layer_data['number']}: {str(e)} - skipping" + )) + + # If we don't have enough layers, try to get any existing ones + if len(self.narrator_layers) < 3: + self.stdout.write(self.style.WARNING('Not enough narrator layers, fetching all existing ones')) + self.narrator_layers = list(NarratorLayer.objects.all()) self.created_counts['narrator_layers'] = len(self.narrator_layers)