From cb86899aa25bc8d5e004bb991db15d5da6ac8fba Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Tue, 23 Dec 2025 12:35:37 +0330 Subject: [PATCH] transmitters filters url added. --- apps/hadis/docs.py | 65 +++++++++++++++++++ .../migrations/0071_merge_20251223_1055.py | 12 ++++ .../0072_transmitterreliability_slug.py | 19 ++++++ apps/hadis/models/transmitter.py | 7 ++ apps/hadis/serializers/hadis.py | 2 + apps/hadis/urls.py | 3 +- apps/hadis/views/transmitter.py | 52 ++++++++++++++- locale/fa/LC_MESSAGES/django.po | 22 +++++++ locale/ru/LC_MESSAGES/django.po | 22 +++++++ 9 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 apps/hadis/migrations/0071_merge_20251223_1055.py create mode 100644 apps/hadis/migrations/0072_transmitterreliability_slug.py diff --git a/apps/hadis/docs.py b/apps/hadis/docs.py index 73632b8..f76e180 100644 --- a/apps/hadis/docs.py +++ b/apps/hadis/docs.py @@ -806,6 +806,71 @@ transmitter_list_swagger = swagger_auto_schema( } ) +transmitter_filters_swagger = swagger_auto_schema( + operation_description="Get the needed data for filter lists such as madhabs,generations,reliabilities.", + operation_summary="Transmitter's List's filters", + operation_id="transmiterfilter", + tags=['Hadis'], + manual_parameters=[ + openapi.Parameter( + 'Accept-Language', + openapi.IN_HEADER, + description="Language code for localized content. Supported codes: 'en' (English), 'fa' (Persian), 'ar' (Arabic), 'ur' (Urdu), 'ru' (Russian). Defaults to 'en' if not specified.", + type=openapi.TYPE_STRING, + required=False, + default='en', + enum=['en', 'fa', 'ar', 'ur', 'ru'] + ) + ], + responses={ + status.HTTP_200_OK: openapi.Response( + description="list of transmitters filter data", + examples={ + "application/json": { + "count": 10, + "next": "http://api.example.com/transmitters/?page=2", + "previous": None, + "results": [ + { + "generations": [1,2,3,4,5], + "madhabs": [ + { + "text": "Shia", + "slug": "shia" + }, + { + "text": "Sunni", + "slug": "sunni" + }, + { + "text": "Hanafi", + "slug": "hanafi" + } + ], + "reliabilities": [ + { + "text": "Very Reliable", + "slug": "very-reliable" + }, + { + "text": "Reliable", + "slug": "reliable" + }, + { + "text": "Acceptable", + "slug": "acceptable" + }, + ] + } + ] + } + } + ), + status.HTTP_500_INTERNAL_SERVER_ERROR: openapi.Response( + description="Internal server error" + ) + } +) # Swagger documentation for TransmitterDetailView transmitter_detail_swagger = swagger_auto_schema( diff --git a/apps/hadis/migrations/0071_merge_20251223_1055.py b/apps/hadis/migrations/0071_merge_20251223_1055.py new file mode 100644 index 0000000..1aeb506 --- /dev/null +++ b/apps/hadis/migrations/0071_merge_20251223_1055.py @@ -0,0 +1,12 @@ +# Generated by Django 4.2.27 on 2025-12-23 10:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0070_alter_transmitters_reliability"), + ("hadis", "0070_migrate_transmitter_reliability_data"), + ] + + operations = [] diff --git a/apps/hadis/migrations/0072_transmitterreliability_slug.py b/apps/hadis/migrations/0072_transmitterreliability_slug.py new file mode 100644 index 0000000..ce0b4e6 --- /dev/null +++ b/apps/hadis/migrations/0072_transmitterreliability_slug.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.27 on 2025-12-23 10:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0071_merge_20251223_1055"), + ] + + operations = [ + migrations.AddField( + model_name="transmitterreliability", + name="slug", + field=models.SlugField( + blank=True, max_length=255, null=True, verbose_name="slug" + ), + ), + ] diff --git a/apps/hadis/models/transmitter.py b/apps/hadis/models/transmitter.py index 3e7371a..bdea15b 100644 --- a/apps/hadis/models/transmitter.py +++ b/apps/hadis/models/transmitter.py @@ -83,9 +83,16 @@ class TransmitterReliability(models.Model): GRAY = 'gray', _('Gray') title = models.JSONField(default = list , verbose_name=_('Title')) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True) color = models.CharField(max_length=20, choices=ColorChoices.choices, verbose_name=_('color')) + def save(self, *args, **kwargs): + if not self.slug: + slug = slugify(self.name[0]['text']) + self.slug = slug + super().save(*args, **kwargs) + def __str__(self): return self.title[0]['text'] diff --git a/apps/hadis/serializers/hadis.py b/apps/hadis/serializers/hadis.py index 66b6724..9c5fec3 100644 --- a/apps/hadis/serializers/hadis.py +++ b/apps/hadis/serializers/hadis.py @@ -341,6 +341,8 @@ class TransmitterDetailSerializer(serializers.ModelSerializer): } return None +class TransmittersFiltersSerializer(serializers.ModelSerializer): + pass class TransmitterSyncSerializer(serializers.ModelSerializer): """Serializer for syncing all transmitter data for offline mode""" diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index a02725f..5fbbcde 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -1,7 +1,7 @@ from django.urls import path from .views.category import HadisCategorySectListView, HadisCategoryTreeView, CategoriesView, CategoriesBySectView, HadisCategorySelectBySectView, HadisCategorySelectBySectSourceView , HadisCategoryTreeNormalView from .views.hadis import HadisCollectionListView, HadisListView, HadisBasicView, HadisDetailView, HadisSyncView, HadisTransmittersView, HadisCorrectionsView,HadisMainListView -from .views.transmitter import TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView +from .views.transmitter import TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView, TransmitterFiltersView from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView from .views.info import HadisInfoView @@ -32,6 +32,7 @@ urlpatterns = [ path('narrators//original_texts', TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), path('narrators/', TransmitterDetailView.as_view(), name='narrator-detail'), path('narrators/', TransmitterView.as_view(), name='narrators'), + path('narrators/filters/', TransmitterFiltersView.as_view(), name='narrator-filters'), # Reference paths path('references/', BookDetailView.as_view(), name='reference-detail'), diff --git a/apps/hadis/views/transmitter.py b/apps/hadis/views/transmitter.py index fd2e151..dc6bdbd 100644 --- a/apps/hadis/views/transmitter.py +++ b/apps/hadis/views/transmitter.py @@ -5,8 +5,12 @@ from rest_framework.response import Response from ..models import Transmitters , TransmitterOpinion, TransmitterOriginalText from ..serializers import TransmitterSerializer , TransmitterDetailSerializer, TransmitterSyncSerializer,TransmitterOpinionSerializer, TransmitterOriginalTextSerializer -from ..docs import transmitter_list_swagger, transmitter_detail_swagger, transmitter_sync_swagger, transmitter_opinion_swagger, transmitter_original_text_swagger +from ..docs import transmitter_filters_swagger,transmitter_list_swagger, transmitter_detail_swagger, transmitter_sync_swagger, transmitter_opinion_swagger, transmitter_original_text_swagger from utils.pagination import NoPagination +from .category import get_localized_text + +class TransmitterFliterView(ListAPIView): + pass class TransmitterView(ListAPIView): queryset = Transmitters.objects.all() @@ -124,3 +128,49 @@ class TransmitterSyncView(ListAPIView): return Response(response_data) + +class TransmitterFiltersView(ListAPIView): + """ + API view to return filter data for transmitters + Returns generations, madhabs, and reliabilities for filtering + """ + + @transmitter_filters_swagger + def get(self, request, *args, **kwargs): + return self.list(request, *args, **kwargs) + + def get_queryset(self): + # This view doesn't need a queryset, it returns computed data + return Transmitters.objects.none() + + def list(self, request, *args, **kwargs): + # Get all unique generations + generations = Transmitters.objects.exclude(generation__isnull=True).values_list('generation', flat=True).distinct().order_by('generation') + + # Get madhhab choices + madhabs = [] + for choice in Transmitters.MadhhabChoices: + madhabs.append({ + 'text': str(choice.label), + 'slug': choice.value + }) + + # Get reliabilities from TransmitterReliability model + from ..models.transmitter import TransmitterReliability + reliabilities = [] + for reliability in TransmitterReliability.objects.all().order_by('id'): + # Get the English title for the slug + if reliability.title: + reliabilities.append({ + 'text': get_localized_text(reliability.title,request), + 'slug': reliability.slug + }) + + response_data = { + 'generations': list(generations), + 'madhabs': madhabs, + 'reliabilities': reliabilities + } + + return Response(response_data) + diff --git a/locale/fa/LC_MESSAGES/django.po b/locale/fa/LC_MESSAGES/django.po index 221e9c7..ef9a417 100644 --- a/locale/fa/LC_MESSAGES/django.po +++ b/locale/fa/LC_MESSAGES/django.po @@ -1304,3 +1304,25 @@ msgstr "" #: utils/keyval_field.py:162 utils/keyval_field.py:172 msgid "Description" msgstr "" + + +msgid "Shia" +msgstr "شیعه" + +msgid "Sunni" +msgstr "سنی" + +msgid "Hanafi" +msgstr "حنفی" + +msgid "Maliki" +msgstr "مالکی" + +msgid "Shafi'i" +msgstr "شافعی" + +msgid "Hanbali" +msgstr "حنبلی" + +msgid "Other" +msgstr "سایر" \ No newline at end of file diff --git a/locale/ru/LC_MESSAGES/django.po b/locale/ru/LC_MESSAGES/django.po index abab263..c9d15d8 100644 --- a/locale/ru/LC_MESSAGES/django.po +++ b/locale/ru/LC_MESSAGES/django.po @@ -1305,3 +1305,25 @@ msgstr "" #: utils/keyval_field.py:162 utils/keyval_field.py:172 msgid "Description" msgstr "" + + +msgid "Shia" +msgstr "Шиит" + +msgid "Sunni" +msgstr "Суннит" + +msgid "Hanafi" +msgstr "Ханафит" + +msgid "Maliki" +msgstr "Маликит" + +msgid "Shafi'i" +msgstr "Шафиит" + +msgid "Hanbali" +msgstr "Ханбалит" + +msgid "Other" +msgstr "Другой"