diff --git a/apps/library/serializers_admin.py b/apps/library/serializers_admin.py index face95f..d99337f 100644 --- a/apps/library/serializers_admin.py +++ b/apps/library/serializers_admin.py @@ -145,6 +145,41 @@ class AdminBookListSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "view_count", "download_count", "created_at", "updated_at"] +import json + +class FlexibleJSONListField(serializers.Field): + def to_internal_value(self, data): + if data is None or data == "": + return [] + if isinstance(data, list): + return data + if isinstance(data, str): + data = data.strip() + if not data: + return [] + try: + parsed = json.loads(data) + if isinstance(parsed, list): + return parsed + return [parsed] + except (ValueError, json.JSONDecodeError): + return [item.strip() for item in data.split(",") if item.strip()] + return [] + + def to_representation(self, value): + if isinstance(value, list): + return value + if isinstance(value, str): + try: + parsed = json.loads(value) + if isinstance(parsed, list): + return parsed + except Exception: + pass + return [value] if value else [] + return [] + + from dj_language.models import Language class AdminBookDetailSerializer(serializers.ModelSerializer): thumbnail = AbsoluteImageField(required=False, allow_null=True) @@ -157,6 +192,8 @@ class AdminBookDetailSerializer(serializers.ModelSerializer): collections_detail = AdminLibraryCollectionSerializer(source="collections", many=True, read_only=True) remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) remove_book_file = serializers.BooleanField(write_only=True, required=False, default=False) + main_themes = FlexibleJSONListField(required=False, default=list) + notable_works = FlexibleJSONListField(required=False, default=list) language = serializers.SlugRelatedField( slug_field='code', queryset=Language.objects.all(), @@ -205,22 +242,6 @@ 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()