Browse Source

hadis corrections existed data and serializer updated

master
Mohsen Taba 5 months ago
parent
commit
0a07d5e0e1
  1. 94
      apps/hadis/management/commands/reformat_translations.py
  2. 4
      apps/hadis/serializers/hadis.py

94
apps/hadis/management/commands/reformat_translations.py

@ -1,76 +1,64 @@
from django.core.management.base import BaseCommand
from django.db import transaction
from apps.hadis.models import Hadis
from apps.hadis.models import HadisCorrection # adjust import if app/model name is different
def normalize_translation(value):
def normalize_translation_items(value):
"""
Convert:
{"en": "translation", "fa": "ترجمه"}
Convert items like:
[{"lang": "en", "text": "..."}, {"lang": "fa", "text": "..."}]
to:
[{"text": "translation", "language_code": "en"},
{"text": "ترجمه", "language_code": "fa"}]
[{"language_code": "en", "text": "..."}, {"language_code": "fa", "text": "..."}]
Also clean existing list entries by:
- ensuring only 'text' + 'language_code'
- dropping any 'title' key
If already correct, leave as-is. Ignore items without text.
"""
if value is None:
if not value:
return []
# If it's already a list, clean its items
if isinstance(value, list):
cleaned = []
for item in value:
if not isinstance(item, dict):
continue
lang = item.get("language_code")
# prefer 'text', fallback to 'title'
text = item.get("text") or item.get("title")
if not lang or not text:
continue
cleaned.append(
{
"language_code": str(lang),
"text": text,
}
)
return cleaned
# Old dict format: {"en": "...", "fa": "..."}
if isinstance(value, dict):
result = []
for lang_code, text in value.items():
if text is None or text == "":
continue
result.append(
{
"language_code": str(lang_code),
"text": text,
}
)
return result
return []
if not isinstance(value, list):
# Unexpected format, just return as-is
return value
cleaned = []
for item in value:
if not isinstance(item, dict):
continue
# Prefer existing language_code, else use lang
lang = item.get("language_code") or item.get("lang")
text = item.get("text")
if not lang or not text:
continue
cleaned.append(
{
"language_code": str(lang),
"text": text,
}
)
return cleaned
class Command(BaseCommand):
help = "Reformat Hadis.translation from {'en': '...', 'fa': '...'} to [{'text': '...', 'language_code': '...'}, ...]" # noqa: E501
help = "Rename 'lang' to 'language_code' in HadisCorrection.translation JSON list entries."
@transaction.atomic
def handle(self, *args, **options):
qs = Hadis.objects.all()
qs = HadisCorrection.objects.all()
total = qs.count()
self.stdout.write(f"Found {total} hadis objects")
self.stdout.write(f"Found {total} HadisCorrection objects")
changed = 0
for hadis in qs:
old = hadis.translation
new = normalize_translation(old)
for obj in qs:
old = obj.translation
new = normalize_translation_items(old)
if new != old:
hadis.translation = new
hadis.save(update_fields=["translation"])
obj.translation = new
obj.save(update_fields=["translation"])
changed += 1
self.stdout.write(self.style.SUCCESS(f"Updated {changed} hadis objects"))
self.stdout.write(self.style.SUCCESS(f"Updated {changed} HadisCorrection objects"))

4
apps/hadis/serializers/hadis.py

@ -471,12 +471,12 @@ class HadisReferenceSerializer(serializers.ModelSerializer):
class HadisCorrectionSerializer(serializers.ModelSerializer):
"""Serializer for HadisCorrection"""
hadis_translation = serializers.SerializerMethodField()
title = LocalizedField()
description = LocalizedField()
translation = LocalizedField()
class Meta:
model = HadisCorrection
fields = ['id', 'title', 'description', 'hadis_translation','share_link', 'created_at', 'updated_at']
fields = ['id', 'title', 'description', 'translation','share_link', 'created_at', 'updated_at']
def get_hadis_translation(self, obj):
"""Get translation based on request language"""

Loading…
Cancel
Save