diff --git a/apps/hadis/models/category.py b/apps/hadis/models/category.py index 52b4363..9ba3d1e 100644 --- a/apps/hadis/models/category.py +++ b/apps/hadis/models/category.py @@ -18,6 +18,41 @@ class HadisSect(models.Model): def __str__(self): 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: @@ -74,4 +109,39 @@ class HadisCategory(MPTTModel): def __str__(self): 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 + \ No newline at end of file diff --git a/apps/hadis/models/hadis.py b/apps/hadis/models/hadis.py index 1e844fa..454ec77 100644 --- a/apps/hadis/models/hadis.py +++ b/apps/hadis/models/hadis.py @@ -6,7 +6,6 @@ from django.utils.text import slugify from filer.fields.image import FilerImageField from .reference import BookReference - class HadisCollection(models.Model): title = models.JSONField(default = list , verbose_name=_('Title')) slug = models.SlugField(max_length=255, unique=True, verbose_name=_('slug'), blank=True) @@ -37,6 +36,40 @@ class HadisCollection(models.Model): def __str__(self): 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: verbose_name = _('hadis collection') @@ -69,6 +102,23 @@ class HadisTag(models.Model): def __str__(self): 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 ColorChoices(models.TextChoices): @@ -88,6 +138,23 @@ class HadisStatus(models.Model): def __str__(self): 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: verbose_name = _('hadis status') verbose_name_plural = _('hadis statuses') @@ -158,8 +225,10 @@ class Hadis(models.Model): def get_description(self, lang): return self._get_json_field("description" , lang) + def get_hadis_status_text(self, lang): return self._get_json_field("hadis_status_text" , lang) + def get_address(self, lang): return self._get_json_field("address" , lang) @@ -218,6 +287,22 @@ class HadisReference(models.Model): verbose_name = _('Hadis Reference') verbose_name_plural = _('Hadis References') # 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): 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): 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 diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index 342a203..8641a91 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -37,6 +37,48 @@ class BookReference(models.Model): def __str__(self): 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): if not self.slug: base_slug = slugify(self.title, allow_unicode=True) @@ -69,6 +111,23 @@ class BookReferenceImage(models.Model): verbose_name_plural = _('Book Reference Images') 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): return f"{self.book_reference.title} - Image {self.order}" @@ -96,6 +155,23 @@ class BookAuthor(models.Model): def __str__(self): 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): """ @@ -121,3 +197,37 @@ class BookAttribute(models.Model): def __str__(self): 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 diff --git a/apps/hadis/models/transmitter.py b/apps/hadis/models/transmitter.py index 737d2f9..83a4571 100644 --- a/apps/hadis/models/transmitter.py +++ b/apps/hadis/models/transmitter.py @@ -27,6 +27,40 @@ class NarratorLayer(models.Model): def __str__(self): 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): if not self.slug: @@ -126,6 +160,56 @@ class Transmitters(models.Model): self.slug = slug 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): return self.full_name @@ -221,6 +305,40 @@ class TransmitterOpinion(models.Model): def __str__(self): 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): transmitter = models.ForeignKey( Transmitters, @@ -234,4 +352,39 @@ class TransmitterOriginalText(models.Model): share_link = models.CharField(max_length=255, verbose_name=_('share link'), null=True, blank=True) def __str__(self): - return f"{self.title} by {self.transmitter.full_name}" \ No newline at end of file + 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 \ No newline at end of file diff --git a/apps/hadis/serializers/category.py b/apps/hadis/serializers/category.py index 833e118..3ce4b7e 100644 --- a/apps/hadis/serializers/category.py +++ b/apps/hadis/serializers/category.py @@ -1,14 +1,44 @@ +from dataclasses import fields +from turtle import title from rest_framework import serializers from django.utils.translation import gettext_lazy as _ from django.db.models import Count 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): """Serializer for HadisSect list with grouped response""" source_types = serializers.SerializerMethodField() + title = LocalizedField() class Meta: model = HadisSect @@ -23,7 +53,9 @@ class HadisCategorySectListSerializer(serializers.ModelSerializer): + class HadisCategoryTreeSerializer(serializers.ModelSerializer): + title = LocalizedField() """Serializer for HadisCategory tree structure""" sect_id = serializers.IntegerField(source='sect.id', 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() has_hadis = serializers.SerializerMethodField() hadis_count= serializers.SerializerMethodField() + title = LocalizedField() class Meta: model = HadisCategory @@ -153,6 +186,8 @@ class HadisCategorySelectSerializer(serializers.ModelSerializer): return len(Hadis.objects.filter(category=obj)) + + class HadisCategorySelectSourceSerializer(serializers.ModelSerializer): """Serializer for HadisCategory Selection Flow""" sect_id = serializers.IntegerField(source='sect.id', read_only=True) @@ -189,6 +224,8 @@ class CategorySerializer(serializers.ModelSerializer): children_count = serializers.SerializerMethodField() has_hadis =serializers.SerializerMethodField() hadis_count=serializers.SerializerMethodField() + title = LocalizedField() + description = LocalizedField() class Meta: @@ -205,5 +242,13 @@ class CategorySerializer(serializers.ModelSerializer): return Hadis.objects.filter(category=obj).exists() def get_hadis_count(self,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) diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 176482c..ac649de 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -2,6 +2,7 @@ from rest_framework import serializers from django.utils.translation import gettext_lazy as _ from rest_framework.fields import SerializerMethodField from urllib3 import fields +from .category import LocalizedField from ..models import ( Hadis, HadisStatus, HadisTag, HadisTransmitter, @@ -11,12 +12,16 @@ from ..models import ( from apps.library.serializers import BookSerializer + + class HadisCollectionListSerializer(serializers.ModelSerializer): thumbnail = serializers.SerializerMethodField() + title = LocalizedField() + summary = LocalizedField() class Meta: model = HadisCollection - fields = ['id', 'title', 'slug', 'thumbnail'] + fields = ['id', 'title', 'summary','slug', 'thumbnail'] def get_thumbnail(self, obj): if obj.thumbnail: @@ -35,6 +40,8 @@ class HadisSyncSerializer(serializers.ModelSerializer): narrators = serializers.SerializerMethodField() explanations = serializers.SerializerMethodField() corrections = serializers.SerializerMethodField() + title =LocalizedField() + title_narrator = LocalizedField() class Meta: model = Hadis @@ -149,7 +156,10 @@ class HadisListSerializer(serializers.ModelSerializer): """Serializer for Hadis list""" category = serializers.SerializerMethodField() translation = serializers.SerializerMethodField() - title = serializers.SerializerMethodField() + title = LocalizedField() + title_narrator = LocalizedField() + text = LocalizedField() + title_narrator = LocalizedField() class Meta: model = Hadis @@ -159,9 +169,17 @@ class HadisListSerializer(serializers.ModelSerializer): def get_category(self, obj): """Get category id and title""" 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 { 'id': obj.category.id, - 'title': obj.category.title, + 'title': out, 'slug':obj.category.slug, 'source_type':obj.category.source_type, 'sect_type':obj.category.sect.sect_type @@ -174,18 +192,18 @@ class HadisListSerializer(serializers.ModelSerializer): language_code = getattr(request, 'LANGUAGE_CODE', 'en') 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') 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): """Serializer for HadisStatus""" - + title = LocalizedField() class Meta: model = HadisStatus fields = ['id', 'title', 'color'] @@ -193,6 +211,7 @@ class HadisStatusSerializer(serializers.ModelSerializer): class HadisTagSerializer(serializers.ModelSerializer): """Serializer for HadisTag""" + title = LocalizedField() class Meta: model = HadisTag @@ -201,6 +220,9 @@ class HadisTagSerializer(serializers.ModelSerializer): class TransmitterSerializer(serializers.ModelSerializer): """Serializer for Transmitters""" + full_name = LocalizedField() + known_as = LocalizedField() + nickname = LocalizedField() class Meta: model = Transmitters @@ -211,6 +233,9 @@ class TransmitterSerializer(serializers.ModelSerializer): class TransmitterShortSerializer(serializers.ModelSerializer): """Serializer for Transmitters""" + full_name = LocalizedField() + known_as = LocalizedField() + nickname = LocalizedField() class Meta: model = Transmitters @@ -220,6 +245,8 @@ class TransmitterShortSerializer(serializers.ModelSerializer): ] class TransmitterOpinionSerializer(serializers.ModelSerializer): """ Serializer for TransmitterOpinions """ + scholar_name = LocalizedField() + opinion_text = LocalizedField() class Meta: model = TransmitterOpinion @@ -227,6 +254,8 @@ class TransmitterOpinionSerializer(serializers.ModelSerializer): class TransmitterOriginalTextSerializer(serializers.ModelSerializer): """ Serializer for TransmitterOriginalText """ + title = LocalizedField() + text = LocalizedField() class Meta: model = TransmitterOriginalText @@ -235,6 +264,16 @@ class TransmitterOriginalTextSerializer(serializers.ModelSerializer): class TransmitterDetailSerializer(serializers.ModelSerializer): """ 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: model = Transmitters fields = [ @@ -316,6 +355,7 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): class HadisTransmitterSerializer(serializers.ModelSerializer): + """Serializer for HadisTransmitter with transmitter details""" transmitter = TransmitterShortSerializer(read_only=True) narrator_layer_description = serializers.SerializerMethodField() @@ -328,7 +368,13 @@ class HadisTransmitterSerializer(serializers.ModelSerializer): def get_narrator_layer_description(self, obj): """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): """Get narrator layer slug""" @@ -387,12 +433,17 @@ class HadisReferenceSerializer(serializers.ModelSerializer): def get_book_title(self, obj): """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 : - title = obj.book_reference.title + title = obj.book_reference.title.get(lang) return title except: return None + # def get_book_images(self, obj): # """Get book images""" # try : @@ -408,11 +459,15 @@ class HadisReferenceSerializer(serializers.ModelSerializer): return authors except: return None + def get_book_description(self, obj): """Get book description""" + # ✅ Get language from request + request = self.context.get('request') + lang = request.query_params.get('lang', 'ru') if request else 'ru' try : - description = obj.book_reference.description + description = obj.book_reference.description.get(lang) return description except: return None @@ -420,21 +475,36 @@ class HadisReferenceSerializer(serializers.ModelSerializer): class HadisCorrectionSerializer(serializers.ModelSerializer): """Serializer for HadisCorrection""" hadis_translation = serializers.SerializerMethodField() + title = LocalizedField() + description = LocalizedField() class Meta: model = HadisCorrection fields = ['id', 'title', 'description', 'hadis_translation','share_link', 'created_at', 'updated_at'] def get_hadis_translation(self, obj): """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): """Basic serializer for Hadis with minimal information""" translation = serializers.SerializerMethodField() category = serializers.SerializerMethodField() + + title = LocalizedField() + title_narrator = LocalizedField() + text = LocalizedField() + explanation = LocalizedField() class Meta: model = Hadis @@ -448,12 +518,21 @@ class HadisBasicSerializer(serializers.ModelSerializer): request = self.context.get('request') language_code = getattr(request, 'LANGUAGE_CODE', 'en') return obj.translation.get(language_code) + def get_category(self, obj): """Get category id and title""" 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 { 'id': obj.category.id, - 'title': obj.category.title, + 'title': out, 'slug':obj.category.slug, 'source_type':obj.category.source_type, 'sect_type':obj.category.sect.sect_type @@ -470,6 +549,8 @@ class HadisDetailSerializer(serializers.ModelSerializer): read_only=True ) reference_images = SerializerMethodField() + hadis_status_text = LocalizedField() + address = LocalizedField() class Meta: model = Hadis diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 00c8dbf..12f7630 100644 --- a/apps/hadis/views/hadis.py +++ b/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 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 @@ -157,33 +157,37 @@ class HadisTransmittersView(RetrieveAPIView): Prefetch('transmitters', queryset=transmitter_qs) ) -class HadisCorrectionsView(RetrieveAPIView): +class HadisCorrectionsView(ListAPIView): """ API view to retrieve corrections for a specific hadis """ - serializer_class = HadisDetailSerializer + serializer_class = HadisCorrectionSerializer lookup_field = 'id' lookup_url_kwarg = 'hadis_id' @hadis_corrections_swagger 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): - 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)