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.
 
 

240 lines
7.4 KiB

from rest_framework import serializers
from django.utils.translation import gettext_lazy as _
from urllib3 import fields
from ..models import (
Hadis, HadisStatus, HadisTag, HadisTransmitter,
HadisReference, ReferenceImage, Transmitters, HadisCollection,
TransmitterOpinion ,
)
from apps.library.serializers import BookSerializer
class HadisCollectionListSerializer(serializers.ModelSerializer):
thumbnail = serializers.SerializerMethodField()
class Meta:
model = HadisCollection
fields = ['id', 'title', 'slug', 'thumbnail']
def get_thumbnail(self, obj):
if obj.thumbnail:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.thumbnail.url)
return obj.thumbnail.url
return None
class HadisSyncSerializer(serializers.ModelSerializer):
"""Serializer for syncing all hadis data"""
translations = serializers.SerializerMethodField()
hadis_status = serializers.SerializerMethodField()
tags = serializers.SerializerMethodField()
class Meta:
model = Hadis
fields = [
'id', 'number', 'category_id', 'title', 'title_narrator',
'text', 'translations', 'explanation', 'address',
'hadis_status', 'hadis_status_text', 'share_link', 'tags', 'links'
]
def get_translations(self, obj):
"""Get all translations"""
translations_dict = {}
if obj.translation and isinstance(obj.translation, list):
for tr in obj.translation:
if isinstance(tr, dict):
lang_code = tr.get('language_code')
title = tr.get('title')
if lang_code:
translations_dict[lang_code] = title
return translations_dict
def get_hadis_status(self, obj):
"""Get hadis status info"""
if obj.hadis_status:
return {
'id': obj.hadis_status.id,
'title': obj.hadis_status.title,
'color': obj.hadis_status.color
}
return None
def get_tags(self, obj):
"""Get tags"""
return [{'id': tag.id, 'title': tag.title} for tag in obj.tags.all()]
class HadisListSerializer(serializers.ModelSerializer):
"""Serializer for Hadis list"""
category = serializers.SerializerMethodField()
translation = serializers.SerializerMethodField()
class Meta:
model = Hadis
fields = ['id', 'number', 'title', 'text' ,'category', 'translation']
def get_category(self, obj):
"""Get category id and title"""
if obj.category:
return {
'id': obj.category.id,
'title': obj.category.title
}
return None
def get_translation(self, obj):
"""Get translation based on request language"""
request = self.context.get('request')
language_code = getattr(request, 'LANGUAGE_CODE', 'en')
return obj.get_translation(language_code)
class HadisStatusSerializer(serializers.ModelSerializer):
"""Serializer for HadisStatus"""
class Meta:
model = HadisStatus
fields = ['id', 'title', 'color']
class HadisTagSerializer(serializers.ModelSerializer):
"""Serializer for HadisTag"""
class Meta:
model = HadisTag
fields = ['id', 'title']
class TransmitterSerializer(serializers.ModelSerializer):
"""Serializer for Transmitters"""
class Meta:
model = Transmitters
fields = [
'id', 'full_name', 'birth_year_hijri', 'death_year_hijri',
'description','reliability','madhhab',
]
class TransmitterOpinionSerializer(serializers.ModelSerializer):
""" Serializer for TransmitterOpinions """
class Meta:
model = TransmitterOpinion
fields = '__all__'
class HadisTransmitterSerializer(serializers.ModelSerializer):
""" Serializer for HadisTransmitters """
class Meta:
model = HadisTransmitter
fields = '__all__'
class TransmitterDetailSerializer(serializers.ModelSerializer):
""" Serializer for Details of Transmitters """
opinions = TransmitterOpinionSerializer(
many=True,
read_only=True,
)
hadis_transmissions = HadisTransmitterSerializer(
source='hadis',
many=True,
read_only=True,
)
class Meta:
model = Transmitters
fields = [
'id','full_name','kunya','known_as','nickname',
'origin','lived_in','died_in','birth_year_hijri',
'death_year_hijri','age_at_death','reliability',
'madhhab',"in_sahih_muslim","in_sahih_bukhari","description",
"thumbnail",'opinions','hadis_transmissions'
]
class HadisTransmitterSerializer(serializers.ModelSerializer):
"""Serializer for HadisTransmitter with transmitter details"""
transmitter = TransmitterSerializer(read_only=True)
class Meta:
model = HadisTransmitter
fields = [
'id', 'transmitter', 'order', 'is_gap'
]
class ReferenceImageSerializer(serializers.ModelSerializer):
"""Serializer for ReferenceImage"""
thumbnail = serializers.SerializerMethodField()
class Meta:
model = ReferenceImage
fields = ['id', 'thumbnail', 'priority']
def get_thumbnail(self, obj):
"""Get thumbnail URL"""
if obj.image:
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.image.url)
return obj.image.url
return None
class HadisReferenceSerializer(serializers.ModelSerializer):
"""Serializer for HadisReference with book and images"""
book = BookSerializer(read_only=True)
images = ReferenceImageSerializer(many=True, read_only=True)
class Meta:
model = HadisReference
fields = [
'id', 'book', 'page_number', 'hadis_number_in_book',
'description', 'images'
]
class HadisDetailSerializer(serializers.ModelSerializer):
"""Detailed serializer for Hadis with all related objects"""
hadis_status = HadisStatusSerializer(read_only=True)
tags = HadisTagSerializer(many=True, read_only=True)
transmitters = HadisTransmitterSerializer(
source='hadistransmitter_set',
many=True,
read_only=True
)
references = HadisReferenceSerializer(
source='hadisreference_set',
many=True,
read_only=True
)
category = serializers.SerializerMethodField()
translation = serializers.SerializerMethodField()
class Meta:
model = Hadis
fields = [
'id', 'number', 'title', 'text', 'translation', 'explanation',
'address', 'hadis_status_text', 'links', 'status',
'category', 'hadis_status', 'tags', 'transmitters', 'references'
]
def get_category(self, obj):
"""Get category details"""
if obj.category:
return {
'id': obj.category.id,
'title': obj.category.title,
'category_type': obj.category.category_type
}
return None
def get_translation(self, obj):
"""Get translation based on request language"""
request = self.context.get('request')
language_code = getattr(request, 'LANGUAGE_CODE', 'en')
return obj.get_translation(language_code)