from turtle import title from rest_framework import serializers from django.utils.translation import get_language from .category import get_localized_text from ..serializers import HadisListSerializer,HadisBasicSerializer,LocalizedField from ..models import BookReference , BookAuthor , BookReferenceImage, HadisReference , 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'] 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 HadisBasicSerializer(hadis_list,many=True).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_authors(self,obj): # request = self.context.get('request') # authors = [] # try: # for author in obj.authors.all(): # authors.append({ # 'id': author.id, # 'name': get_localized_text(author.name,request) # }) # except: # authors = [] # return authors def get_detail(self, obj): """Get basic book information including authors and rating""" 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, 'number_of_pages': obj.number_page, 'volume_info': obj.volume, 'rating': obj.rate } def get_hadises(self, obj): """Get all hadises related to this book reference""" request = self.context.get('request') hadis_list = [] try: for hadis_ref in obj.hadis_references.all(): hadis = hadis_ref.hadis hadis_list.append({ 'id': hadis.id, 'title': get_localized_text(hadis.title,request), 'title_narrator': get_localized_text(hadis.title_narrator,request), 'text': get_localized_text(hadis.text,request), 'translation': get_localized_text(hadis.get_translation,request), 'share_link': hadis.share_link }) except: pass return hadis_list