Browse Source

Refactor slug fixing logic in hadis seeding command

- Enhanced the process for fixing empty slugs in NarratorLayer by checking all layers and providing detailed logging for problematic entries.
- Improved slug generation to ensure uniqueness and fallback options when names are not available.
- Streamlined the creation of narrator layers with better error handling and defensive programming practices to avoid skipping layers.
- Added warnings for insufficient narrator layers, prompting retrieval of existing records if necessary.
master
mortezaei 4 months ago
parent
commit
7afd4c95b7
  1. 101
      apps/hadis/management/commands/seed_complete_hadis_data.py

101
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)

Loading…
Cancel
Save