исправил ошибку + добавил валидацию

This commit is contained in:
Mike0001-droid 2024-07-02 15:04:36 +05:00
parent 324a9d5365
commit f31cba3030
8 changed files with 42 additions and 21 deletions

View File

@ -5,7 +5,7 @@ from .models import Song, FavoriteSong, PlayList, Podkast
class SongAdmin(admin.ModelAdmin): class SongAdmin(admin.ModelAdmin):
list_display = ('slug', 'title', 'artist', 'genre', 'album') list_display = ('slug', 'title', 'artist', 'genre', 'album')
exclude = ('azura_id',) exclude = ('azura_id',)
readonly_fields = ['slug'] readonly_fields = ['slug', 'unique_id']
@admin.register(FavoriteSong) @admin.register(FavoriteSong)

View File

@ -54,7 +54,6 @@ class PlayList(models.Model):
class Meta: class Meta:
verbose_name = 'Плейлисты' verbose_name = 'Плейлисты'
unique_together = ('name', 'user')
verbose_name_plural = 'Плейлисты' verbose_name_plural = 'Плейлисты'
class Podkast(models.Model): class Podkast(models.Model):

View File

@ -7,6 +7,16 @@ class SongSerializer(serializers.ModelSerializer):
fields = ('id', 'unique_id', 'azura_id', 'title', 'artist', 'album', 'genre', 'art') fields = ('id', 'unique_id', 'azura_id', 'title', 'artist', 'album', 'genre', 'art')
class PlayListSerializer(serializers.ModelSerializer): class PlayListSerializer(serializers.ModelSerializer):
def validate(self, attrs):
if PlayList.objects.filter(
name=attrs.get('name'),
user=attrs.get('user')
).exists():
raise serializers.ValidationError(
{
'playlist': ['Данный плейлист уже существует']
})
return super().validate(attrs)
class Meta: class Meta:
model = PlayList model = PlayList
fields = ('id', 'name', 'song', 'user', 'playlist_art') fields = ('id', 'name', 'song', 'user', 'playlist_art')
@ -18,13 +28,21 @@ class PlayListSerializer(serializers.ModelSerializer):
return rep return rep
class FavoriteSongSerializer(serializers.ModelSerializer): class FavoriteSongSerializer(serializers.ModelSerializer):
def __init__(self, *args, **kwargs):
self.request_user = kwargs.pop('request_user', None) def validate(self, attrs):
super().__init__(*args, **kwargs) if FavoriteSong.objects.filter(
song=attrs.get('song'),
user=attrs.get('user')
).exists():
raise serializers.ValidationError(
{
'song': ['Данный трек уже добавлен в избранное']
})
return super().validate(attrs)
class Meta: class Meta:
model = FavoriteSong model = FavoriteSong
fields = ('id', 'song',) fields = ('id', 'song', 'user')
def to_representation(self, instance): def to_representation(self, instance):
rep = super().to_representation(instance) rep = super().to_representation(instance)
@ -37,3 +55,4 @@ class PodkastSerializer(serializers.ModelSerializer):
model = Podkast model = Podkast
fields = '__all__' fields = '__all__'

View File

@ -58,18 +58,20 @@ class PlayListViewSet(GenericViewSet):
data = request.data data = request.data
data.update(user=request.user.pk) data.update(user=request.user.pk)
serializer = self.get_serializer(data=request.data) serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True) if serializer.is_valid():
serializer.save() serializer.save()
return Response(serializer.data) return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else: else:
playlist_pk = self.get_queryset().objects.filter(user=request.user.pk) playlist_pk = self.get_queryset().filter(user=request.user.pk)
name = f"Плейлист № {len(playlist_pk)+1}" name = f"Плейлист № {len(playlist_pk)+1}"
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)
serializer.is_valid(raise_exception=True) if serializer.is_valid():
serializer.save() serializer.save()
return Response(serializer.data) return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@action(detail=True, methods=['post'], schema=PlayListSchema()) @action(detail=True, methods=['post'], schema=PlayListSchema())
def update_playlist(self, request, *args, **kwargs): def update_playlist(self, request, *args, **kwargs):
@ -117,8 +119,9 @@ class FavoriteSongViewSet(GenericViewSet):
azura = AzuraCast() azura = AzuraCast()
queryset = FavoriteSong.objects.all() queryset = FavoriteSong.objects.all()
serializer_class = FavoriteSongSerializer serializer_class = FavoriteSongSerializer
permission_classes = (IsAuthenticated, ) #permission_classes = (IsAuthenticated, )
lookup_field = 'azura_id' lookup_field = 'azura_id'
def list(self, request): def list(self, request):
queryset = self.get_queryset() queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True, request_user=request.user) serializer = self.get_serializer(queryset, many=True, request_user=request.user)
@ -138,7 +141,6 @@ class FavoriteSongViewSet(GenericViewSet):
data = None data = None
try: try:
song = Song.objects.get(azura_id=request.data.get('azura_id')) song = Song.objects.get(azura_id=request.data.get('azura_id'))
data = { data = {
'song': song.pk, 'song': song.pk,
'user': request.user.pk 'user': request.user.pk
@ -154,8 +156,9 @@ class FavoriteSongViewSet(GenericViewSet):
"song": serializer.data['id'], "song": serializer.data['id'],
"user": request.user.pk "user": request.user.pk
} }
serializer = self.get_serializer(data=data) serializer = self.get_serializer(data=data)
if serializer.is_valid(): if serializer.validate(data):
serializer.save() serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.data, status=status.HTTP_201_CREATED)
else: else:
@ -164,7 +167,7 @@ class FavoriteSongViewSet(GenericViewSet):
@action(detail=True, methods=['delete']) @action(detail=True, methods=['delete'])
def delete_song(self, request, *args, **kwargs): def delete_song(self, request, *args, **kwargs):
try: try:
song = Song.objects.get(azura_id = kwargs.get('azura_id')) song = Song.objects.get(azura_id=kwargs.get('azura_id'))
queryset = self.get_queryset().get(user=request.user, song=song.pk) queryset = self.get_queryset().get(user=request.user, song=song.pk)
queryset.delete() queryset.delete()
return Response(status=status.HTTP_202_ACCEPTED) return Response(status=status.HTTP_202_ACCEPTED)

View File

@ -1,4 +1,4 @@
# Generated by Django 5.0.6 on 2024-07-01 09:51 # Generated by Django 5.0.6 on 2024-07-02 05:18
import django.utils.timezone import django.utils.timezone
from django.db import migrations, models from django.db import migrations, models

View File

@ -1,4 +1,4 @@
# Generated by Django 5.0.6 on 2024-07-01 09:51 # Generated by Django 5.0.6 on 2024-07-02 05:18
from django.db import migrations, models from django.db import migrations, models