Adding Profile API functionality.

This commit is contained in:
Josh Washburne 2018-04-05 10:59:30 -04:00
parent 81c948783b
commit 62a4b8db40
3 changed files with 85 additions and 0 deletions

View file

@ -0,0 +1,38 @@
from django.contrib.auth import get_user_model
from rest_framework.serializers import ModelSerializer
from profiles.models import (RadioProfile, SongRequest)
User = get_user_model()
class HistorySerializer(ModelSerializer):
class Meta:
model = SongRequest
fields = ('created_date', 'played_at', 'profile', 'song')
class BasicUserSerializer(ModelSerializer):
class Meta:
model = User
fields = ('id', 'name', 'is_staff')
class FullUserSerializer(ModelSerializer):
class Meta:
model = User
fields = ('id', 'email', 'name', 'is_staff', 'is_active', 'last_login')
class BasicProfileSerializer(ModelSerializer):
user = BasicUserSerializer()
class Meta:
model = RadioProfile
fields = ('id', 'user')
class FullProfileSerializer(BasicProfileSerializer):
user = FullUserSerializer()

View file

@ -3,6 +3,7 @@ from django.urls import path
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from api.views.controls import JustPlayed, MakeRequest, NextRequest from api.views.controls import JustPlayed, MakeRequest, NextRequest
from api.views.profiles import ProfileViewSet
from api.views.radio import (AlbumViewSet, ArtistViewSet, from api.views.radio import (AlbumViewSet, ArtistViewSet,
GameViewSet, SongViewSet) GameViewSet, SongViewSet)
@ -21,6 +22,8 @@ class OptionalSlashRouter(DefaultRouter):
router = OptionalSlashRouter() router = OptionalSlashRouter()
router.register(r'profiles', ProfileViewSet, base_name='profile')
router.register(r'albums', AlbumViewSet, base_name='album') router.register(r'albums', AlbumViewSet, base_name='album')
router.register(r'artists', ArtistViewSet, base_name='artist') router.register(r'artists', ArtistViewSet, base_name='artist')
router.register(r'games', GameViewSet, base_name='game') router.register(r'games', GameViewSet, base_name='game')

View file

@ -0,0 +1,44 @@
from django.shortcuts import get_object_or_404
from rest_framework import status, viewsets
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from profiles.models import RadioProfile, Rating, SongRequest
from ..permissions import IsAdminOwnerOrReadOnly
from ..serializers.profiles import (BasicProfileSerializer,
FullProfileSerializer,
HistorySerializer)
class ProfileViewSet(viewsets.ModelViewSet):
permission_classes = [IsAdminOwnerOrReadOnly]
queryset = RadioProfile.objects.all()
serializer_class = BasicProfileSerializer
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.is_owner = False
def get_serializer_class(self):
'''
Choose a different serializer based on if the requesting user is an
admin or is the same person as the profile requested.
'''
if self.request.user.is_staff or self.is_owner:
return FullProfileSerializer
return BasicProfileSerializer
def get_object(self):
'''
Grab the object as normal, but let us know if the requesting user is
the owner.
'''
obj = get_object_or_404(self.get_queryset(), **self.kwargs)
if self.request.user.pk == obj.user.pk:
self.is_owner = True
else:
self.is_owner = False
self.check_object_permissions(self.request, obj)
return obj