diff --git a/playlist/serializers/__init__.py b/playlist/serializers/__init__.py index 1f7661a..442a01c 100644 --- a/playlist/serializers/__init__.py +++ b/playlist/serializers/__init__.py @@ -1,3 +1,4 @@ from .track import TrackSerializer from .artist import ArtistSerializer from .user import UserSerializer +from .album import AlbumSerializer diff --git a/playlist/serializers/album.py b/playlist/serializers/album.py new file mode 100644 index 0000000..43c2413 --- /dev/null +++ b/playlist/serializers/album.py @@ -0,0 +1,12 @@ +from django.db.models.functions import Extract +from playlist.models import Album +from rest_framework import serializers + +class AlbumSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Album + fields = '__all__' + extra_kwargs = { + 'url': {'view_name': 'api-album', 'lookup_field': 'id'}, + 'artists': {'view_name': 'api-artist', 'lookup_field': 'id'}, + } diff --git a/playlist/serializers/track.py b/playlist/serializers/track.py index 863826f..3fe7182 100644 --- a/playlist/serializers/track.py +++ b/playlist/serializers/track.py @@ -4,9 +4,10 @@ from rest_framework import serializers class TrackSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Track - fields = ['url', 'id', 'name', 'artists', 'nominated_by', 'explicit', 'duration_ms', 'popularity', 'banter', 'banter_done', 'old'] + fields = '__all__' extra_kwargs = { 'url': {'view_name': 'api-track', 'lookup_field': 'id'}, 'artists': {'view_name': 'api-artist', 'lookup_field': 'id'}, + 'album': {'view_name': 'api-album', 'lookup_field': 'id'}, 'nominated_by': {'view_name': 'api-user', 'lookup_field': 'id'} } diff --git a/playlist/urls.py b/playlist/urls.py index 0391ed1..a7e091c 100644 --- a/playlist/urls.py +++ b/playlist/urls.py @@ -11,6 +11,8 @@ urlpatterns = [ path('api/artist', views.ArtistListView.as_view(), name="api-artists"), path('api/users', views.UserListView.as_view(), name="api-users"), path('api/user/', views.UserDetailView.as_view(), name="api-user"), + path('api/album/', views.AlbumDetailView.as_view(), name="api-album"), + path('api/album', views.AlbumListView.as_view(), name="api-albums"), path('track/', views.NominateView.as_view(), name="nominate"), path('vote/', views.VoteView.as_view(), name="vote"), path('vote/undo', views.UndoView.as_view(), name="undo"), diff --git a/playlist/views/__init__.py b/playlist/views/__init__.py index edb2f40..ee95d78 100644 --- a/playlist/views/__init__.py +++ b/playlist/views/__init__.py @@ -3,3 +3,4 @@ from .api.root import * from .api.track import * from .api.artist import * from .api.user import * +from .api.album import * diff --git a/playlist/views/api/album.py b/playlist/views/api/album.py new file mode 100644 index 0000000..c3e47e4 --- /dev/null +++ b/playlist/views/api/album.py @@ -0,0 +1,24 @@ +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework.authentication import SessionAuthentication +from rest_framework.permissions import IsAuthenticated +from playlist.models import Album +from playlist.serializers import AlbumSerializer + +class AlbumListView(APIView): + authentication_classes = [SessionAuthentication] + permission_classes = [IsAuthenticated] + + def get(self, request): + albums = Album.objects.all() + serializer = AlbumSerializer(albums, many=True, context={'request': request}) + return Response(serializer.data) + +class AlbumDetailView(APIView): + authentication_classes = [SessionAuthentication] + permission_classes = [IsAuthenticated] + + def get(self, request, id): + album = Album.objects.get(pk=id) + serializer = AlbumSerializer(album, context={'request': request}) + return Response(serializer.data) diff --git a/playlist/views/api/root.py b/playlist/views/api/root.py index b247a6f..8da8d24 100644 --- a/playlist/views/api/root.py +++ b/playlist/views/api/root.py @@ -7,5 +7,7 @@ from rest_framework.reverse import reverse def api_root(request, format=None): return Response({ 'tracks': reverse('api-tracks', request=request, format=format), - 'artists': reverse('api-artists', request=request, format=format) + 'artists': reverse('api-artists', request=request, format=format), + 'users': reverse('api-users', request=request, format=format), + 'albums': reverse('api-albums', request=request, format=format), })