Skip to content

Commit

Permalink
add hyperlinks and relationships
Browse files Browse the repository at this point in the history
  • Loading branch information
0-th committed Jun 27, 2023
1 parent df04ebf commit c97da7a
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 9 deletions.
14 changes: 9 additions & 5 deletions snippets/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,25 @@
from django.contrib.auth.models import User


class SnippetSerializer(serializers.ModelSerializer):
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
owner = serializers.ReadOnlyField(source='owner.username')
highlight = serializers.HyperlinkedIdentityField(
view_name='snippet-highlight', format='html'
)

class Meta:
model = Snippet
fields = [
'id', 'title', 'code', 'linenos', 'language', 'style', 'owner',
'url', 'id', 'title', 'code', 'linenos', 'language', 'style',
'owner', 'highlight',
]


class UserSerializer(serializers.ModelSerializer):
snippets = serializers.PrimaryKeyRelatedField(
many=True, queryset=Snippet.objects.all()
snippets = serializers.HyperlinkedRelatedField(
many=True, view_name='snippet-detail', read_only=True
)

class Meta:
model = User
fields = ['id', 'username', 'snippets']
fields = ['url', 'id', 'username', 'snippets']
11 changes: 7 additions & 4 deletions snippets/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@


urlpatterns = [
path('snippets/', views.SnippetList.as_view()),
path('snippets/<int:pk>/', views.SnippetDetail.as_view()),
path('users/', views.UserList.as_view()),
path('users/<int:pk>', views.UserDetail.as_view()),
path('', views.api_root),
path('snippets/', views.SnippetList.as_view(), name='snippet-list'),
path('snippets/<int:pk>/', views.SnippetDetail.as_view(),
name='snippet-detail'),
path('snippets/<int:pk>/highlight/', views.SnippetHighlight.as_view(), name='snippet-highlight'),
path('users/', views.UserList.as_view(), name='user-list'),
path('users/<int:pk>', views.UserDetail.as_view(), name='user-detail'),
]

urlpatterns = format_suffix_patterns(urlpatterns)
27 changes: 27 additions & 0 deletions snippets/views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
from rest_framework import generics
from django.contrib.auth.models import User
from rest_framework import permissions
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework import renderers

from .models import Snippet
from .serializers import SnippetSerializer, UserSerializer
from .permissions import IsOwnerOrReadOnly


@api_view(['GET'])
def api_root(request, format=None):
return Response(
data={
'users': reverse(
viewname='user-list', request=request, format=format
),
'snippets': reverse(
viewname='snippet-list', request=request, format=format
)
}
)


class SnippetList(generics.ListCreateAPIView):
"""
List all code snippets or create a new snippet
Expand Down Expand Up @@ -36,6 +54,15 @@ class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
]


class SnippetHighlight(generics.GenericAPIView):
queryset = Snippet.objects.all()
renderer_classes = [renderers.StaticHTMLRenderer]

def get(self, request, *args, **kwargs):
snippet = self.get_object()
return Response(data=snippet.highlighted)


class UserList(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
Expand Down
6 changes: 6 additions & 0 deletions tutorial/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,9 @@
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':
'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}

0 comments on commit c97da7a

Please sign in to comment.