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 from decouple import config from urllib.parse import urljoin from django.http import HttpRequest import requests from .schemas import SongSchema, DeleteSongSchema from .models import Song, FavoriteSong from .serializers import SongSerializer, FavoriteSongSerializer class SongViewSet(GenericViewSet): serializer_class = SongSerializer permission_classes = (IsAuthenticated,) queryset = Song.objects.all() 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(f"{HttpRequest.build_absolute_uri()}") def retrieve(self, request, pk=None): try: song_obj = Song.objects.get(azura_id=pk) queryset = FavoriteSong.objects.get(user=request.user, song=song_obj) except ObjectDoesNotExist: return Response({"error": 'Объекта не существует'}, status=status.HTTP_404_NOT_FOUND) 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 = urljoin(config('URL_PROD'), f'/api/station/it-radio/file/{request.data['azura_id']}') API_KEY = config('API_KEY') 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]