Archived
fix: floating bookmarks
- update floating bookmarks - fix search suggestions - fix filters
This commit is contained in:
@@ -3,6 +3,7 @@ from rest_framework import serializers
|
||||
import logging
|
||||
|
||||
from apps.books.models import Book, BookChapter, EBook, ReadingProgress, ReadingStatus, DownloadRecord
|
||||
from apps.books.services.ebook_metadata import subjects_from_ebook
|
||||
from apps.books.services.metadata import enrich_ebook_metadata
|
||||
from apps.books.services.process_ebook import apply_processing_to_ebook
|
||||
from apps.reader.models import ReadingSettings
|
||||
@@ -71,14 +72,18 @@ class EBookListSerializer(serializers.ModelSerializer):
|
||||
format = serializers.CharField(read_only=True)
|
||||
progress = serializers.SerializerMethodField()
|
||||
started = serializers.SerializerMethodField()
|
||||
subjects = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = EBook
|
||||
fields = [
|
||||
"id", "title", "author", "filename", "format", "page_count", "file_size",
|
||||
"cover_image", "created_at", "progress", "started",
|
||||
"cover_image", "created_at", "progress", "started", "subjects",
|
||||
]
|
||||
|
||||
def get_subjects(self, obj: EBook) -> list[str]:
|
||||
return subjects_from_ebook(obj)
|
||||
|
||||
def get_progress(self, obj):
|
||||
try:
|
||||
return obj.reading_progress.current_position
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from apps.books.models import EBook
|
||||
|
||||
|
||||
def subjects_from_ebook(ebook: EBook) -> list[str]:
|
||||
ol = (ebook.metadata_json or {}).get("openlibrary") or {}
|
||||
return [s.strip() for s in (ol.get("subjects") or []) if isinstance(s, str) and s.strip()]
|
||||
@@ -21,6 +21,7 @@ from apps.books.serializers import (
|
||||
ReadingProgressSerializer, StorageSummarySerializer,
|
||||
)
|
||||
from apps.reader.models import ReadingSettings
|
||||
from apps.books.services.ebook_metadata import subjects_from_ebook
|
||||
from apps.books.services.metadata import enrich_ebook_metadata
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -96,7 +97,30 @@ class EBookViewSet(viewsets.ModelViewSet):
|
||||
return EBookDetailSerializer
|
||||
|
||||
def get_queryset(self):
|
||||
return EBook.objects.filter(user=self.request.user).select_related("reading_progress", "user")
|
||||
qs = EBook.objects.filter(user=self.request.user).select_related("reading_progress", "user")
|
||||
query = self.request.query_params.get("q", "").strip()
|
||||
if query and self.action == "list":
|
||||
qs = qs.filter(
|
||||
Q(title__icontains=query) | Q(author__icontains=query),
|
||||
)
|
||||
return qs
|
||||
|
||||
@action(detail=False, methods=["get"])
|
||||
def genres(self, request: Request) -> Response:
|
||||
genre_set: set[str] = set()
|
||||
for ebook in self.get_queryset():
|
||||
genre_set.update(subjects_from_ebook(ebook))
|
||||
return Response(sorted(genre_set))
|
||||
|
||||
@action(detail=False, methods=["get"])
|
||||
def authors(self, request: Request) -> Response:
|
||||
author_list = (
|
||||
self.get_queryset()
|
||||
.values_list("author", flat=True)
|
||||
.distinct()
|
||||
.order_by("author")
|
||||
)
|
||||
return Response([a for a in author_list if a])
|
||||
|
||||
@action(detail=True, methods=["get", "patch"])
|
||||
def progress(self, request: Request, pk: int | None = None) -> Response:
|
||||
|
||||
Reference in New Issue
Block a user