|
|
|
@ -575,8 +575,48 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): |
|
|
|
'description': get_localized_text(obj.description, request), |
|
|
|
'thumbnail': obj.thumbnail.url if obj.thumbnail else None, |
|
|
|
'share_link': obj.share_link, |
|
|
|
'tadlis': obj.tadlis, |
|
|
|
'ikhtilat': obj.ikhtilat, |
|
|
|
'companion_type': obj.companion_type, |
|
|
|
'relatives': self._get_relatives(obj, request), |
|
|
|
} |
|
|
|
|
|
|
|
def _get_relatives(self, obj, request): |
|
|
|
relatives_qs = obj.relatives.all() |
|
|
|
|
|
|
|
grouped = {} |
|
|
|
for rel in relatives_qs: |
|
|
|
rel_type = rel.relation_type |
|
|
|
slug = rel.narrator.slug if rel.narrator else None |
|
|
|
|
|
|
|
name = rel.name |
|
|
|
if rel.narrator and not name: |
|
|
|
name = get_localized_text(rel.narrator.full_name, request) |
|
|
|
|
|
|
|
item = { |
|
|
|
"name": name, |
|
|
|
"slug": slug |
|
|
|
} |
|
|
|
|
|
|
|
if rel_type not in grouped: |
|
|
|
grouped[rel_type] = { |
|
|
|
"relation_value": get_localized_text(rel.relation_value, request) if rel.relation_value else None, |
|
|
|
"arabic_relation_value": get_arabic_localized_text(rel.relation_value) if rel.relation_value else None, |
|
|
|
"items": [] |
|
|
|
} |
|
|
|
grouped[rel_type]["items"].append(item) |
|
|
|
|
|
|
|
result = [] |
|
|
|
for rel_type, data in grouped.items(): |
|
|
|
result.append({ |
|
|
|
"relation_type": rel_type, |
|
|
|
"relation_value": data["relation_value"], |
|
|
|
"arabic_relation_value": data["arabic_relation_value"], |
|
|
|
"members": data["items"] |
|
|
|
}) |
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
def get_scholars_opinions(self, obj): |
|
|
|
"""Get all scholarly opinions about this transmitter""" |
|
|
|
request = self.context.get('request') # ← FIX: Define request |
|
|
|
@ -585,12 +625,14 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): |
|
|
|
{ |
|
|
|
'id': opinion.id, |
|
|
|
'scholar_name': get_localized_text(opinion.scholar_name, request), |
|
|
|
'arabic_scholar_name': get_arabic_localized_text(opinion.scholar_name), |
|
|
|
'scholar': { |
|
|
|
'id': opinion.scholar.id, |
|
|
|
'name': get_localized_text(opinion.scholar.name, request), |
|
|
|
'slug': opinion.scholar.slug |
|
|
|
} if opinion.scholar else None, |
|
|
|
'opinion_text': get_localized_text(opinion.opinion_text, request), |
|
|
|
'arabic_opinion_text': get_arabic_localized_text(opinion.opinion_text), |
|
|
|
'status': { |
|
|
|
'id': opinion.status.id, |
|
|
|
'title': get_localized_text(opinion.status.title, request), |
|
|
|
@ -614,10 +656,8 @@ class TransmitterSyncSerializer(serializers.ModelSerializer): |
|
|
|
).data |
|
|
|
|
|
|
|
def get_hadis(self, obj): |
|
|
|
# چون از related_name='hadises' در مدل HadisTransmitter استفاده شده، |
|
|
|
# لیست تمام رکوردهای واسط را میگیریم. |
|
|
|
# استفاده از set باعث میشود اگر یک راوی در ۲ سند از یک حدیث بود، آیدی آن حدیث تکراری نشود. |
|
|
|
return list(set(item.hadis_id for item in obj.hadises.all() if item.hadis_id)) |
|
|
|
categories_map = self.context.get('categories_map', {}) |
|
|
|
return list(categories_map.get(int(obj.id), set())) |
|
|
|
def get_relations(self, obj): |
|
|
|
""" |
|
|
|
استخراج آنی آیدی اساتید و شاگردان از کانتکست بدون اجرای کوئری اضافه |
|
|
|
|