Browse Source

added multilang serializers

master
Mohsen Taba 5 months ago
parent
commit
d73d766397
  1. 70
      apps/hadis/models/category.py
  2. 138
      apps/hadis/models/hadis.py
  3. 110
      apps/hadis/models/reference.py
  4. 153
      apps/hadis/models/transmitter.py
  5. 45
      apps/hadis/serializers/category.py
  6. 111
      apps/hadis/serializers/hadis.py
  7. 48
      apps/hadis/views/hadis.py

70
apps/hadis/models/category.py

@ -19,6 +19,41 @@ class HadisSect(models.Model):
def __str__(self): def __str__(self):
return f"{self.sect_type}: {self.title}" return f"{self.sect_type}: {self.title}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class Meta: class Meta:
verbose_name = _('Hadis Sect') verbose_name = _('Hadis Sect')
@ -75,3 +110,38 @@ class HadisCategory(MPTTModel):
def __str__(self): def __str__(self):
return f"{self.sect.sect_type}: {self.source_type} - {self.title}" return f"{self.sect.sect_type}: {self.source_type} - {self.title}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None

138
apps/hadis/models/hadis.py

@ -6,7 +6,6 @@ from django.utils.text import slugify
from filer.fields.image import FilerImageField from filer.fields.image import FilerImageField
from .reference import BookReference from .reference import BookReference
class HadisCollection(models.Model): class HadisCollection(models.Model):
title = models.JSONField(default = list , verbose_name=_('Title')) title = models.JSONField(default = list , verbose_name=_('Title'))
slug = models.SlugField(max_length=255, unique=True, verbose_name=_('slug'), blank=True) slug = models.SlugField(max_length=255, unique=True, verbose_name=_('slug'), blank=True)
@ -38,6 +37,40 @@ class HadisCollection(models.Model):
def __str__(self): def __str__(self):
return self.title return self.title
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_summary(self,lang):
"""
Get translation for a specific language
"""
if not self.summary or not isinstance(self.summary, list):
return None
for tr in self.summary:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.translation:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class Meta: class Meta:
verbose_name = _('hadis collection') verbose_name = _('hadis collection')
verbose_name_plural = _('hadis collections') verbose_name_plural = _('hadis collections')
@ -69,6 +102,23 @@ class HadisTag(models.Model):
def __str__(self): def __str__(self):
return f"{self.title}" return f"{self.title}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class HadisStatus(models.Model): class HadisStatus(models.Model):
class ColorChoices(models.TextChoices): class ColorChoices(models.TextChoices):
@ -88,6 +138,23 @@ class HadisStatus(models.Model):
def __str__(self): def __str__(self):
return self.title return self.title
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class Meta: class Meta:
verbose_name = _('hadis status') verbose_name = _('hadis status')
verbose_name_plural = _('hadis statuses') verbose_name_plural = _('hadis statuses')
@ -158,8 +225,10 @@ class Hadis(models.Model):
def get_description(self, lang): def get_description(self, lang):
return self._get_json_field("description" , lang) return self._get_json_field("description" , lang)
def get_hadis_status_text(self, lang): def get_hadis_status_text(self, lang):
return self._get_json_field("hadis_status_text" , lang) return self._get_json_field("hadis_status_text" , lang)
def get_address(self, lang): def get_address(self, lang):
return self._get_json_field("address" , lang) return self._get_json_field("address" , lang)
@ -218,6 +287,22 @@ class HadisReference(models.Model):
verbose_name = _('Hadis Reference') verbose_name = _('Hadis Reference')
verbose_name_plural = _('Hadis References') verbose_name_plural = _('Hadis References')
# unique_together = ('hadis', 'book_reference') # unique_together = ('hadis', 'book_reference')
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def __str__(self): def __str__(self):
return f'{self.hadis.number}-{self.book_reference.title if self.book_reference else "No Book Reference"}' return f'{self.hadis.number}-{self.book_reference.title if self.book_reference else "No Book Reference"}'
@ -264,3 +349,54 @@ class HadisCorrection(models.Model):
def __str__(self): def __str__(self):
return f"{self.hadis.number} - {self.title}" return f"{self.hadis.number} - {self.title}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_translation(self,lang):
"""
Get title for a specific language
"""
if not self.translation or not isinstance(self.translation, list):
return None
for tr in self.translation:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.translation:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None

