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
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
|