|
|
|
@ -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() |
|
|
|
|