Browse Source

multiangage data corroption fixed

master
Mohsen Taba 1 day ago
parent
commit
017f4ad18b
  1. 46
      apps/dobodbi_calendar/migrations/0002_alter_calendaroccasions_title.py
  2. 41
      apps/hadis/serializers/serializers_admin.py
  3. 16
      apps/library/serializers_admin.py

46
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 # Generated by Django 4.2.30 on 2026-07-19 12:21
import json
from django.db import migrations, models 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): class Migration(migrations.Migration):
dependencies = [ dependencies = [
@ -10,6 +55,7 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.RunPython(convert_titles_to_json, convert_json_to_titles),
migrations.AlterField( migrations.AlterField(
model_name='calendaroccasions', model_name='calendaroccasions',
name='title', name='title',

41
apps/hadis/serializers/serializers_admin.py

@ -128,7 +128,15 @@ class AdminHadisCollectionSerializer(serializers.ModelSerializer):
read_only_fields = ["id", "created_at", "updated_at"] read_only_fields = ["id", "created_at", "updated_at"]
def to_internal_value(self, data): def to_internal_value(self, data):
import json
mutable_data = safe_copy_data(data) 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 thumbnail = mutable_data.get("thumbnail") if hasattr(mutable_data, "get") else None
if thumbnail and hasattr(thumbnail, "read"): if thumbnail and hasattr(thumbnail, "read"):
compressed_bytes = maybe_compress_uploaded_file(thumbnail) compressed_bytes = maybe_compress_uploaded_file(thumbnail)
@ -600,6 +608,18 @@ class AdminHadisCategoryArchiveSerializer(serializers.ModelSerializer):
] ]
read_only_fields = ["id", "share_link", "xmind_share_link"] 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): def create(self, validated_data):
validated_data.pop("remove_xmind_file", False) validated_data.pop("remove_xmind_file", False)
return super().create(validated_data) 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"] 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): def update(self, instance, validated_data):
remove_thumbnail = validated_data.pop("remove_thumbnail", False) remove_thumbnail = validated_data.pop("remove_thumbnail", False)
if remove_thumbnail and instance.thumbnail: if remove_thumbnail and instance.thumbnail:

16
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"] 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): def get_bookmark_count(self, obj):
from apps.bookmark.models.bookmark import Bookmark from apps.bookmark.models.bookmark import Bookmark
return Bookmark.objects.filter(service=Bookmark.ServiceChoices.LIBRARY, content_id=obj.id, status=True).count() return Bookmark.objects.filter(service=Bookmark.ServiceChoices.LIBRARY, content_id=obj.id, status=True).count()

Loading…
Cancel
Save