Add basic LMOTFY endpoint
This commit is contained in:
parent
f140e8107d
commit
d46fab9bdc
5 changed files with 62 additions and 1 deletions
22
website/api/filters.py
Normal file
22
website/api/filters.py
Normal file
|
@ -0,0 +1,22 @@
|
|||
from typing import Any
|
||||
|
||||
from django.db.models import Value
|
||||
from django.http.request import HttpRequest
|
||||
from rest_framework.filters import SearchFilter
|
||||
from wagtail.query import PageQuerySet
|
||||
from wagtail.search.utils import parse_query_string
|
||||
|
||||
|
||||
class WagtailSearchFilter(SearchFilter):
|
||||
def filter_queryset(
|
||||
self, request: HttpRequest, queryset: PageQuerySet, view: Any
|
||||
) -> PageQuerySet:
|
||||
search_query = request.query_params.get(self.search_param, "")
|
||||
|
||||
if not search_query:
|
||||
return queryset.annotate(relevance=Value(0)).none()
|
||||
|
||||
filters, query = parse_query_string(search_query)
|
||||
results = queryset.search(query).annotate_score("relevance")
|
||||
|
||||
return results.get_queryset()
|
6
website/api/pagination.py
Normal file
6
website/api/pagination.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from rest_framework.pagination import PageNumberPagination
|
||||
|
||||
|
||||
class CustomPageNumberPagination(PageNumberPagination):
|
||||
page_size = 20
|
||||
max_page_size = 50
|
|
@ -1,6 +1,8 @@
|
|||
from rest_framework import serializers
|
||||
from wagtail.models import Page
|
||||
|
||||
from website.blog.models import BlogPostListPage
|
||||
|
||||
|
||||
class PageLinkSerializer(serializers.ModelSerializer):
|
||||
full_url = serializers.SerializerMethodField()
|
||||
|
@ -11,3 +13,14 @@ class PageLinkSerializer(serializers.ModelSerializer):
|
|||
|
||||
def get_full_url(self, page: Page) -> str:
|
||||
return page.get_full_url(request=self.context["request"])
|
||||
|
||||
|
||||
class LMOTFYSerializer(serializers.ModelSerializer):
|
||||
full_url = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = BlogPostListPage
|
||||
fields = read_only_fields = ["full_url", "title", "summary"]
|
||||
|
||||
def get_full_url(self, page: Page) -> str:
|
||||
return page.get_full_url(request=self.context["request"])
|
||||
|
|
|
@ -11,6 +11,7 @@ app_name = "api"
|
|||
api_urlpatterns = [
|
||||
path("ping", views.PingAPIView.as_view(), name="ping"),
|
||||
path("page-links", views.PageLinksAPIView.as_view(), name="page-links"),
|
||||
path("lmotfy", views.LMOTFYAPIView.as_view(), name="lmotfy"),
|
||||
]
|
||||
|
||||
schema_view = get_schema_view(
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
from django.http.request import HttpRequest
|
||||
from rest_framework.filters import OrderingFilter
|
||||
from rest_framework.generics import ListAPIView
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from wagtail.models import Page
|
||||
from wagtail.query import PageQuerySet
|
||||
|
||||
from . import serializers
|
||||
from website.blog.models import BlogPostListPage
|
||||
|
||||
from . import filters, serializers
|
||||
from .pagination import CustomPageNumberPagination
|
||||
|
||||
|
||||
class PingAPIView(APIView):
|
||||
|
@ -27,3 +31,18 @@ class PageLinksAPIView(ListAPIView):
|
|||
.only("id", "url_path", "title")
|
||||
.order_by("title")
|
||||
)
|
||||
|
||||
|
||||
class LMOTFYAPIView(ListAPIView):
|
||||
"""
|
||||
Let Me Orange That For You
|
||||
"""
|
||||
|
||||
filter_backends = [filters.WagtailSearchFilter, OrderingFilter]
|
||||
serializer_class = serializers.LMOTFYSerializer
|
||||
ordering_fields = ["title", "date", "relevance"]
|
||||
ordering = ["relevance"]
|
||||
pagination_class = CustomPageNumberPagination
|
||||
|
||||
def get_queryset(self) -> PageQuerySet:
|
||||
return BlogPostListPage.objects.live().only("id", "url_path", "title", "body")
|
||||
|
|
Loading…
Reference in a new issue