diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index ab37968..577ced0 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -1,7 +1,8 @@ from rest_framework import serializers from ..models import ( Hadis, HadisCategory, HadisStatus, HadisTag, HadisCorrection, HadisInterpretation, HadisSect, - BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType + BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, + Transmitters, TransmitterReliability ) from .category import LocalizedField @@ -190,6 +191,91 @@ class AbsoluteFileField(serializers.FileField): return url +class AdminTransmitterReliabilitySerializer(serializers.ModelSerializer): + class Meta: + model = TransmitterReliability + fields = ["id", "title", "slug", "color", "main_color_code"] + + +class AdminTransmitterListSerializer(serializers.ModelSerializer): + reliability_detail = AdminTransmitterReliabilitySerializer(source="reliability", read_only=True) + full_name = serializers.JSONField() + known_as = serializers.JSONField() + nickname = serializers.JSONField() + thumbnail = AbsoluteImageField(required=False, allow_null=True) + share_link = serializers.CharField(read_only=True) + + class Meta: + model = Transmitters + fields = [ + "id", + "full_name", + "slug", + "birth_year_hijri", + "death_year_hijri", + "known_as", + "nickname", + "reliability", + "reliability_detail", + "madhhab", + "generation", + "thumbnail", + "share_link", + "created_at", + "updated_at", + ] + read_only_fields = ["id", "slug", "share_link", "created_at", "updated_at"] + + +class AdminTransmitterDetailSerializer(serializers.ModelSerializer): + reliability_detail = AdminTransmitterReliabilitySerializer(source="reliability", read_only=True) + full_name = serializers.JSONField() + kunya = serializers.JSONField() + known_as = serializers.JSONField() + nickname = serializers.JSONField() + origin = serializers.JSONField() + lived_in = serializers.JSONField() + died_in = serializers.JSONField() + description = serializers.JSONField() + thumbnail = AbsoluteImageField(required=False, allow_null=True) + reliability = serializers.PrimaryKeyRelatedField( + queryset=TransmitterReliability.objects.all(), + required=False, + ) + share_link = serializers.CharField(read_only=True) + + class Meta: + model = Transmitters + fields = [ + "id", + "full_name", + "kunya", + "known_as", + "nickname", + "slug", + "legacy_number", + "legacy_id", + "birth_year_hijri", + "death_year_hijri", + "age_at_death", + "generation", + "reliability", + "reliability_detail", + "madhhab", + "in_sahih_muslim", + "in_sahih_bukhari", + "origin", + "lived_in", + "died_in", + "description", + "thumbnail", + "share_link", + "created_at", + "updated_at", + ] + read_only_fields = ["id", "slug", "share_link", "created_at", "updated_at", "reliability_detail"] + + class AdminBookSubjectAreaSerializer(serializers.ModelSerializer): class Meta: model = BookSubjectArea @@ -319,4 +405,3 @@ class AdminBookReferenceDetailSerializer(serializers.ModelSerializer): if authors is not None: book.authors.set(authors) return book - diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index 78ecb9b..19f64ca 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -8,7 +8,8 @@ from .views.version import ContentReleaseSyncView from .views.info import HadisInfoView from .views_admin import ( AdminHadisCategoryViewSet, AdminHadisViewSet, AdminHadisCorrectionViewSet, AdminHadisInterpretationViewSet, AdminHadisStatusViewSet, AdminHadisTagViewSet, - AdminBookSubjectAreaViewSet, AdminBookTypeViewSet, AdminBookAuthorViewSet, AdminBookAttributeViewSet, AdminBookReferenceImageViewSet, AdminBookReferenceDocumentViewSet, AdminBookReferenceViewSet + AdminBookSubjectAreaViewSet, AdminBookTypeViewSet, AdminBookAuthorViewSet, AdminBookAttributeViewSet, AdminBookReferenceImageViewSet, AdminBookReferenceDocumentViewSet, AdminBookReferenceViewSet, + AdminTransmitterViewSet, AdminTransmitterReliabilityViewSet ) from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_headers @@ -31,6 +32,8 @@ admin_router.register(r'book-authors', AdminBookAuthorViewSet, basename='admin-b admin_router.register(r'book-attributes', AdminBookAttributeViewSet, basename='admin-book-attributes') admin_router.register(r'book-images', AdminBookReferenceImageViewSet, basename='admin-book-images') admin_router.register(r'book-documents', AdminBookReferenceDocumentViewSet, basename='admin-book-documents') +admin_router.register(r'transmitters', AdminTransmitterViewSet, basename='admin-transmitters') +admin_router.register(r'transmitter-reliabilities', AdminTransmitterReliabilityViewSet, basename='admin-transmitter-reliabilities') urlpatterns = [ # Admin endpoints diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index 72db2a8..db7894a 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -11,7 +11,8 @@ from utils.pagination import StandardResultsSetPagination from .models import ( Hadis, HadisCategory, HadisCorrection, HadisInterpretation, HadisStatus, HadisTag, - BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType + BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, + Transmitters, TransmitterReliability ) from .serializers.serializers_admin import ( AdminHadisCategorySerializer, @@ -29,6 +30,9 @@ from .serializers.serializers_admin import ( AdminBookReferenceDocumentSerializer, AdminBookReferenceListSerializer, AdminBookReferenceDetailSerializer, + AdminTransmitterListSerializer, + AdminTransmitterDetailSerializer, + AdminTransmitterReliabilitySerializer, ) @@ -62,6 +66,60 @@ class AdminHadisTagViewSet(ReadOnlyModelViewSet): return HadisTag.objects.all().order_by("id") +class AdminTransmitterReliabilityViewSet(ReadOnlyModelViewSet): + serializer_class = AdminTransmitterReliabilitySerializer + permission_classes = [IsAuthenticated, IsSuperAdmin] + authentication_classes = [TokenAuthentication] + pagination_class = None + + def get_queryset(self): + return TransmitterReliability.objects.all().order_by("id") + + +class AdminTransmitterViewSet(ModelViewSet): + permission_classes = [IsAuthenticated, IsSuperAdmin] + authentication_classes = [TokenAuthentication] + pagination_class = StandardResultsSetPagination + parser_classes = (MultiPartParser, FormParser, JSONParser) + + def get_serializer_class(self): + if self.action == "list": + return AdminTransmitterListSerializer + return AdminTransmitterDetailSerializer + + def get_queryset(self): + queryset = Transmitters.objects.select_related("reliability") + + search_query = self.request.query_params.get("search") + if search_query: + q_filter = ( + Q(full_name__icontains=search_query) + | Q(kunya__icontains=search_query) + | Q(known_as__icontains=search_query) + | Q(nickname__icontains=search_query) + | Q(origin__icontains=search_query) + | Q(lived_in__icontains=search_query) + | Q(died_in__icontains=search_query) + ) + if search_query.isdigit(): + q_filter |= Q(legacy_number=int(search_query)) | Q(generation=int(search_query)) + queryset = queryset.filter(q_filter) + + status_filter = self.request.query_params.get("status") + if status_filter and status_filter != "all": + queryset = queryset.filter(reliability__slug=status_filter) + + madhhab_filter = self.request.query_params.get("madhhab") + if madhhab_filter and madhhab_filter != "all": + queryset = queryset.filter(madhhab=madhhab_filter) + + generation_filter = self.request.query_params.get("generation") + if generation_filter and generation_filter != "all": + queryset = queryset.filter(generation=generation_filter) + + return queryset.order_by("full_name", "id") + + class AdminHadisViewSet(ModelViewSet): permission_classes = [IsAuthenticated, IsSuperAdmin] @@ -267,4 +325,3 @@ class AdminBookReferenceViewSet(ModelViewSet): queryset = queryset.filter(authors__id=author_id) return queryset.distinct().order_by("-created_at") -