From 63b1865405ffe70d58e6209fea01a28062efc400 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sun, 19 Jul 2026 11:32:11 +0330 Subject: [PATCH] videos serializer and api updated --- apps/video/models.py | 2 +- apps/video/serializers_dovodi.py | 38 ++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/apps/video/models.py b/apps/video/models.py index 6a995a5..b384d5f 100644 --- a/apps/video/models.py +++ b/apps/video/models.py @@ -1,6 +1,7 @@ from django.db import models from django.utils.translation import gettext_lazy as _ from django.conf import settings +import datetime from filer.fields.image import FilerImageField from utils import generate_slug_for_model from utils.mixins import LowercaseSlugMixin @@ -139,7 +140,6 @@ class Video(LowercaseSlugMixin, models.Model): file_changed = True if not self.video_time: - import datetime self.video_time = datetime.time(0, 0, 0) super().save(*args, **kwargs) diff --git a/apps/video/serializers_dovodi.py b/apps/video/serializers_dovodi.py index c02b466..6b23f78 100644 --- a/apps/video/serializers_dovodi.py +++ b/apps/video/serializers_dovodi.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from .models import Video, VideoCategory, VideoCollection +from .models import Video, VideoCategory, VideoCollection, VideoPlaylist, PlaylistItem from .serializers_admin import AbsoluteFileField, AbsoluteImageField @@ -50,6 +50,8 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer): video_file = AbsoluteFileField(required=False, allow_null=True) remove_thumbnail = serializers.BooleanField(write_only=True, required=False, default=False) remove_video_file = serializers.BooleanField(write_only=True, required=False, default=False) + playlist = serializers.IntegerField(required=False, allow_null=True, write_only=True) + playlist_id = serializers.SerializerMethodField(read_only=True) class Meta: model = Video @@ -65,12 +67,18 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer): "video_time", "status", "view_count", + "playlist", + "playlist_id", "created_at", "updated_at", "remove_thumbnail", "remove_video_file", ] - read_only_fields = ["id", "view_count", "created_at", "updated_at"] + read_only_fields = ["id", "view_count", "playlist_id", "created_at", "updated_at"] + + def get_playlist_id(self, obj): + appearance = obj.playlist_appearances.first() + return appearance.playlist_id if appearance else None def validate(self, attrs): video_type = attrs.get("video_type", getattr(self.instance, "video_type", None)) @@ -96,9 +104,17 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer): return attrs def create(self, validated_data): + playlist_id = validated_data.pop("playlist", None) validated_data.pop("remove_thumbnail", False) validated_data.pop("remove_video_file", False) - return super().create(validated_data) + instance = super().create(validated_data) + if playlist_id: + try: + playlist = VideoPlaylist.objects.get(id=playlist_id) + PlaylistItem.objects.create(playlist=playlist, video=instance, priority=playlist.playlist_items.count() + 1) + except VideoPlaylist.DoesNotExist: + pass + return instance def update(self, instance, validated_data): remove_thumbnail = validated_data.pop("remove_thumbnail", False) @@ -112,4 +128,18 @@ class DovodiVideoItemSerializer(serializers.ModelSerializer): instance.video_file.delete(save=False) instance.video_file = None - return super().update(instance, validated_data) + playlist_in_payload = "playlist" in self.initial_data + playlist_id = validated_data.pop("playlist", None) + + instance = super().update(instance, validated_data) + + if playlist_in_payload: + instance.playlist_appearances.all().delete() + if playlist_id: + try: + playlist = VideoPlaylist.objects.get(id=playlist_id) + PlaylistItem.objects.create(playlist=playlist, video=instance, priority=playlist.playlist_items.count() + 1) + except VideoPlaylist.DoesNotExist: + pass + + return instance