You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

169 lines
5.3 KiB

from rest_framework import serializers
from django.utils.translation import get_language
from .category import get_localized_text
from ..serializers import HadisBasicSerializer,LocalizedField, HadisShortSerializer
from ..models import BookReference , BookAuthor , BookReferenceImage , BookAttribute
class BookAuthorSerializer(serializers.ModelSerializer):
name = LocalizedField()
class Meta:
model = BookAuthor
fields = ['id','name']
class BookReferenceImageSerializer(serializers.ModelSerializer):
description = LocalizedField()
class Meta:
model = BookReferenceImage
fields = ['id','image','description','order']
class BookReferenceSerializer(serializers.ModelSerializer):
image = BookReferenceImageSerializer(
many= True ,
read_only = True ,
source = 'bookreference_set'
)
title = LocalizedField()
description = LocalizedField()
author = serializers.SerializerMethodField()
class Meta:
model = BookReference
fields = ['id','title','slug','rate','author','description','image','volume']
def get_author(self, obj):
request = self.context.get("request")
# Prefer request.LANGUAGE_CODE if you use LocaleMiddleware
language_code = getattr(request, "LANGUAGE_CODE", None) if request else None
print(language_code,1)
if not language_code:
language_code =get_language() or "en" # fallback [web:164][web:165]
print(language_code,2)
authors = obj.authors.all()
result = []
for author in authors:
# author.name is your list of dicts
name_items = author.name or []
# find item with matching language_code
text = None
for item in name_items:
if item.get("language_code") == language_code:
print(f'we got language-code{language_code}')
text = item.get("text")
break
# fallback: if not found, use first item or None
print(text,'this is text')
if text is None and name_items:
print('no we didnt')
text = name_items[0].get("text")
result.append(
{
"id": author.id,
"name": text,
}
)
return result
class BookAttributeSerializer(serializers.ModelSerializer):
title = LocalizedField()
value = LocalizedField()
class Meta:
model = BookAttribute
fields = ['id', 'title', 'value','book_reference']
from apps.hadis.serializers import HadisListSerializer
class BookDetailSerializer(serializers.ModelSerializer):
attribute = BookAttributeSerializer(
many=True,
read_only = True,
source = 'attributes'
)
author= BookAuthorSerializer(
many=True,
read_only=True,
source='authors'
)
image = BookReferenceImageSerializer(
many=True,
read_only=True,
source='images'
)
# hadis = HadisListSerializer(
# many=True,
# read_only=True,
# source='hadis_references__hadis'
# )
hadis = serializers.SerializerMethodField()
title = LocalizedField()
language = LocalizedField()
publisher = LocalizedField()
description = LocalizedField()
class Meta:
model = BookReference
fields = ['id','title','rate','isbn','language','number_page','publisher','description','volume','slug','attribute','author','image','hadis']
def get_hadis(self,obj):
references = obj.hadis_references.all()
hadis_list = [ref.hadis for ref in references if ref.hadis]
return HadisListSerializer(hadis_list,many=True, context=self.context).data
class BookReferenceSyncSerializer(serializers.ModelSerializer):
"""Serializer for syncing all book reference data for offline mode"""
attribute = BookAttributeSerializer(
many=True,
read_only=True,
source='attributes'
)
author = BookAuthorSerializer(
many=True,
read_only=True,
source='authors'
)
image = BookReferenceImageSerializer(
many=True,
read_only=True,
source='images'
)
# Basic information
detail = serializers.SerializerMethodField()
hadises = serializers.SerializerMethodField()
title = LocalizedField()
class Meta:
model = BookReference
fields = [
'id', 'title', 'rate', 'author', 'detail', 'image', 'attribute', 'hadises'
]
def get_detail(self, obj):
"""Get basic book information"""
request = self.context.get('request')
return {
'description': get_localized_text(obj.description, request),
'volume': obj.volume,
'language': get_localized_text(obj.language, request),
'isbn': obj.isbn,
'number_page': obj.number_page,
'year_of_publication': obj.year_of_publication,
'volume_info': obj.volume,
'rating': obj.rate
}
def get_hadises(self,obj):
references = obj.hadis_references.all()
hadis_list = [ref.hadis for ref in references if ref.hadis]
return HadisShortSerializer(hadis_list,many=True, context=self.context).data