X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/acf3c41fb0ffe8e451b1e465b00e9998f2b027ac..66f7c2655c3bbc544569b6b5111b50b14cb9336b:/src/catalogue/views.py?ds=sidebyside diff --git a/src/catalogue/views.py b/src/catalogue/views.py index 0b29b6f4..6d4a2249 100644 --- a/src/catalogue/views.py +++ b/src/catalogue/views.py @@ -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') +