Last active
October 20, 2023 07:35
-
-
Save stevelacey/dd756dca3b186a45992ebead74902bf4 to your computer and use it in GitHub Desktop.
Django REST Framework custom API root view with permissions filter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import OrderedDict | |
from myproject.api.views import APIRootView | |
from rest_framework import permissions, routers | |
from rest_framework_nested.routers import NestedSimpleRouter | |
class Router(routers.DefaultRouter): | |
include_root_view = True | |
include_format_suffixes = False | |
root_view_name = 'index' | |
def get_api_root_view(self, api_urls=None): | |
return APIRootView.as_view() | |
class NestedRouter(NestedSimpleRouter): | |
pass |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import OrderedDict | |
from myproject.api import urls | |
from rest_framework import permissions, viewsets, views | |
from rest_framework.response import Response | |
from rest_framework.reverse import NoReverseMatch, reverse | |
class APIRootView(views.APIView): | |
_ignore_model_permissions = True | |
exclude_from_schema = True | |
def get(self, request, *args, **kwargs): | |
ret = OrderedDict() | |
namespace = request.resolver_match.namespace | |
for key, url_name in self.get_api_root_dict(request).items(): | |
if namespace: | |
url_name = namespace + ':' + url_name | |
try: | |
ret[key] = reverse( | |
url_name, | |
args=args, | |
kwargs=kwargs, | |
request=request, | |
format=kwargs.get('format', None) | |
) | |
except NoReverseMatch: | |
continue | |
return Response(ret) | |
def get_api_root_dict(self, request): | |
api_root_dict = OrderedDict() | |
list_name = urls.router.routes[0].name | |
for prefix, viewset, basename in urls.router.registry: | |
if not request.user.is_staff and permissions.IsAdminUser in viewset.permission_classes: | |
continue | |
api_root_dict[prefix] = list_name.format(basename=basename) | |
return api_root_dict |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment