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

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

138
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

110
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

155
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}"
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 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)

111
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

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 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)
Loading…
Cancel
Save