From 3f97e99642aaa9276484d1713b041f446fc87c01 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Mon, 6 Apr 2026 09:10:43 +0330 Subject: [PATCH] enhance transmitters section script to update madhhab and generation values enhance search query and filtering params --- apps/hadis/docs.py | 7 +++ .../commands/update_transmitters_data.py | 49 +++++++++++++++++++ apps/hadis/views/transmitter.py | 19 +++++-- 3 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 apps/hadis/management/commands/update_transmitters_data.py diff --git a/apps/hadis/docs.py b/apps/hadis/docs.py index 1cf4b5d..1f5ac31 100644 --- a/apps/hadis/docs.py +++ b/apps/hadis/docs.py @@ -988,6 +988,13 @@ transmitter_list_swagger = swagger_auto_schema( type=openapi.TYPE_INTEGER, required=False ), + openapi.Parameter( + 'search', + openapi.IN_QUERY, + description='Search by name, kunya, known_as, or nickname', + type=openapi.TYPE_STRING, + required=False + ), ], responses={ status.HTTP_200_OK: openapi.Response( diff --git a/apps/hadis/management/commands/update_transmitters_data.py b/apps/hadis/management/commands/update_transmitters_data.py new file mode 100644 index 0000000..f80af19 --- /dev/null +++ b/apps/hadis/management/commands/update_transmitters_data.py @@ -0,0 +1,49 @@ +import random +from django.core.management.base import BaseCommand +from apps.hadis.models.transmitter import Transmitters + +class Command(BaseCommand): + help = 'Update all transmitters with random generation (1-10) and random madhab' + + def handle(self, *args, **options): + # We use the active madhab choices define in the Transmitters model + # Currently active choices in transmitter.py: SHIA, SUNNI, OTHER, UNKNOWN + madhab_choices = [ + Transmitters.MadhhabChoices.SHIA, + Transmitters.MadhhabChoices.SUNNI, + Transmitters.MadhhabChoices.OTHER, + Transmitters.MadhhabChoices.UNKNOWN, + ] + + # Get all transmitters + transmitters = Transmitters.objects.all() + count = transmitters.count() + + if count == 0: + self.stdout.write(self.style.WARNING("No Transmitters found in the database.")) + return + + self.stdout.write(self.style.WARNING(f'Starting update for {count} transmitters...')) + + updated_count = 0 + + # It's better to iterate through the queryset and save each instance to trigger any save() logic if present + for transmitter in transmitters: + try: + # Assign random generation between 1-10 + transmitter.generation = random.randint(1, 10) + + # Assign random madhab from available choices + transmitter.madhhab = random.choice(madhab_choices) + + # Save the record + transmitter.save() + updated_count += 1 + + if updated_count % 100 == 0: + self.stdout.write(f'Updated {updated_count}/{count}...') + + except Exception as e: + self.stderr.write(self.style.ERROR(f'Error updating transmitter ID {transmitter.id}: {str(e)}')) + + self.stdout.write(self.style.SUCCESS(f'Successfully updated {updated_count} transmitters.')) diff --git a/apps/hadis/views/transmitter.py b/apps/hadis/views/transmitter.py index 093d389..1eb3c44 100644 --- a/apps/hadis/views/transmitter.py +++ b/apps/hadis/views/transmitter.py @@ -1,5 +1,5 @@ from django.contrib.admin.utils import lookup_field -from django.db.models import Prefetch +from django.db.models import Prefetch, Q from rest_framework.generics import ListAPIView , RetrieveAPIView from rest_framework.response import Response @@ -25,15 +25,28 @@ class TransmitterView(ListAPIView): def get_queryset(self): queryset = Transmitters.objects.all() + # Get query parameters + search_query = self.request.query_params.get('search', None) status_filter = self.request.query_params.get('status', None) + madhhab_filter = self.request.query_params.get('madhhab', None) + generation_filter = self.request.query_params.get('generation', None) + + # 1. Apply search filter (Searching across name-related JSONFields) + if search_query: + queryset = queryset.filter( + Q(full_name__icontains=search_query) | + Q(kunya__icontains=search_query) | + Q(known_as__icontains=search_query) | + Q(nickname__icontains=search_query) + ) + + # 2. Apply categorical filters if status_filter: queryset = queryset.filter(reliability__slug=status_filter) - madhhab_filter = self.request.query_params.get('madhhab', None) if madhhab_filter: queryset = queryset.filter(madhhab=madhhab_filter) - generation_filter = self.request.query_params.get('generation', None) if generation_filter: queryset = queryset.filter(generation=generation_filter)