import logging from django.db.models.signals import post_delete from django.dispatch import receiver from apps.bookmark.models import Bookmark logger = logging.getLogger(__name__) def _delete_bookmarks_for(service: str, content_id: int): if not content_id: return try: deleted_count, _ = Bookmark.objects.filter(service=service, content_id=content_id).delete() if deleted_count > 0: logger.info("[Bookmark] Auto-deleted %d bookmark(s) for %s ID %s upon content deletion.", deleted_count, service, content_id) except Exception as exc: logger.error("[Bookmark] Error deleting bookmarks for %s ID %s: %s", service, content_id, exc) # 1. Library Books try: from apps.library.models import Book @receiver(post_delete, sender=Book) def on_book_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.LIBRARY, instance.id) except ImportError: pass # 2. Hadith & Hadith Corrections try: from apps.hadis.models import Hadis, HadisCorrection @receiver(post_delete, sender=Hadis) def on_hadis_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.HADITH, instance.id) @receiver(post_delete, sender=HadisCorrection) def on_hadis_correction_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.HADITH_CORRECTION, instance.id) except ImportError: pass # 3. Videos & Video Playlists try: from apps.video.models import Video, VideoPlaylist @receiver(post_delete, sender=Video) def on_video_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.VIDEO, instance.id) @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 # 4. Podcasts & Podcast Playlists try: from apps.podcast.models import Podcast, PodcastPlaylist @receiver(post_delete, sender=Podcast) def on_podcast_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.PODCAST, instance.id) @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 # 5. Articles try: from apps.article.models import Article @receiver(post_delete, sender=Article) def on_article_deleted(sender, instance, **kwargs): _delete_bookmarks_for(Bookmark.ServiceChoices.ARTICLE, instance.id) except ImportError: pass