from django.shortcuts import render from rest_framework.viewsets import ViewSet, GenericViewSet from rest_framework.response import Response from rest_framework.decorators import action from rest_framework import status from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.shortcuts import get_object_or_404, get_list_or_404 from rest_framework.permissions import IsAuthenticated import requests from .schemas import SongSchema, DeleteSongSchema from .models import Song, FavoriteSong from .serializers import SongSerializer, FavoriteSongSerializer class SongViewSet(GenericViewSet): permission_classes_by_action = { 'list': [IsAuthenticated], 'retrieve': [IsAuthenticated], 'create_song': [IsAuthenticated] } def list(self, request): songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True) queryset = Song.objects.filter(id__in=songs_pk) serializer = SongSerializer(queryset, many=True) return Response(serializer.data) def retrieve(self, request, pk=None): try: song_obj = Song.objects.get(azura_id=pk).pk queryset = FavoriteSong.objects.get(user=request.user.pk, song=song_obj) except ObjectDoesNotExist: print("Объект не сушествует") except MultipleObjectsReturned: print("Найдено более одного объекта") serializer = FavoriteSongSerializer(queryset) return Response(serializer.data) @action(detail=False, methods=['post'], schema=SongSchema()) def create_song(self, request): song = get_object_or_404(Song, azura_id=request.data['azura_id']) data = None #Если трек есть в базе if song: data = { "song": song.pk, "user": request.user.pk } #Если трека нету в базе else: file_url = f"http://82.97.242.49:10084/api/station/it-radio/file/{request.data['azura_id']}" api_key = "49226d3488aac3f5:18d88659c6c1c5e131a0ce0a94d55235" headers = { "Authorization": f"Bearer {api_key}" } response = requests.get(file_url, headers=headers) data = request.data file_play = f"http://82.97.242.49:10084/api/station/it-radio/file/{response.json()['unique_id']}/play" data.update(unique_id = file_play) serializer = SongSerializer(data=data) if serializer.is_valid(): serializer.save() data = { "song": serializer.data['id'], "user": request.user.pk } serializer = FavoriteSongSerializer(data=data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @action(detail=False, methods=['post'], schema=DeleteSongSchema()) def delete_song(self, request): song_id = request.data['song_id'] item = get_object_or_404(FavoriteSong, pk=song_id) item.delete() return Response(status=status.HTTP_202_ACCEPTED) def get_permissions(self): try: return [permission() for permission in self.permission_classes_by_action[self.action]] except KeyError: return [permission() for permission in self.permission_classes]