From 789cbabebf2f153e8ea23cf0a7ce34f20cd9534b Mon Sep 17 00:00:00 2001 From: Karl Hobley Date: Sat, 3 Oct 2015 17:49:34 +0100 Subject: [PATCH] Get detail_url values from router No longer need ObjectDetailURL! --- wagtail/contrib/wagtailapi/endpoints.py | 11 +++++++++++ wagtail/contrib/wagtailapi/router.py | 13 +++++++++++++ wagtail/contrib/wagtailapi/serializers.py | 8 ++++---- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/wagtail/contrib/wagtailapi/endpoints.py b/wagtail/contrib/wagtailapi/endpoints.py index 65d13c046..642f7df2e 100644 --- a/wagtail/contrib/wagtailapi/endpoints.py +++ b/wagtail/contrib/wagtailapi/endpoints.py @@ -4,6 +4,7 @@ from collections import OrderedDict from django.conf.urls import url from django.http import Http404 +from django.core.urlresolvers import reverse from rest_framework import status from rest_framework.response import Response @@ -140,6 +141,7 @@ class BaseAPIEndpoint(GenericViewSet): context = { 'request': self.request, 'view': self, + 'router': self.request.wagtailapi_router } if self.action == 'detail_view': @@ -166,6 +168,15 @@ class BaseAPIEndpoint(GenericViewSet): url(r'^(?P\d+)/$', cls.as_view({'get': 'detail_view'}), name='detail'), ] + @classmethod + def get_object_detail_urlpath(cls, model, pk, namespace=''): + if namespace: + url_name = namespace + ':detail' + else: + url_name = 'detail' + + return reverse(url_name, args=(pk, )) + class PagesAPIEndpoint(BaseAPIEndpoint): base_serializer_class = PageSerializer diff --git a/wagtail/contrib/wagtailapi/router.py b/wagtail/contrib/wagtailapi/router.py index 13818cb57..a6e3cf27c 100644 --- a/wagtail/contrib/wagtailapi/router.py +++ b/wagtail/contrib/wagtailapi/router.py @@ -13,6 +13,19 @@ class WagtailAPIRouter(object): def register_endpoint(self, name, class_): self._endpoints[name] = class_ + def get_model_endpoint(self, model): + for name, class_ in self._endpoints.items(): + if issubclass(model, class_.model): + return name, class_ + + def get_object_detail_urlpath(self, model, pk): + endpoint = self.get_model_endpoint(model) + + if endpoint: + endpoint_name, endpoint_class = endpoint[0], endpoint[1] + url_namespace = self.url_namespace + ':' + endpoint_name + return endpoint_class.get_object_detail_urlpath(model, pk, namespace=url_namespace) + def wrap_view(self, func): @functools.wraps(func) def wrapped(request, *args, **kwargs): diff --git a/wagtail/contrib/wagtailapi/serializers.py b/wagtail/contrib/wagtailapi/serializers.py index c0e71799e..a06f68399 100644 --- a/wagtail/contrib/wagtailapi/serializers.py +++ b/wagtail/contrib/wagtailapi/serializers.py @@ -13,7 +13,7 @@ from rest_framework import relations from wagtail.utils.compat import get_related_model from wagtail.wagtailcore import fields as wagtailcore_fields -from .utils import ObjectDetailURL, get_full_url, pages_for_site +from .utils import get_full_url, pages_for_site class MetaField(Field): @@ -35,7 +35,7 @@ class MetaField(Field): def to_representation(self, obj): return OrderedDict([ ('type', type(obj)._meta.app_label + '.' + type(obj).__name__), - ('detail_url', ObjectDetailURL(type(obj), obj.pk)), + ('detail_url', get_full_url(self.context['request'], self.context['router'].get_object_detail_urlpath(type(obj), obj.pk))), ]) @@ -55,7 +55,7 @@ class PageMetaField(MetaField): def to_representation(self, page): return OrderedDict([ ('type', page.specific_class._meta.app_label + '.' + page.specific_class.__name__), - ('detail_url', ObjectDetailURL(type(page), page.pk)), + ('detail_url', get_full_url(self.context['request'], self.context['router'].get_object_detail_urlpath(type(page), page.pk))), ]) @@ -74,7 +74,7 @@ class DocumentMetaField(MetaField): def to_representation(self, document): data = OrderedDict([ ('type', "wagtaildocs.Document"), - ('detail_url', ObjectDetailURL(type(document), document.pk)), + ('detail_url', get_full_url(self.context['request'], self.context['router'].get_object_detail_urlpath(type(document), document.pk))), ]) # Add download url