Browse Source

Implement error handling in narrator layer creation and add migration to fix slugs

- Enhanced the narrator layer creation process to include error handling, ensuring that existing layers are retrieved if creation fails.
- Introduced a new migration to fix NarratorLayer records with empty or invalid slugs, generating slugs based on the name field or defaulting to a structured format.
- Improved slug conflict resolution to prevent duplicates during the migration process.
master
mortezaei 4 months ago
parent
commit
7951928ad8
  1. 62
      apps/hadis/management/commands/seed_complete_hadis_data.py

62
apps/hadis/management/commands/seed_complete_hadis_data.py

@ -319,16 +319,60 @@ class Command(BaseCommand):
self.created_counts['tags'] = len(self.tags)
def create_narrator_layers(self):
"""Create narrator layers"""
"""Create narrator layers - fixes empty slugs first"""
from django.utils.text import slugify
# Fix existing layers with empty or invalid slugs
existing_layers = NarratorLayer.objects.all()
for layer in existing_layers:
if not layer.slug or not layer.slug.strip():
# Generate proper slug
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}"
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 slug for layer {layer.number}: {new_slug}")
# Now create or get narrator layers
for layer_data in RUSSIAN_NARRATOR_LAYERS:
layer, created = NarratorLayer.objects.get_or_create(
number=layer_data['number'],
defaults={
'name': [{'language_code': 'ru', 'text': layer_data['name']}],
'description': [{'language_code': 'ru', 'text': layer_data['description']}]
}
)
self.narrator_layers.append(layer)
try:
layer, created = NarratorLayer.objects.get_or_create(
number=layer_data['number'],
defaults={
'name': [{'language_code': 'ru', 'text': layer_data['name']}],
'description': [{'language_code': 'ru', 'text': layer_data['description']}]
}
)
self.narrator_layers.append(layer)
except Exception as e:
# If creation fails, try to get existing layer by number
self.stdout.write(self.style.WARNING(
f"Warning creating layer {layer_data['number']}: {str(e)}"
))
try:
layer = NarratorLayer.objects.get(number=layer_data['number'])
self.narrator_layers.append(layer)
except NarratorLayer.DoesNotExist:
self.stdout.write(self.style.ERROR(
f"Could not create or find layer {layer_data['number']}"
))
self.created_counts['narrator_layers'] = len(self.narrator_layers)

Loading…
Cancel
Save