From 46757e4d5cad2508c657dda969c746f37bdcb860 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Wed, 16 Sep 2026 11:05:35 +0330 Subject: [PATCH] fix(video): align video playlist bookmarking logic with podcast pattern --- .../management/commands/cleanup_orphan_bookmarks.py | 7 ++++++- apps/bookmark/models/bookmark.py | 8 ++++---- apps/bookmark/signals.py | 2 ++ apps/bookmark/views/bookmark.py | 6 ++++-- apps/video/serializers.py | 9 +++++++-- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/bookmark/management/commands/cleanup_orphan_bookmarks.py b/apps/bookmark/management/commands/cleanup_orphan_bookmarks.py index cb80f97..3f1de63 100644 --- a/apps/bookmark/management/commands/cleanup_orphan_bookmarks.py +++ b/apps/bookmark/management/commands/cleanup_orphan_bookmarks.py @@ -47,7 +47,12 @@ class Command(BaseCommand): if not content_ids: continue - existing_ids = set(model_cls.objects.filter(id__in=content_ids).values_list('id', flat=True)) + if service_choice == Bookmark.ServiceChoices.VIDEO: + existing_ids = set(Video.objects.filter(id__in=content_ids).values_list('id', flat=True)) | set(VideoPlaylist.objects.filter(id__in=content_ids).values_list('id', flat=True)) + elif service_choice == Bookmark.ServiceChoices.PODCAST: + existing_ids = set(Podcast.objects.filter(id__in=content_ids).values_list('id', flat=True)) | set(PodcastPlaylist.objects.filter(id__in=content_ids).values_list('id', flat=True)) + else: + existing_ids = set(model_cls.objects.filter(id__in=content_ids).values_list('id', flat=True)) missing_ids = content_ids - existing_ids if missing_ids: diff --git a/apps/bookmark/models/bookmark.py b/apps/bookmark/models/bookmark.py index 7fe9d2c..34fa5c6 100644 --- a/apps/bookmark/models/bookmark.py +++ b/apps/bookmark/models/bookmark.py @@ -71,8 +71,8 @@ class Bookmark(models.Model): from apps.library.models import Book return Book.objects.filter(id=content_id).exists() elif service == cls.ServiceChoices.PODCAST: - from apps.podcast.models import Podcast - return Podcast.objects.filter(id=content_id).exists() + from apps.podcast.models import Podcast, PodcastPlaylist + return Podcast.objects.filter(id=content_id).exists() or PodcastPlaylist.objects.filter(id=content_id).exists() elif service == cls.ServiceChoices.PODCAST_PLAYLIST: from apps.podcast.models import PodcastPlaylist return PodcastPlaylist.objects.filter(id=content_id).exists() @@ -83,8 +83,8 @@ class Bookmark(models.Model): from apps.hadis.models import HadisCorrection return HadisCorrection.objects.filter(id=content_id).exists() elif service == cls.ServiceChoices.VIDEO: - from apps.video.models import Video - return Video.objects.filter(id=content_id).exists() + from apps.video.models import Video, VideoPlaylist + return Video.objects.filter(id=content_id).exists() or VideoPlaylist.objects.filter(id=content_id).exists() elif service == cls.ServiceChoices.VIDEO_PLAYLIST: from apps.video.models import VideoPlaylist return VideoPlaylist.objects.filter(id=content_id).exists() diff --git a/apps/bookmark/signals.py b/apps/bookmark/signals.py index be88d44..874e785 100644 --- a/apps/bookmark/signals.py +++ b/apps/bookmark/signals.py @@ -53,6 +53,7 @@ try: @receiver(post_delete, sender=VideoPlaylist) def on_video_playlist_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.VIDEO_PLAYLIST, instance.id) + _delete_bookmarks_for(Bookmark.ServiceChoices.VIDEO, instance.id) except ImportError: pass @@ -67,6 +68,7 @@ try: @receiver(post_delete, sender=PodcastPlaylist) def on_podcast_playlist_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.PODCAST_PLAYLIST, instance.id) + _delete_bookmarks_for(Bookmark.ServiceChoices.PODCAST, instance.id) except ImportError: pass diff --git a/apps/bookmark/views/bookmark.py b/apps/bookmark/views/bookmark.py index 9b30cbe..5c3a21c 100644 --- a/apps/bookmark/views/bookmark.py +++ b/apps/bookmark/views/bookmark.py @@ -274,8 +274,10 @@ def _get_valid_content_ids(service, content_ids): from apps.video.models import VideoPlaylist return set(VideoPlaylist.objects.filter(id__in=content_ids, status=True).values_list('id', flat=True)) elif service in ('video', 'video_item'): - from apps.video.models import Video - return set(Video.objects.filter(id__in=content_ids, status=True).values_list('id', flat=True)) + from apps.video.models import Video, VideoPlaylist + v_ids = set(Video.objects.filter(id__in=content_ids, status=True).values_list('id', flat=True)) + pl_ids = set(VideoPlaylist.objects.filter(id__in=content_ids, status=True).values_list('id', flat=True)) + return v_ids | pl_ids elif service == 'podcast': from apps.podcast.models import Podcast, PodcastPlaylist p_ids = set(Podcast.objects.filter(id__in=content_ids, status=True).values_list('id', flat=True)) diff --git a/apps/video/serializers.py b/apps/video/serializers.py index c307510..f02fc08 100644 --- a/apps/video/serializers.py +++ b/apps/video/serializers.py @@ -118,12 +118,17 @@ class VideoPlaylistDetailSerializer(serializers.ModelSerializer): """Get bookmark information for this playlist.""" request = self.context.get('request') user = request.user if request else None - print(user.id) book_mark = BookmarkStatusSerializer.get_bookmark_info( obj=obj, user=user, - service='video_playlist' + service='video' ) + if not book_mark.get('is_bookmarked', False): + book_mark = BookmarkStatusSerializer.get_bookmark_info( + obj=obj, + user=user, + service='video_playlist' + ) return book_mark.get('is_bookmarked', False) def get_user_rate(self, obj):