Add endpoint to list page URLs
I use this for my quick link grabber script
This commit is contained in:
parent
4a82d1262d
commit
f140e8107d
4 changed files with 63 additions and 1 deletions
13
website/api/serializers.py
Normal file
13
website/api/serializers.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
from rest_framework import serializers
|
||||
from wagtail.models import Page
|
||||
|
||||
|
||||
class PageLinkSerializer(serializers.ModelSerializer):
|
||||
full_url = serializers.SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Page
|
||||
fields = read_only_fields = ["full_url", "title"]
|
||||
|
||||
def get_full_url(self, page: Page) -> str:
|
||||
return page.get_full_url(request=self.context["request"])
|
29
website/api/tests.py
Normal file
29
website/api/tests.py
Normal file
|
@ -0,0 +1,29 @@
|
|||
from django.urls import reverse
|
||||
from rest_framework.test import APISimpleTestCase, APITestCase
|
||||
|
||||
from website.common.factories import ContentPageFactory
|
||||
from website.home.models import HomePage
|
||||
|
||||
|
||||
class PingAPIViewTestCase(APISimpleTestCase):
|
||||
url = reverse("api:ping")
|
||||
|
||||
def test_accessible(self) -> None:
|
||||
response = self.client.get(self.url)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
|
||||
class PageLinksAPIViewTestCase(APITestCase):
|
||||
url = reverse("api:page-links")
|
||||
|
||||
@classmethod
|
||||
def setUpTestData(cls) -> None:
|
||||
cls.home_page = HomePage.objects.get()
|
||||
|
||||
for _ in range(5):
|
||||
ContentPageFactory(parent=cls.home_page)
|
||||
|
||||
def test_accessible(self) -> None:
|
||||
with self.assertNumQueries(3):
|
||||
response = self.client.get(self.url)
|
||||
self.assertEqual(response.status_code, 200)
|
|
@ -8,7 +8,10 @@ from . import views
|
|||
|
||||
app_name = "api"
|
||||
|
||||
api_urlpatterns = [path("ping", views.PingAPIView.as_view(), name="ping")]
|
||||
api_urlpatterns = [
|
||||
path("ping", views.PingAPIView.as_view(), name="ping"),
|
||||
path("page-links", views.PageLinksAPIView.as_view(), name="page-links"),
|
||||
]
|
||||
|
||||
schema_view = get_schema_view(
|
||||
openapi.Info(
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
from django.http.request import HttpRequest
|
||||
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
|
||||
|
||||
|
||||
class PingAPIView(APIView):
|
||||
|
@ -10,3 +15,15 @@ class PingAPIView(APIView):
|
|||
|
||||
def get(self, request: HttpRequest) -> Response:
|
||||
return Response("PONG")
|
||||
|
||||
|
||||
class PageLinksAPIView(ListAPIView):
|
||||
serializer_class = serializers.PageLinkSerializer
|
||||
|
||||
def get_queryset(self) -> PageQuerySet:
|
||||
return (
|
||||
Page.objects.live()
|
||||
.exclude(depth__lte=1)
|
||||
.only("id", "url_path", "title")
|
||||
.order_by("title")
|
||||
)
|
||||
|
|
Loading…
Reference in a new issue