diff --git a/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py b/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py new file mode 100644 index 0000000..c8410fb --- /dev/null +++ b/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py @@ -0,0 +1,29 @@ +# Generated by Django 5.2.9 on 2025-12-14 15:46 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0036_transmitters_generation_and_more"), + ] + + operations = [ + migrations.RemoveField( + model_name="bookattribute", + name="book_references", + ), + migrations.AddField( + model_name="bookattribute", + name="book_reference", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="attributes", + to="hadis.bookreference", + verbose_name="book attribute", + ), + ), + ] diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index f6243dc..893c46b 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -92,13 +92,14 @@ class BookAttribute(models.Model): """ title = models.CharField(max_length=255, verbose_name=_('title')) value = models.CharField(max_length=500, verbose_name=_('value')) - book_references = models.ManyToManyField( + book_reference = models.ForeignKey( BookReference, + on_delete=models.CASCADE, related_name='attributes', - verbose_name=_('book references'), - blank=True + verbose_name=_('book attribute'), + default = None, + null = True ) - created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) diff --git a/apps/hadis/serializers/reference.py b/apps/hadis/serializers/reference.py index 656587e..58cbf38 100644 --- a/apps/hadis/serializers/reference.py +++ b/apps/hadis/serializers/reference.py @@ -1,7 +1,7 @@ from rest_framework import serializers from ..serializers import HadisListSerializer -from ..models import BookReference , BookAuthor , BookReferenceImage, HadisReference +from ..models import BookReference , BookAuthor , BookReferenceImage, HadisReference , BookAttribute class BookAuthorSerializer(serializers.ModelSerializer): class Meta: @@ -31,8 +31,19 @@ class BookReferenceSerializer(serializers.ModelSerializer): request = self.context.get('request') return BookReference.objects.filter(title=obj.title).count() +class BookAttributeSerializer(serializers.ModelSerializer): + class Meta: + model = BookAttribute + fields = ['id', 'title', 'value', 'book_reference', 'created_at', 'updated_at'] + read_only_fields = ['id', 'created_at', 'updated_at'] + class BookDetailSerializer(serializers.ModelSerializer): + attribute = BookAttributeSerializer( + read_only = True, + source = 'bookattribute_set' + ) + author = BookAuthorSerializer( read_only = True , source = 'bookauthor_set' diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index ef3e105..bd7342f 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -2,7 +2,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 from .views.transmitter import TransmitterView ,TransmitterDetailView, TransmitterSyncView,TransmitterOpinionView, TransmitterOriginalTextView -from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView +from .views.reference import BookDetailView, BookReferencesView, BookReferenceSyncView, BookAttributeView from .views.info import HadisInfoView @@ -30,4 +30,5 @@ urlpatterns = [ path('narrators//original_texts',TransmitterOriginalTextView.as_view(), name='narrator-original-texts'), path('references/',BookReferencesView.as_view(), name='references'), path('references/',BookDetailView.as_view(), name='reference-detail'), + path('references/attributes/',BookAttributeView.as_view(), name='book-attributes'), ] \ No newline at end of file diff --git a/apps/hadis/views/reference.py b/apps/hadis/views/reference.py index 97a5817..f97d02d 100644 --- a/apps/hadis/views/reference.py +++ b/apps/hadis/views/reference.py @@ -1,7 +1,7 @@ -from rest_framework.generics import ListAPIView, RetrieveAPIView +from rest_framework.generics import ListAPIView, RetrieveAPIView,ListCreateAPIView from rest_framework.response import Response -from ..models import BookReference , BookAuthor , BookReferenceImage -from ..serializers.reference import BookAuthorSerializer, BookDetailSerializer , BookReferenceSerializer, BookReferenceSyncSerializer +from ..models import BookReference , BookAuthor , BookReferenceImage, BookAttribute +from ..serializers.reference import BookAuthorSerializer, BookDetailSerializer , BookReferenceSerializer, BookReferenceSyncSerializer, BookAttributeSerializer from ..docs import book_references_list_swagger, book_authors_list_swagger, book_detail_swagger, reference_sync_swagger from utils.pagination import NoPagination @@ -74,6 +74,22 @@ class BookReferenceSyncView(ListAPIView): +class BookAttributeView(ListCreateAPIView): + """ + API view to list all book attributes and create new book attributes + """ + queryset = BookAttribute.objects.all() + serializer_class = BookAttributeSerializer + + # def get_queryset(self): + # """ + # Optionally filter by book_reference_id if provided as query parameter + # """ + # queryset = BookAttribute.objects.all() + # book_reference_id = self.request.query_params.get('book_reference_id', None) + # if book_reference_id: + # queryset = queryset.filter(book_references__id=book_reference_id).distinct() + # return queryset.order_by('title') # class BookReferencesView(ListAPIView):