110
apps/hadis/models/reference.py

@ -37,6 +37,48 @@ class BookReference(models.Model):
def __str__(self): def __str__(self):
return self.title return self.title
def _get_json_field(self, field_name: str, lang: str | None = None, fallback: str = "en"):
"""
Generic getter for JSONField in our [{text, language_code}] format.
Usage: self._get_json_field('title', 'fa')
"""
if lang is None:
lang = fallback
value = getattr(self, field_name, None)
if not value or not isinstance(value, list):
return None
# 1) exact language
for item in value:
if isinstance(item, dict) and item.get("language_code") == lang:
return item.get("text", "")
# 2) fallback language
if fallback and fallback != lang:
for item in value:
if isinstance(item, dict) and item.get("language_code") == fallback:
return item.get("text", "")
# 3) first available
item = value[0]
print(item)
return item.get("text", "") if isinstance(item, dict) else None
def get_title(self,lang):
return self._get_json_field("title" , lang)
def get_description(self, lang):
return self._get_json_field("description" , lang)
def get_publisher(self, lang):
return self._get_json_field("publisher" , lang)
def get_language(self, lang):
return self._get_json_field("language" , lang)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:
base_slug = slugify(self.title, allow_unicode=True) base_slug = slugify(self.title, allow_unicode=True)
@ -69,6 +111,23 @@ class BookReferenceImage(models.Model):
verbose_name_plural = _('Book Reference Images') verbose_name_plural = _('Book Reference Images')
ordering = ['order', '-created_at'] ordering = ['order', '-created_at']
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def __str__(self): def __str__(self):
return f"{self.book_reference.title} - Image {self.order}" return f"{self.book_reference.title} - Image {self.order}"
@ -96,6 +155,23 @@ class BookAuthor(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
def get_name(self,lang):
"""
Get title for a specific language
"""
if not self.name or not isinstance(self.name, list):
return None
for tr in self.name:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.name:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class BookAttribute(models.Model): class BookAttribute(models.Model):
""" """
@ -121,3 +197,37 @@ class BookAttribute(models.Model):
def __str__(self): def __str__(self):
return f"{self.title}: {self.value}" return f"{self.title}: {self.value}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_value(self,lang):
"""
Get title for a specific language
"""
if not self.value or not isinstance(self.value, list):
return None
for tr in self.value:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.value:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None

153
apps/hadis/models/transmitter.py

@ -28,6 +28,40 @@ class NarratorLayer(models.Model):
def __str__(self): def __str__(self):
return f"{_('Layer')} {self.number} - {self.name}" return f"{_('Layer')} {self.number} - {self.name}"
def get_description(self,lang):
"""
Get title for a specific language
"""
if not self.description or not isinstance(self.description, list):
return None
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.description:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_name(self,lang):
"""
Get title for a specific language
"""
if not self.name or not isinstance(self.name, list):
return None
for tr in self.name:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.name:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:
slug = slugify(self.name) slug = slugify(self.name)
@ -126,6 +160,56 @@ class Transmitters(models.Model):
self.slug = slug self.slug = slug
super().save(*args, **kwargs) super().save(*args, **kwargs)
def _get_json_field(self, field_name: str, lang: str | None = None, fallback: str = "en"):
"""
Generic getter for JSONField in our [{text, language_code}] format.
Usage: self._get_json_field('title', 'fa')
"""
if lang is None:
lang = fallback
value = getattr(self, field_name, None)
if not value or not isinstance(value, list):
return None
# 1) exact language
for item in value:
if isinstance(item, dict) and item.get("language_code") == lang:
return item.get("text", "")
# 2) fallback language
if fallback and fallback != lang:
for item in value:
if isinstance(item, dict) and item.get("language_code") == fallback:
return item.get("text", "")
# 3) first available
item = value[0]
print(item)
return item.get("text", "") if isinstance(item, dict) else None
def get_full_name(self, lang):
return self._get_json_field("full_name" , lang)
def get_kunya(self, lang):
return self._get_json_field("kunya" , lang)
def get_nickname(self, lang):
return self._get_json_field("nickname" , lang)
def get_origin(self, lang):
return self._get_json_field("origin" , lang)
def get_lived_in(self,lang):
return self._get_json_field("lived_in" , lang)
def get_died_in(self, lang):
return self._get_json_field("died_in" , lang)
def get_description(self, lang):
return self._get_json_field("description" , lang)
def __str__(self): def __str__(self):
return self.full_name return self.full_name
@ -221,6 +305,40 @@ class TransmitterOpinion(models.Model):
def __str__(self): def __str__(self):
return f"{self.scholar_name}'s opinion on {self.transmitter.full_name} ({self.status})" return f"{self.scholar_name}'s opinion on {self.transmitter.full_name} ({self.status})"
def get_scholar_name(self,lang):
"""
Get title for a specific language
"""
if not self.scholar_name or not isinstance(self.scholar_name, list):
return None
for tr in self.scholar_name:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.scholar_name:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_opinion_tex(self,lang):
"""
Get title for a specific language
"""
if not self.opinion_text or not isinstance(self.opinion_text, list):
return None
for tr in self.opinion_text:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.opinion_text:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
class TransmitterOriginalText(models.Model): class TransmitterOriginalText(models.Model):
transmitter = models.ForeignKey( transmitter = models.ForeignKey(
Transmitters, Transmitters,
@ -235,3 +353,38 @@ class TransmitterOriginalText(models.Model):
def __str__(self): def __str__(self):
return f"{self.title} by {self.transmitter.full_name}" return f"{self.title} by {self.transmitter.full_name}"
def get_title(self,lang):
"""
Get title for a specific language
"""
if not self.title or not isinstance(self.title, list):
return None
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.title:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None
def get_opinion_tex(self,lang):
"""
Get title for a specific language
"""
if not self.opinion_text or not isinstance(self.opinion_text, list):
return None
for tr in self.opinion_text:
if isinstance(tr, dict) and tr.get('language_code') == lang:
return tr.get('text', '')
for tr in self.opinion_text:
if isinstance(tr, dict) and tr.get('language_code') == 'en':
return tr.get('text', '')
return None

45
apps/hadis/serializers/category.py

@ -1,14 +1,44 @@
from dataclasses import fields
from turtle import title
from rest_framework import serializers from rest_framework import serializers
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.db.models import Count from django.db.models import Count
from ..models import HadisSect, HadisCategory, Hadis , HadisCategory from ..models import HadisSect, HadisCategory, Hadis , HadisCategory
class LocalizedField(serializers.Field):
"""
Automatically extracts the correct language from a JSON list
based on the request's ?lang= parameter.
"""
def to_representation(self, value):
# 'value' is the raw JSON list from the database
if not value or not isinstance(value, list):
return None
# Get language from request query params (default to 'fa' or 'en')
request = self.context.get('request')
target_lang = request.query_params.get('lang', 'fa') if request else 'fa'
# Logic to find the text
for item in value:
if item.get('language_code') == target_lang:
return item.get('text') # Assuming your key is 'text'
# Fallback to English
for item in value:
if item.get('language_code') == 'en':
return item.get('text')
# Fallback to first item
return value[0].get('text') if value else None
class HadisCategorySectListSerializer(serializers.ModelSerializer): class HadisCategorySectListSerializer(serializers.ModelSerializer):
"""Serializer for HadisSect list with grouped response""" """Serializer for HadisSect list with grouped response"""
source_types = serializers.SerializerMethodField() source_types = serializers.SerializerMethodField()
title = LocalizedField()
class Meta: class Meta:
model = HadisSect model = HadisSect
@ -23,7 +53,9 @@ class HadisCategorySectListSerializer(serializers.ModelSerializer):
class HadisCategoryTreeSerializer(serializers.ModelSerializer): class HadisCategoryTreeSerializer(serializers.ModelSerializer):
title = LocalizedField()
"""Serializer for HadisCategory tree structure""" """Serializer for HadisCategory tree structure"""
sect_id = serializers.IntegerField(source='sect.id', read_only=True) sect_id = serializers.IntegerField(source='sect.id', read_only=True)
sect_type = serializers.CharField(source='sect.sect_type', read_only=True) sect_type = serializers.CharField(source='sect.sect_type', read_only=True)
@ -127,6 +159,7 @@ class HadisCategorySelectSerializer(serializers.ModelSerializer):
children_count = serializers.SerializerMethodField() children_count = serializers.SerializerMethodField()
has_hadis = serializers.SerializerMethodField() has_hadis = serializers.SerializerMethodField()
hadis_count= serializers.SerializerMethodField() hadis_count= serializers.SerializerMethodField()
title = LocalizedField()
class Meta: class Meta:
model = HadisCategory model = HadisCategory
@ -153,6 +186,8 @@ class HadisCategorySelectSerializer(serializers.ModelSerializer):
return len(Hadis.objects.filter(category=obj)) return len(Hadis.objects.filter(category=obj))
class HadisCategorySelectSourceSerializer(serializers.ModelSerializer): class HadisCategorySelectSourceSerializer(serializers.ModelSerializer):
"""Serializer for HadisCategory Selection Flow""" """Serializer for HadisCategory Selection Flow"""
sect_id = serializers.IntegerField(source='sect.id', read_only=True) sect_id = serializers.IntegerField(source='sect.id', read_only=True)
@ -189,6 +224,8 @@ class CategorySerializer(serializers.ModelSerializer):
children_count = serializers.SerializerMethodField() children_count = serializers.SerializerMethodField()
has_hadis =serializers.SerializerMethodField() has_hadis =serializers.SerializerMethodField()
hadis_count=serializers.SerializerMethodField() hadis_count=serializers.SerializerMethodField()
title = LocalizedField()
description = LocalizedField()
class Meta: class Meta:
@ -206,4 +243,12 @@ class CategorySerializer(serializers.ModelSerializer):
def get_hadis_count(self,obj): def get_hadis_count(self,obj):
return len(Hadis.objects.filter(category=obj)) return len(Hadis.objects.filter(category=obj))
# def get_title(self,obj):
# # ✅ Get language from request
# request = self.context.get('request')
# lang = request.query_params.get('lang', 'ru') if request else 'ru'
# # ✅ CALL THE MODEL METHOD!
# return obj.get_title(lang)

111
apps/hadis/serializers/hadis.py

@ -2,6 +2,7 @@ from rest_framework import serializers
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.fields import SerializerMethodField from rest_framework.fields import SerializerMethodField
from urllib3 import fields from urllib3 import fields
from .category import LocalizedField
from ..models import ( from ..models import (
Hadis, HadisStatus, HadisTag, HadisTransmitter, Hadis, HadisStatus, HadisTag, HadisTransmitter,
@ -11,12 +12,16 @@ from ..models import (
from apps.library.serializers import BookSerializer from apps.library.serializers import BookSerializer
class HadisCollectionListSerializer(serializers.ModelSerializer): class HadisCollectionListSerializer(serializers.ModelSerializer):
thumbnail = serializers.SerializerMethodField() thumbnail = serializers.SerializerMethodField()
title = LocalizedField()
summary = LocalizedField()
class Meta: class Meta:
model = HadisCollection model = HadisCollection
fields = ['id', 'title', 'slug', 'thumbnail']
fields = ['id', 'title', 'summary','slug', 'thumbnail']
def get_thumbnail(self, obj): def get_thumbnail(self, obj):
if obj.thumbnail: if obj.thumbnail:
@ -35,6 +40,8 @@ class HadisSyncSerializer(serializers.ModelSerializer):
narrators = serializers.SerializerMethodField() narrators = serializers.SerializerMethodField()
explanations = serializers.SerializerMethodField() explanations = serializers.SerializerMethodField()
corrections = serializers.SerializerMethodField() corrections = serializers.SerializerMethodField()
title =LocalizedField()
title_narrator = LocalizedField()
class Meta: class Meta:
model = Hadis model = Hadis
@ -149,7 +156,10 @@ class HadisListSerializer(serializers.ModelSerializer):
"""Serializer for Hadis list""" """Serializer for Hadis list"""
category = serializers.SerializerMethodField() category = serializers.SerializerMethodField()
translation = serializers.SerializerMethodField() translation = serializers.SerializerMethodField()
title = serializers.SerializerMethodField()
title = LocalizedField()
title_narrator = LocalizedField()
text = LocalizedField()
title_narrator = LocalizedField()
class Meta: class Meta:
model = Hadis model = Hadis
@ -159,9 +169,17 @@ class HadisListSerializer(serializers.ModelSerializer):
def get_category(self, obj): def get_category(self, obj):
"""Get category id and title""" """Get category id and title"""
if obj.category: if obj.category:
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
out = None
for i in obj.category.title:
if i['language_code']== lang:
out = i['text']
if not out :
out = ''
return { return {
'id': obj.category.id, 'id': obj.category.id,
'title': obj.category.title,
'title': out,
'slug':obj.category.slug, 'slug':obj.category.slug,
'source_type':obj.category.source_type, 'source_type':obj.category.source_type,
'sect_type':obj.category.sect.sect_type 'sect_type':obj.category.sect.sect_type
@ -174,18 +192,18 @@ class HadisListSerializer(serializers.ModelSerializer):
language_code = getattr(request, 'LANGUAGE_CODE', 'en') language_code = getattr(request, 'LANGUAGE_CODE', 'en')
return obj.translation.get(language_code) return obj.translation.get(language_code)
def get_title(self,obj):
# ✅ Get language from request
# def get_title(self,obj):
# # ✅ Get language from request
request = self.context.get('request') request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru' lang = request.query_params.get('lang', 'ru') if request else 'ru'
# ✅ CALL THE MODEL METHOD!
return obj.get_title(lang)
# # ✅ CALL THE MODEL METHOD!
# return obj.get_title(lang)
class HadisStatusSerializer(serializers.ModelSerializer): class HadisStatusSerializer(serializers.ModelSerializer):
"""Serializer for HadisStatus""" """Serializer for HadisStatus"""
title = LocalizedField()
class Meta: class Meta:
model = HadisStatus model = HadisStatus
fields = ['id', 'title', 'color'] fields = ['id', 'title', 'color']
@ -193,6 +211,7 @@ class HadisStatusSerializer(serializers.ModelSerializer):
class HadisTagSerializer(serializers.ModelSerializer): class HadisTagSerializer(serializers.ModelSerializer):
"""Serializer for HadisTag""" """Serializer for HadisTag"""
title = LocalizedField()
class Meta: class Meta:
model = HadisTag model = HadisTag
@ -201,6 +220,9 @@ class HadisTagSerializer(serializers.ModelSerializer):
class TransmitterSerializer(serializers.ModelSerializer): class TransmitterSerializer(serializers.ModelSerializer):
"""Serializer for Transmitters""" """Serializer for Transmitters"""
full_name = LocalizedField()
known_as = LocalizedField()
nickname = LocalizedField()
class Meta: class Meta:
model = Transmitters model = Transmitters
@ -211,6 +233,9 @@ class TransmitterSerializer(serializers.ModelSerializer):
class TransmitterShortSerializer(serializers.ModelSerializer): class TransmitterShortSerializer(serializers.ModelSerializer):
"""Serializer for Transmitters""" """Serializer for Transmitters"""
full_name = LocalizedField()
known_as = LocalizedField()
nickname = LocalizedField()
class Meta: class Meta:
model = Transmitters model = Transmitters
@ -220,6 +245,8 @@ class TransmitterShortSerializer(serializers.ModelSerializer):
] ]
class TransmitterOpinionSerializer(serializers.ModelSerializer): class TransmitterOpinionSerializer(serializers.ModelSerializer):
""" Serializer for TransmitterOpinions """ """ Serializer for TransmitterOpinions """
scholar_name = LocalizedField()
opinion_text = LocalizedField()
class Meta: class Meta:
model = TransmitterOpinion model = TransmitterOpinion
@ -227,6 +254,8 @@ class TransmitterOpinionSerializer(serializers.ModelSerializer):
class TransmitterOriginalTextSerializer(serializers.ModelSerializer): class TransmitterOriginalTextSerializer(serializers.ModelSerializer):
""" Serializer for TransmitterOriginalText """ """ Serializer for TransmitterOriginalText """
title = LocalizedField()
text = LocalizedField()
class Meta: class Meta:
model = TransmitterOriginalText model = TransmitterOriginalText
@ -235,6 +264,16 @@ class TransmitterOriginalTextSerializer(serializers.ModelSerializer):
class TransmitterDetailSerializer(serializers.ModelSerializer): class TransmitterDetailSerializer(serializers.ModelSerializer):
""" Serializer for Details of Transmitters """ """ Serializer for Details of Transmitters """
full_name = LocalizedField()
known_as = LocalizedField()
nickname = LocalizedField()
kunya = LocalizedField()
origin = LocalizedField()
lived_in = LocalizedField()
died_in = LocalizedField()
description = LocalizedField()
class Meta: class Meta:
model = Transmitters model = Transmitters
fields = [ fields = [
@ -316,6 +355,7 @@ class TransmitterSyncSerializer(serializers.ModelSerializer):
class HadisTransmitterSerializer(serializers.ModelSerializer): class HadisTransmitterSerializer(serializers.ModelSerializer):
"""Serializer for HadisTransmitter with transmitter details""" """Serializer for HadisTransmitter with transmitter details"""
transmitter = TransmitterShortSerializer(read_only=True) transmitter = TransmitterShortSerializer(read_only=True)
narrator_layer_description = serializers.SerializerMethodField() narrator_layer_description = serializers.SerializerMethodField()
@ -328,7 +368,13 @@ class HadisTransmitterSerializer(serializers.ModelSerializer):
def get_narrator_layer_description(self, obj): def get_narrator_layer_description(self, obj):
"""Get narrator layer description""" """Get narrator layer description"""
return obj.narrator_layer.description
# ✅ Get language from request
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
# ✅ CALL THE MODEL METHOD!
return obj.narrator_layer.description(lang)
def get_layer(self, obj): def get_layer(self, obj):
"""Get narrator layer slug""" """Get narrator layer slug"""
@ -387,12 +433,17 @@ class HadisReferenceSerializer(serializers.ModelSerializer):
def get_book_title(self, obj): def get_book_title(self, obj):
"""Get book title""" """Get book title"""
# ✅ Get language from request
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
# ✅ CALL THE MODEL METHOD!
try : try :
title = obj.book_reference.title
title = obj.book_reference.title.get(lang)
return title return title
except: except:
return None return None
# def get_book_images(self, obj): # def get_book_images(self, obj):
# """Get book images""" # """Get book images"""
# try : # try :
@ -409,10 +460,14 @@ class HadisReferenceSerializer(serializers.ModelSerializer):
except: except:
return None return None
def get_book_description(self, obj): def get_book_description(self, obj):
"""Get book description""" """Get book description"""
# ✅ Get language from request
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
try : try :
description = obj.book_reference.description
description = obj.book_reference.description.get(lang)
return description return description
except: except:
return None return None
@ -420,15 +475,25 @@ class HadisReferenceSerializer(serializers.ModelSerializer):
class HadisCorrectionSerializer(serializers.ModelSerializer): class HadisCorrectionSerializer(serializers.ModelSerializer):
"""Serializer for HadisCorrection""" """Serializer for HadisCorrection"""
hadis_translation = serializers.SerializerMethodField() hadis_translation = serializers.SerializerMethodField()
title = LocalizedField()
description = LocalizedField()
class Meta: class Meta:
model = HadisCorrection model = HadisCorrection
fields = ['id', 'title', 'description', 'hadis_translation','share_link', 'created_at', 'updated_at'] fields = ['id', 'title', 'description', 'hadis_translation','share_link', 'created_at', 'updated_at']
def get_hadis_translation(self, obj): def get_hadis_translation(self, obj):
"""Get translation based on request language""" """Get translation based on request language"""
request = self.context.get('request')
language_code = getattr(request, 'LANGUAGE_CODE', 'en')
return obj.translation.get(language_code)
return obj.translation
# request = self.context.get('request')
# language_code = getattr(request, 'LANGUAGE_CODE', 'en')
# out = None
# for i in obj.translation:
# print(type(i))
# l = i.get('lang')
# if l == language_code:
# out = i.get('text')
# print(out)
# return out
class HadisBasicSerializer(serializers.ModelSerializer): class HadisBasicSerializer(serializers.ModelSerializer):
@ -436,6 +501,11 @@ class HadisBasicSerializer(serializers.ModelSerializer):
translation = serializers.SerializerMethodField() translation = serializers.SerializerMethodField()
category = serializers.SerializerMethodField() category = serializers.SerializerMethodField()
title = LocalizedField()
title_narrator = LocalizedField()
text = LocalizedField()
explanation = LocalizedField()
class Meta: class Meta:
model = Hadis model = Hadis
fields = [ fields = [
@ -448,12 +518,21 @@ class HadisBasicSerializer(serializers.ModelSerializer):
request = self.context.get('request') request = self.context.get('request')
language_code = getattr(request, 'LANGUAGE_CODE', 'en') language_code = getattr(request, 'LANGUAGE_CODE', 'en')
return obj.translation.get(language_code) return obj.translation.get(language_code)
def get_category(self, obj): def get_category(self, obj):
"""Get category id and title""" """Get category id and title"""
if obj.category: if obj.category:
request = self.context.get('request')
lang = request.query_params.get('lang', 'ru') if request else 'ru'
out = None
for i in obj.category.title:
if i['language_code']== lang:
out = i['text']
if not out :
out = ''
return { return {
'id': obj.category.id, 'id': obj.category.id,
'title': obj.category.title,
'title': out,
'slug':obj.category.slug, 'slug':obj.category.slug,
'source_type':obj.category.source_type, 'source_type':obj.category.source_type,
'sect_type':obj.category.sect.sect_type 'sect_type':obj.category.sect.sect_type
@ -470,6 +549,8 @@ class HadisDetailSerializer(serializers.ModelSerializer):
read_only=True read_only=True
) )
reference_images = SerializerMethodField() reference_images = SerializerMethodField()
hadis_status_text = LocalizedField()
address = LocalizedField()
class Meta: class Meta:
model = Hadis model = Hadis

48
apps/hadis/views/hadis.py

@ -5,8 +5,8 @@ from rest_framework.response import Response
from django.db.models import Count from django.db.models import Count
from django.db.models import Prefetch from django.db.models import Prefetch
from ..models import HadisCategory, Hadis, HadisCollection,HadisTransmitter
from ..serializers import HadisListSerializer, HadisBasicSerializer, HadisDetailSerializer, HadisCollectionListSerializer, HadisSyncSerializer,HadisTransmitterSerializer,HadisTransmitterListSerializer
from ..models import HadisCategory, Hadis, HadisCollection,HadisTransmitter , HadisCorrection
from ..serializers import HadisListSerializer, HadisBasicSerializer, HadisDetailSerializer, HadisCollectionListSerializer, HadisSyncSerializer,HadisCorrectionSerializer,HadisTransmitterListSerializer
from ..docs import hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger, hadis_transmitters_swagger, hadis_corrections_swagger, hadis_basic_swagger from ..docs import hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger, hadis_transmitters_swagger, hadis_corrections_swagger, hadis_basic_swagger
@ -157,33 +157,37 @@ class HadisTransmittersView(RetrieveAPIView):
Prefetch('transmitters', queryset=transmitter_qs) Prefetch('transmitters', queryset=transmitter_qs)
) )
class HadisCorrectionsView(RetrieveAPIView):
class HadisCorrectionsView(ListAPIView):
""" """
API view to retrieve corrections for a specific hadis API view to retrieve corrections for a specific hadis
""" """
serializer_class = HadisDetailSerializer
serializer_class = HadisCorrectionSerializer
lookup_field = 'id' lookup_field = 'id'
lookup_url_kwarg = 'hadis_id' lookup_url_kwarg = 'hadis_id'
@hadis_corrections_swagger @hadis_corrections_swagger
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
hadis = self.get_object()
corrections_data = []
for correction in hadis.hadiscorrection_set.all():
correction_info = {
'id': correction.id,
'title': correction.title,
'description': correction.description,
'translation': correction.translation
}
corrections_data.append(correction_info)
return Response({
'hadis_id': hadis.id,
'corrections_count': len(corrections_data),
'corrections': corrections_data
})
return self.list(request, *args, **kwargs)
# hadis = self.get_object()
# corrections_data = []
# for correction in hadis.hadiscorrection_set.all():
# correction_info = {
# 'id': correction.id,
# 'title': correction.title,
# 'description': correction.description,
# 'translation': correction.translation
# }
# corrections_data.append(correction_info)
# return Response({
# 'hadis_id': hadis.id,
# 'corrections_count': len(corrections_data),
# 'corrections': corrections_data
# })
def get_queryset(self): def get_queryset(self):
return Hadis.objects.filter(status=True).prefetch_related('hadiscorrection_set')
hadis_id = self.kwargs.get('hadis_id')
if not HadisCorrection.objects.filter(hadis=hadis_id).exists():
return Hadis.objects.none()
return HadisCorrection.objects.filter(hadis=hadis_id)
Loading…
Cancel
Save