diff --git a/apps/library/serializers.py b/apps/library/serializers.py index 5bfa4d5..7b70cf0 100644 --- a/apps/library/serializers.py +++ b/apps/library/serializers.py @@ -134,6 +134,8 @@ class BookSerializer(serializers.ModelSerializer): share_link = serializers.CharField(read_only=True) author = serializers.SerializerMethodField() author_detail = AuthorSummarySerializer(source='author', read_only=True) + categories = CategorySerializer(many=True, read_only=True) + category = serializers.SerializerMethodField() language = serializers.SlugRelatedField( slug_field='code', queryset=Language.objects.all(), @@ -149,8 +151,8 @@ class BookSerializer(serializers.ModelSerializer): class Meta: model = Book fields = ( - 'id', 'title', 'slug', 'summary', 'summary_title', 'thumbnail', 'slogan', - 'status', 'pin', 'view_count', 'download_count', 'publisher', 'year_of_publication', 'author', 'author_detail', 'isbn', 'numnber_of_volume', + 'id', 'title', 'slug', 'summary', 'summary_title', 'description', 'thumbnail', 'slogan', + 'status', 'pin', 'view_count', 'download_count', 'publisher', 'year_of_publication', 'author', 'author_detail', 'categories', 'category', 'isbn', 'numnber_of_volume', 'language', 'main_themes', 'notable_works', 'file_type', 'book_file', 'created_at', 'bookmark', 'user_rate', 'average_rate', 'share_link' @@ -159,6 +161,12 @@ class BookSerializer(serializers.ModelSerializer): def get_author(self, obj): return obj.author.full_name if obj.author_id else None + def get_category(self, obj): + first_cat = obj.categories.filter(status=True).first() or obj.categories.first() + if first_cat: + return CategorySerializer(first_cat, context=self.context).data + return None + def get_bookmark(self, obj): """ Get bookmark information for this book. diff --git a/apps/library/serializers_admin.py b/apps/library/serializers_admin.py index d99337f..0b81982 100644 --- a/apps/library/serializers_admin.py +++ b/apps/library/serializers_admin.py @@ -253,7 +253,7 @@ class AdminBookDetailSerializer(serializers.ModelSerializer): collections = validated_data.pop("collections", []) book = super().create(validated_data) if categories: - book.categories.set(categories) + book.categories.set(categories[:1] if len(categories) > 1 else categories) if collections: book.collections.set(collections) return book @@ -274,7 +274,7 @@ class AdminBookDetailSerializer(serializers.ModelSerializer): book = super().update(instance, validated_data) if categories is not None: - book.categories.set(categories) + book.categories.set(categories[:1] if len(categories) > 1 else categories) if collections is not None: book.collections.set(collections) return book diff --git a/apps/library/urls.py b/apps/library/urls.py index 81155c9..dda31e2 100644 --- a/apps/library/urls.py +++ b/apps/library/urls.py @@ -39,10 +39,11 @@ admin_router.register(r'collections', AdminLibraryCollectionViewSet, basename='a admin_router.register(r'dovodi-collections', DovodiAdminLibraryCollectionViewSet, basename='admin-library-dovodi-collections') dovodi_router = SimpleRouter() +dovodi_router.register(r'categories', DovodiAdminLibraryCategoryViewSet, basename='dovodi-library-categories') dovodi_router.register(r'collections', DovodiAdminLibraryCollectionViewSet, basename='dovodi-library-collections') # Hide admin viewsets from swagger -for prefix, viewset, basename in admin_router.registry: +for prefix, viewset, basename in admin_router.registry + dovodi_router.registry: viewset.swagger_schema = None urlpatterns = [ diff --git a/apps/library/views.py b/apps/library/views.py index f5c9b8c..2dc2654 100644 --- a/apps/library/views.py +++ b/apps/library/views.py @@ -120,7 +120,7 @@ class BookListView(ListAPIView): return context def get_queryset(self): - queryset = Book.objects.filter(status=True).select_related('author', 'language') + queryset = Book.objects.filter(status=True).select_related('author', 'language').prefetch_related('categories') # Filter by collection if provided collection_id = self.request.query_params.get('collection_id') @@ -226,7 +226,7 @@ class BookDetailView(Gone410ViewMixin, CanonicalSlugViewSetMixin, RetrieveAPIVie serializer_class = BookSerializer permission_classes = (IsAuthenticated,) authentication_classes = [TokenAuthentication] - queryset = Book.objects.all() + queryset = Book.objects.all().select_related('author').prefetch_related('categories') lookup_field = 'slug' active_field_name = 'status'