Включите настраиваемое поле в каждый ответ API Wagtail - PullRequest
0 голосов
/ 22 апреля 2019

Моя компания запускает Wagtail без головы, используя только API, для поддержки частей существующей веб-интрасети.Мы хотели бы добавить настраиваемую «панель редактирования» вверху каждой страницы в главном веб-приложении, которая указывает на страницу «редактирования» соответствующей записи в Wagtail.Мы собираемся передать текущего пользователя вместе с запросом.Затем мы хотели бы включить настраиваемое поле в ответ API Wagtail для всех запросов, которые указывают разрешение этого пользователя на редактирование этого ресурса.

В качестве иллюстрации я хочу сделать такой запрос:

http://localhost:32891/api/v2/page/?fields=place_id,location_slug&type=destination.DestinationPage&user_email=foo@bar.com

Что приведет (в идеальном мире) к такому ответу:

{
    "custom": {
        "can_edit": True,
    },
    "meta": {
        "total_count": 10
    },
    "items": [
        {
            "id": 1,
            "title": "Test blog post",
            "published_date": "2016-08-30",
        },
    ]
}

API указывает, что вы можете включить настраиваемые поля на странице(или изображение и документ), ответ API, но в идеале я бы хотел, чтобы этот объект был доступен для всех «вещей» через наш API.Это означает, что если кто-то запросит документ, мне не придется возвращать это поле вручную для каждой отдельной модели.

Я думаю, что возможно изменить поведение BaseAPIEndpoint? * 1014.*

1 Ответ

0 голосов
/ 23 апреля 2019

Вот один из способов, который мы выяснили, как это сделать.Класс страниц "SecuredPagesAPIEndpoint" уже существует в нашей системе.

class SecuredPagesAPIEndpoint(PagesAPIEndpoint):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

    def listing_view(self, request):
        response = super().listing_view(request)

        # create custom response object
        # this object will contain any number of custom properties that we want to
        # expose to consumers of this API
        response.data['custom'] = {
            'foo': 'BAR'
        }

        return response

, и в результате получается JSON:

{
    "meta": {
        "total_count": 1
    },
    "items": [
        {
            "id": 8,
            "meta": {
                "type": "destination.DestinationPage",
                "detail_url": "http://localhost/api/v2/page/8/",
                "html_url": "http://localhost/my-page-title/",
                "slug": "my-page-title",
                "first_published_at": "2019-02-19T17:15:13.952708Z"
            },
            "title": "My page title"
        }
    ],
    "custom": {
        "FOO": 'BAR'
    }
}
...