You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

65 lines
2.9 KiB

from django.core.management.base import BaseCommand
from django.apps import apps
from django.db import models
class Command(BaseCommand):
help = "Populate missing 'en' translations with other available language data for JSONFields"
def handle(self, *args, **options):
target_app_labels = ['course', 'quiz', 'blog', 'hadis', 'library']
updated_records = 0
for app_label in target_app_labels:
try:
app_config = apps.get_app_config(app_label)
except LookupError:
continue
for model in app_config.get_models():
json_fields = [f for f in model._meta.get_fields() if isinstance(f, models.JSONField)]
if not json_fields:
continue
for instance in model.objects.all():
changed = False
for field in json_fields:
val = getattr(instance, field.name)
if isinstance(val, list):
has_en = False
fallback_text = None
valid = True
for item in val:
if not isinstance(item, dict) or 'language_code' not in item or 'title' not in item:
valid = False
break
title_val = item.get('title')
if isinstance(title_val, str):
title_str = title_val.strip()
elif title_val is not None:
title_str = str(title_val).strip()
else:
title_str = ''
if item.get('language_code') == 'en' and title_str:
has_en = True
elif title_str:
if not fallback_text:
fallback_text = title_val
if valid and not has_en and fallback_text:
val.append({
"language_code": "en",
"title": fallback_text
})
setattr(instance, field.name, val)
changed = True
if changed:
instance.save()
updated_records += 1
self.stdout.write(f"Updated {model.__name__} ID {instance.pk}")
self.stdout.write(self.style.SUCCESS(f"Finished updating {updated_records} records."))