Skip to content
Snippets Groups Projects
Verified Commit 490b9072 authored by Ernesto Rico Schmidt's avatar Ernesto Rico Schmidt
Browse files

feat: raise ValidationError when a playlist has multiple null duration entries

parent 8bd297ee
No related branches found
No related tags found
1 merge request!59Add playlists
Pipeline #8721 passed
......@@ -30,7 +30,7 @@ from rest_framework.permissions import exceptions
from django.conf import settings
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from django.db import IntegrityError
from django.db import IntegrityError, transaction
from django.db.models import Q
from django.utils import text, timezone
from program.models import (
......@@ -1522,15 +1522,22 @@ class PlaylistSerializer(serializers.ModelSerializer):
entries = validated_data.pop("entries", [])
playlist = Playlist.objects.create(created_by=user.username, **validated_data)
with transaction.atomic():
playlist = Playlist.objects.create(created_by=user.username, **validated_data)
for entry_data in entries:
try:
PlaylistEntry.objects.create(playlist=playlist, **entry_data)
except IntegrityError:
for entry_data in entries:
try:
PlaylistEntry.objects.create(playlist=playlist, **entry_data)
except IntegrityError:
raise exceptions.ValidationError(
code="playlist-entry-file-id-or-uri",
detail="playlist entries must either have file id or uri.",
)
if playlist.entries.filter(duration__isnull=True).count() > 1:
raise exceptions.ValidationError(
code="playlist-entry-file-id-or-uri",
detail="playlist entries must either have file id or uri.",
code="multiple-null-duration-playlist-entries",
detail="playlist may only have one entry without duration",
)
return playlist
......@@ -1547,26 +1554,33 @@ class PlaylistSerializer(serializers.ModelSerializer):
detail="You are not allowed to update this playlist."
)
if "description" in validated_data:
instance.description = validated_data.pop("description")
with transaction.atomic():
if "description" in validated_data:
instance.description = validated_data.pop("description")
if "playout_mode" in validated_data:
instance.playout_mode = validated_data.pop("playout_mode")
if "playout_mode" in validated_data:
instance.playout_mode = validated_data.pop("playout_mode")
if "entries" in validated_data:
if instance.entries.count() > 0:
for entry in instance.entries.all():
entry.delete(keep_parents=True)
if "entries" in validated_data:
if instance.entries.count() > 0:
for entry in instance.entries.all():
entry.delete(keep_parents=True)
for entry_data in validated_data.get("entries"):
try:
PlaylistEntry.objects.create(playlist=instance, **entry_data)
except IntegrityError:
for entry_data in validated_data.get("entries"):
try:
PlaylistEntry.objects.create(playlist=instance, **entry_data)
except IntegrityError:
raise exceptions.ValidationError(
code="playlist-entry-file-id-or-uri",
detail="playlist entries must either have file id or uri.",
)
if instance.entries.filter(duration__isnull=True).count() > 1:
raise exceptions.ValidationError(
code="playlist-entry-file-id-or-uri",
detail="playlist entries must either have file id or uri.",
code="multiple-null-duration-playlist-entries",
detail="playlist may only have one entry without duration",
)
instance.save()
instance.save()
return instance
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment