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
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."))
|