From 62a4b8db40b48508b734f9df350558ad5b685905 Mon Sep 17 00:00:00 2001 From: Josh Washburne Date: Thu, 5 Apr 2018 10:59:30 -0400 Subject: [PATCH] Adding Profile API functionality. --- savepointradio/api/serializers/profiles.py | 38 +++++++++++++++++++ savepointradio/api/urls.py | 3 ++ savepointradio/api/views/profiles.py | 44 ++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 savepointradio/api/serializers/profiles.py create mode 100644 savepointradio/api/views/profiles.py diff --git a/savepointradio/api/serializers/profiles.py b/savepointradio/api/serializers/profiles.py new file mode 100644 index 0000000..d6aef38 --- /dev/null +++ b/savepointradio/api/serializers/profiles.py @@ -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() diff --git a/savepointradio/api/urls.py b/savepointradio/api/urls.py index 5b13c18..0588d91 100644 --- a/savepointradio/api/urls.py +++ b/savepointradio/api/urls.py @@ -3,6 +3,7 @@ from django.urls import path from rest_framework.routers import DefaultRouter from api.views.controls import JustPlayed, MakeRequest, NextRequest +from api.views.profiles import ProfileViewSet from api.views.radio import (AlbumViewSet, ArtistViewSet, GameViewSet, SongViewSet) @@ -21,6 +22,8 @@ class OptionalSlashRouter(DefaultRouter): router = OptionalSlashRouter() +router.register(r'profiles', ProfileViewSet, base_name='profile') + router.register(r'albums', AlbumViewSet, base_name='album') router.register(r'artists', ArtistViewSet, base_name='artist') router.register(r'games', GameViewSet, base_name='game') diff --git a/savepointradio/api/views/profiles.py b/savepointradio/api/views/profiles.py new file mode 100644 index 0000000..a2f9a02 --- /dev/null +++ b/savepointradio/api/views/profiles.py @@ -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