рефакторинг вьюшек

This commit is contained in:
Mike0001-droid 2024-06-27 17:10:16 +05:00
parent f5725e085b
commit 21c5b29d30
3 changed files with 41 additions and 33 deletions

View File

@ -0,0 +1,25 @@
from conf.settings import AZURACAST_URL, AZURACAST_API_KEY
import requests
def authorize_url(url):
file_url = url
API_KEY = AZURACAST_API_KEY
headers = {
"Authorization": f"Bearer {API_KEY}"
}
return requests.get(file_url, headers=headers)
class AzuraCast:
api_key = AZURACAST_API_KEY
url = AZURACAST_URL
@staticmethod
def add_to_playlist(azura_id, data):
file_url = f"{AZURACAST_URL}api/station/it-radio/file/{azura_id}"
response = authorize_url(file_url)
file_play = f"{AZURACAST_URL}api/station/it-radio/file/{response.json()['unique_id']}/play"
data.update(unique_id=file_play)
return data

View File

@ -6,12 +6,12 @@ from rest_framework import status
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.shortcuts import get_object_or_404, get_list_or_404 from django.shortcuts import get_object_or_404, get_list_or_404
from rest_framework.permissions import IsAuthenticated, AllowAny from rest_framework.permissions import IsAuthenticated, AllowAny
import requests from audio.service import AzuraCast
from django.http import HttpResponse from django.http import HttpResponse
import requests
from .schemas import SongSchema, DeleteSongSchema, PlayListSchema from audio.schemas import SongSchema, DeleteSongSchema, PlayListSchema
from .models import Song, FavoriteSong, PlayList, Podkast from audio.models import Song, FavoriteSong, PlayList, Podkast
from .serializers import SongSerializer, FavoriteSongSerializer, PlayListSerializer, PodkastSerializer from audio.serializers import SongSerializer, FavoriteSongSerializer, PlayListSerializer, PodkastSerializer
from conf.settings.base import AZURACAST_URL, AZURACAST_API_KEY from conf.settings.base import AZURACAST_URL, AZURACAST_API_KEY
def authorize_url(url): def authorize_url(url):
@ -22,7 +22,6 @@ def authorize_url(url):
} }
return requests.get(file_url, headers=headers) return requests.get(file_url, headers=headers)
class PodkastViewSet(GenericViewSet): class PodkastViewSet(GenericViewSet):
queryset = Podkast queryset = Podkast
serializer_class = PodkastSerializer serializer_class = PodkastSerializer
@ -44,7 +43,8 @@ class PodkastViewSet(GenericViewSet):
class PlayListViewSet(GenericViewSet): class PlayListViewSet(GenericViewSet):
queryset = PlayList azura = AzuraCast()
queryset = PlayList.objects.all()
serializer_class = PlayListSerializer serializer_class = PlayListSerializer
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
def list(self, request): def list(self, request):
@ -64,7 +64,6 @@ class PlayListViewSet(GenericViewSet):
@action(detail=False, methods=['post'], schema=PlayListSchema()) @action(detail=False, methods=['post'], schema=PlayListSchema())
def create_playlist(self, request): def create_playlist(self, request):
if request.data.get('name', False): if request.data.get('name', False):
try: try:
instance = self.get_queryset().objects.get(pk=request.data['playlist_id'], user=request.user.pk) instance = self.get_queryset().objects.get(pk=request.data['playlist_id'], user=request.user.pk)
@ -80,8 +79,7 @@ class PlayListViewSet(GenericViewSet):
status=status.HTTP_404_NOT_FOUND) status=status.HTTP_404_NOT_FOUND)
else: else:
playlist_pk = self.get_queryset().objects.filter(user=request.user.pk) playlist_pk = self.get_queryset().objects.filter(user=request.user.pk)
number_playlist = len(playlist_pk) + 1 name = f"Плейлист № {len(playlist_pk)+1}"
name = f"Плейлист № {number_playlist}"
data = request.data data = request.data
data.update(user=request.user.pk, name=name) data.update(user=request.user.pk, name=name)
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
@ -126,36 +124,20 @@ class PlayListViewSet(GenericViewSet):
status=status.HTTP_404_NOT_FOUND) status=status.HTTP_404_NOT_FOUND)
@action(detail=False, methods=['post'], schema=PlayListSchema()) @action(detail=True, methods=['post'], schema=PlayListSchema())
def add_to_playlist(self, request): def add_to_playlist(self, request, *args, **kwargs):
song = None song = None
try: try:
song = Song.objects.get(azura_id=request.data.get('azura_id')).pk song = Song.objects.get(azura_id=request.data.get('azura_id')).pk
except ObjectDoesNotExist: except ObjectDoesNotExist:
file_url = f"{AZURACAST_URL}api/station/it-radio/file/{request.data['azura_id']}" data = self.azura.add_to_playlist(request.data['azura_id'], request.data)
response = authorize_url(file_url)
data = request.data
file_play = f"{AZURACAST_URL}api/station/it-radio/file/{response.json()['unique_id']}/play"
data.update(unique_id=file_play)
song_serializer = SongSerializer(data=data) song_serializer = SongSerializer(data=data)
if song_serializer.is_valid(): if song_serializer.is_valid():
song_serializer.save() song_serializer.save()
song = song_serializer.data.get('id') song = song_serializer.data
try: instance = self.get_object()
instance = self.get_queryset().objects.get(pk=request.data.get('playlist_id')) instance.song.add(song)
except ObjectDoesNotExist: serializer = self.get_serializer(instance)
return Response(
{'detail': 'Плейлиста не существует', 'error': {'PlayList': 'Плейлиста не существует'}},
status=status.HTTP_404_NOT_FOUND)
songs = list(instance.song.all().values_list('pk', flat=True)) + [song]
data = {
'playlist_id': request.data.get('playlist_id'),
'song': songs
}
serializer = PlayListSerializer(data=data, partial=True, instance=instance)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data) return Response(serializer.data)
@ -163,6 +145,7 @@ class SongViewSet(GenericViewSet):
queryset = Song queryset = Song
serializer_class = SongSerializer serializer_class = SongSerializer
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
def list(self, request): def list(self, request):
songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True) songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True)