More data in catalogue
[redakcja.git] / src / catalogue / views.py
index 0b29b6f..6d4a224 100644 (file)
@@ -2,9 +2,13 @@
 # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
 #
 from django.db.models import Prefetch
+from django.contrib.auth.models import User
 from django.views.generic import DetailView, TemplateView
 from . import models
 import documents.models
+from rest_framework.generics import ListAPIView
+from rest_framework.filters import SearchFilter
+from rest_framework import serializers
 
 
 class CatalogueView(TemplateView):
@@ -12,13 +16,8 @@ class CatalogueView(TemplateView):
 
     def get_context_data(self):
         ctx = super().get_context_data()
-        documents_books_queryset = models.Book.objects.prefetch_unrelated(
-            "document_books", "slug", documents.models.Book, "dc_slug"
-        )
-        ctx["authors"] = models.Author.objects.all().prefetch_related(
-            Prefetch("book_set", queryset=documents_books_queryset),
-            Prefetch("translated_book_set", queryset=documents_books_queryset),
-        )
+        ctx["authors"] = models.Author.objects.all().prefetch_related('book_set__book_set', 'translated_book_set__book_set')
+
         return ctx
 
 
@@ -28,12 +27,9 @@ class AuthorView(TemplateView):
 
     def get_context_data(self, slug):
         ctx = super().get_context_data()
-        documents_books_queryset = models.Book.objects.prefetch_unrelated(
-            "document_books", "slug", documents.models.Book, "dc_slug"
-        )
         authors = models.Author.objects.filter(slug=slug).prefetch_related(
-            Prefetch("book_set", queryset=documents_books_queryset),
-            Prefetch("translated_book_set", queryset=documents_books_queryset),
+            Prefetch("book_set"),
+            Prefetch("translated_book_set"),
         )
         ctx["author"] = authors.first()
         return ctx
@@ -41,3 +37,52 @@ class AuthorView(TemplateView):
 
 class BookView(DetailView):
     model = models.Book
+
+
+class TermSearchFilter(SearchFilter):
+    search_param = 'term'
+
+
+class Terms(ListAPIView):
+    filter_backends = [TermSearchFilter]
+    search_fields = ['name']
+
+    class serializer_class(serializers.Serializer):
+        label = serializers.CharField(source='name')
+
+
+class EpochTerms(Terms):
+    queryset = models.Epoch.objects.all()
+class KindTerms(Terms):
+    queryset = models.Kind.objects.all()
+class GenreTerms(Terms):
+    queryset = models.Genre.objects.all()
+
+class AuthorTerms(Terms):
+    search_fields = ['first_name', 'last_name']
+    queryset = models.Author.objects.all()
+
+class EditorTerms(Terms):
+    search_fields = ['first_name', 'last_name', 'username']
+    queryset = User.objects.all()
+
+    class serializer_class(serializers.Serializer):
+        label = serializers.SerializerMethodField()
+
+        def get_label(self, obj):
+            return f'{obj.last_name}, {obj.first_name}'
+    
+class BookTitleTerms(Terms):
+    queryset = models.Book.objects.all()
+    search_fields = ['title', 'slug']
+
+    class serializer_class(serializers.Serializer):
+        label = serializers.CharField(source='title')
+
+class WLURITerms(Terms):
+    queryset = models.Book.objects.all()
+    search_fields = ['title', 'slug']
+    
+    class serializer_class(serializers.Serializer):
+        label = serializers.CharField(source='wluri')
+