Skip to content

Instantly share code, notes, and snippets.

@stevelacey
Last active October 20, 2023 07:35
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save stevelacey/dd756dca3b186a45992ebead74902bf4 to your computer and use it in GitHub Desktop.
Save stevelacey/dd756dca3b186a45992ebead74902bf4 to your computer and use it in GitHub Desktop.
Django REST Framework custom API root view with permissions filter
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
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