Skip to content

Commit 70b8852

Browse files
committed
Add authentication and permissions
1 parent 8ff1900 commit 70b8852

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

drf_endpoint_examples/settings.py

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"django.contrib.staticfiles",
4040
"endpoints",
4141
"rest_framework",
42+
"rest_framework.authtoken",
4243
"drf_api_logger",
4344
]
4445

endpoints/admin.py

+41
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
# Register your models here.
22

33
from django.contrib import admin
4+
from django.utils.safestring import mark_safe
5+
from rest_framework.authtoken.admin import TokenAdmin
6+
from rest_framework.authtoken.models import TokenProxy
47

58
from .models import Customer, Product, Order, Address, Review
69

@@ -9,3 +12,41 @@
912
admin.site.register(Order)
1013
admin.site.register(Address)
1114
admin.site.register(Review)
15+
16+
17+
class ExtendedTokenAdmin(TokenAdmin):
18+
readonly_fields = ("created",)
19+
list_display = ("key", "user", "created")
20+
fields = None
21+
fieldsets = (
22+
(
23+
None,
24+
{
25+
"fields": ("key", "user", "created"),
26+
"description": mark_safe(
27+
"There is no Change permission; please instead delete, and then "
28+
"re-add, the `Token`."
29+
),
30+
},
31+
),
32+
)
33+
34+
def get_form(self, request, obj=None, change=False, **kwargs):
35+
form = super().get_form(request, obj, change, **kwargs)
36+
if form.base_fields.get("key", None):
37+
form.base_fields["key"].initial = TokenProxy.generate_key()
38+
return form
39+
40+
def has_change_permission(self, request, obj=None):
41+
return False
42+
43+
def has_add_permission(self, request, obj=None):
44+
return request.user.is_superuser
45+
46+
def has_delete_permission(self, request, obj=None):
47+
return request.user.is_superuser
48+
49+
50+
# unregister and register again
51+
admin.site.unregister(TokenProxy)
52+
admin.site.register(TokenProxy, ExtendedTokenAdmin)

endpoints/viewsets.py

+19
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from rest_framework import viewsets
2+
from rest_framework.authentication import TokenAuthentication
3+
from rest_framework.settings import api_settings
24

5+
from drf_endpoint_examples.drf import ObjectIsAdminUser, AllVerbDjangoModelPermissions
36
from drf_endpoint_examples.openapi import ChoicesAutoSchema
47
from endpoints.models import Customer, Product, Order, Address, Review
58
from endpoints.serializers import (
@@ -10,32 +13,48 @@
1013
ReviewSerializer,
1114
)
1215

16+
PERMISSION_CLASSES = [ObjectIsAdminUser | AllVerbDjangoModelPermissions]
17+
AUTHENTICATION_CLASSES = [
18+
*api_settings.DEFAULT_AUTHENTICATION_CLASSES,
19+
TokenAuthentication,
20+
]
21+
1322

1423
class CustomerViewSet(viewsets.ModelViewSet):
24+
authentication_classes = AUTHENTICATION_CLASSES
25+
permission_classes = PERMISSION_CLASSES
1526
queryset = Customer.objects.all()
1627
serializer_class = CustomerSerializer
1728
schema = ChoicesAutoSchema()
1829

1930

2031
class ProductViewSet(viewsets.ModelViewSet):
32+
authentication_classes = AUTHENTICATION_CLASSES
33+
permission_classes = PERMISSION_CLASSES
2134
queryset = Product.objects.all()
2235
serializer_class = ProductSerializer
2336
schema = ChoicesAutoSchema()
2437

2538

2639
class OrderViewSet(viewsets.ModelViewSet):
40+
authentication_classes = AUTHENTICATION_CLASSES
41+
permission_classes = PERMISSION_CLASSES
2742
queryset = Order.objects.all()
2843
serializer_class = OrderSerializer
2944
schema = ChoicesAutoSchema()
3045

3146

3247
class AddressViewSet(viewsets.ModelViewSet):
48+
authentication_classes = AUTHENTICATION_CLASSES
49+
permission_classes = PERMISSION_CLASSES
3350
queryset = Address.objects.all()
3451
serializer_class = AddressSerializer
3552
schema = ChoicesAutoSchema()
3653

3754

3855
class ReviewViewSet(viewsets.ModelViewSet):
56+
authentication_classes = AUTHENTICATION_CLASSES
57+
permission_classes = PERMISSION_CLASSES
3958
queryset = Review.objects.all()
4059
serializer_class = ReviewSerializer
4160
schema = ChoicesAutoSchema()

0 commit comments

Comments
 (0)