diff --git a/apps/dobodbi_calendar/migrations/0002_alter_calendaroccasions_title.py b/apps/dobodbi_calendar/migrations/0002_alter_calendaroccasions_title.py index 9f1efef..3a38fc9 100644 --- a/apps/dobodbi_calendar/migrations/0002_alter_calendaroccasions_title.py +++ b/apps/dobodbi_calendar/migrations/0002_alter_calendaroccasions_title.py @@ -1,8 +1,53 @@ # Generated by Django 4.2.30 on 2026-07-19 12:21 +import json from django.db import migrations, models +def convert_titles_to_json(apps, schema_editor): + CalendarOccasions = apps.get_model('dobodbi_calendar', 'CalendarOccasions') + for occasion in CalendarOccasions.objects.all(): + title_str = occasion.title + if not title_str: + occasion.title = '[]' + occasion.save() + continue + + # Check if it's already a valid JSON list/dict + try: + parsed = json.loads(title_str) + if isinstance(parsed, (list, dict)): + # Already valid JSON + continue + except Exception: + pass + + # Convert plain text to JSON list + new_title = [{"language_code": "fa", "title": title_str}] + occasion.title = json.dumps(new_title, ensure_ascii=False) + occasion.save() + + +def convert_json_to_titles(apps, schema_editor): + CalendarOccasions = apps.get_model('dobodbi_calendar', 'CalendarOccasions') + for occasion in CalendarOccasions.objects.all(): + title_str = occasion.title + try: + parsed = json.loads(title_str) + if isinstance(parsed, list) and len(parsed) > 0: + # Try English first, then fallback + val = "" + for item in parsed: + if isinstance(item, dict): + val = item.get("title") or item.get("text") or val + if item.get("language_code") == "en": + break + occasion.title = val + occasion.save() + except Exception: + pass + + class Migration(migrations.Migration): dependencies = [ @@ -10,6 +55,7 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RunPython(convert_titles_to_json, convert_json_to_titles), migrations.AlterField( model_name='calendaroccasions', name='title', diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 7696bee..b94ed0e 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -128,7 +128,15 @@ class AdminHadisCollectionSerializer(serializers.ModelSerializer): read_only_fields = ["id", "created_at", "updated_at"] def to_internal_value(self, data): + import json mutable_data = safe_copy_data(data) + for json_field in ["title", "summary"]: + val = mutable_data.get(json_field) + if isinstance(val, str): + try: + mutable_data[json_field] = json.loads(val) + except ValueError: + pass thumbnail = mutable_data.get("thumbnail") if hasattr(mutable_data, "get") else None if thumbnail and hasattr(thumbnail, "read"): compressed_bytes = maybe_compress_uploaded_file(thumbnail) @@ -600,6 +608,18 @@ class AdminHadisCategoryArchiveSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "share_link", "xmind_share_link"] + def to_internal_value(self, data): + import json + data = safe_copy_data(data) + for json_field in ["title", "description"]: + val = data.get(json_field) + if isinstance(val, str): + try: + data[json_field] = json.loads(val) + except ValueError: + pass + return super().to_internal_value(data) + def create(self, validated_data): validated_data.pop("remove_xmind_file", False) return super().create(validated_data) @@ -715,6 +735,27 @@ class AdminTransmitterDetailSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "slug", "share_link", "created_at", "updated_at", "reliability_detail"] + def to_internal_value(self, data): + import json + data = safe_copy_data(data) + for json_field in [ + "full_name", + "kunya", + "known_as", + "nickname", + "origin", + "lived_in", + "died_in", + "description", + ]: + val = data.get(json_field) + if isinstance(val, str): + try: + data[json_field] = json.loads(val) + except ValueError: + pass + return super().to_internal_value(data) + def update(self, instance, validated_data): remove_thumbnail = validated_data.pop("remove_thumbnail", False) if remove_thumbnail and instance.thumbnail: diff --git a/apps/library/serializers_admin.py b/apps/library/serializers_admin.py index a98a036..7025282 100644 --- a/apps/library/serializers_admin.py +++ b/apps/library/serializers_admin.py @@ -192,6 +192,22 @@ class AdminBookDetailSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "view_count", "download_count", "bookmark_count", "created_at", "updated_at"] + def to_internal_value(self, data): + import json + if hasattr(data, "copy"): + mutable_data = data.copy() + else: + mutable_data = dict(data) + + for json_field in ["main_themes", "notable_works"]: + val = mutable_data.get(json_field) + if isinstance(val, str): + try: + mutable_data[json_field] = json.loads(val) + except ValueError: + pass + return super().to_internal_value(mutable_data) + def get_bookmark_count(self, obj): from apps.bookmark.models.bookmark import Bookmark return Bookmark.objects.filter(service=Bookmark.ServiceChoices.LIBRARY, content_id=obj.id, status=True).count()