From 3d57d88b9fec20291f76cb7bcc7bc3a2fa44d974 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Tue, 7 Jul 2026 11:24:58 +0330 Subject: [PATCH] refereces edditions and volumes api added --- apps/hadis/serializers/serializers_admin.py | 48 ++++++++++++++++++++- apps/hadis/urls.py | 4 +- apps/hadis/views_admin.py | 38 +++++++++++++++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 456873a..c5d7326 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -4,7 +4,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from utils.image_compression import maybe_compress_uploaded_file from ..models import ( Hadis, HadisCategory, HadisStatus, HadisTag, HadisCorrection, HadisInterpretation, HadisCollection, HadisSect, HadisInCollection, HadisTransmitter, - BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, + BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, BookEdition, BookVolume, Transmitters, TransmitterReliability, NarratorLayer, OpinionStatus, TransmitterOpinion, TransmitterOriginalText ) from .category import LocalizedField @@ -800,3 +800,49 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer): "embedded_in", "order", ] + + +class AdminBookVolumeSerializer(serializers.ModelSerializer): + class Meta: + model = BookVolume + fields = [ + "id", + "book_reference", + "edition", + "title", + "created_at", + "updated_at", + ] + + +class AdminBookEditionSerializer(serializers.ModelSerializer): + publisher = serializers.JSONField(required=False, default=list) + city_of_publication = serializers.JSONField(required=False, default=list) + country_of_publication = serializers.JSONField(required=False, default=list) + notes = serializers.JSONField(required=False, default=list) + tags = serializers.JSONField(required=False, default=list) + volumes_detail = AdminBookVolumeSerializer(source="volumes", many=True, read_only=True) + number_of_volumes = serializers.SerializerMethodField() + + class Meta: + model = BookEdition + fields = [ + "id", + "book_reference", + "publisher", + "city_of_publication", + "country_of_publication", + "edition_number", + "year_of_publication", + "number_of_volumes", + "source_url", + "isbn", + "notes", + "tags", + "volumes_detail", + "created_at", + "updated_at", + ] + + def get_number_of_volumes(self, obj): + return obj.volumes.count() diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index d338f3d..4be3e7a 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -19,7 +19,7 @@ from .views_admin import ( AdminTransmitterViewSet, AdminTransmitterReliabilityViewSet, DovodiBookSubjectAreaViewSet, DovodiBookTypeViewSet, DovodiNarratorLayerViewSet, DovodiTransmitterReliabilityViewSet, DovodiOpinionStatusViewSet, DovodiHadisSectViewSet, DovodiHadisCategoryViewSet, AdminCategoryQuranVerseViewSet, AdminHadisTransmitterViewSet, - AdminTransmitterOpinionViewSet, AdminTransmitterOriginalTextViewSet + AdminTransmitterOpinionViewSet, AdminTransmitterOriginalTextViewSet, AdminBookEditionViewSet, AdminBookVolumeViewSet ) from .views.reference_v2 import BookAuthorListView, BookAuthorDetailView, AuthorReferencesListView, BookAuthorSyncView from django.views.decorators.cache import cache_page @@ -57,6 +57,8 @@ admin_router.register(r'dovodi-opinion-statuses', DovodiOpinionStatusViewSet, ba admin_router.register(r'hadis-transmitters', AdminHadisTransmitterViewSet, basename='admin-hadis-transmitters') admin_router.register(r'transmitter-opinions', AdminTransmitterOpinionViewSet, basename='admin-transmitter-opinions') admin_router.register(r'transmitter-original-texts', AdminTransmitterOriginalTextViewSet, basename='admin-transmitter-original-texts') +admin_router.register(r'book-editions', AdminBookEditionViewSet, basename='admin-book-editions') +admin_router.register(r'book-volumes', AdminBookVolumeViewSet, basename='admin-book-volumes') # Hide admin viewsets from swagger for prefix, viewset, basename in admin_router.registry: diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index a19215a..0e0eefb 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -12,7 +12,7 @@ from utils.pagination import StandardResultsSetPagination from .models import ( Hadis, HadisCategory, HadisCollection, HadisCorrection, HadisInterpretation, HadisStatus, HadisTag, HadisSect, HadisTransmitter, - BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, + BookReference, BookReferenceImage, BookReferenceDocument, BookAuthor, BookAttribute, BookSubjectArea, BookType, BookEdition, BookVolume, Transmitters, TransmitterReliability, NarratorLayer, OpinionStatus, TransmitterOpinion, TransmitterOriginalText ) from .serializers.serializers_admin import ( @@ -42,6 +42,8 @@ from .serializers.serializers_admin import ( AdminHadisTransmitterSerializer, AdminTransmitterOpinionSerializer, AdminTransmitterOriginalTextSerializer, + AdminBookEditionSerializer, + AdminBookVolumeSerializer, ) @@ -634,3 +636,37 @@ class AdminTransmitterOriginalTextViewSet(ModelViewSet): TransmitterOriginalText.objects.filter(id=ot_id).update(order=index) return Response({"status": "success"}) + + +class AdminBookEditionViewSet(ModelViewSet): + permission_classes = [IsAuthenticated, IsSuperAdmin] + authentication_classes = [TokenAuthentication] + serializer_class = AdminBookEditionSerializer + pagination_class = None + + def get_queryset(self): + queryset = BookEdition.objects.all() + book_reference_id = self.request.query_params.get("book_reference_id") + if book_reference_id: + queryset = queryset.filter(book_reference_id=book_reference_id) + return queryset.order_by("-created_at") + + +class AdminBookVolumeViewSet(ModelViewSet): + permission_classes = [IsAuthenticated, IsSuperAdmin] + authentication_classes = [TokenAuthentication] + serializer_class = AdminBookVolumeSerializer + pagination_class = None + + def get_queryset(self): + queryset = BookVolume.objects.all() + book_reference_id = self.request.query_params.get("book_reference_id") + edition_id = self.request.query_params.get("edition_id") + if book_reference_id: + queryset = queryset.filter(book_reference_id=book_reference_id) + if edition_id: + if edition_id in ["none", "null"]: + queryset = queryset.filter(edition__isnull=True) + else: + queryset = queryset.filter(edition_id=edition_id) + return queryset.order_by("title", "id")