From 1de9e2bf6e9cf33be81c165e9285c6db6a423784 Mon Sep 17 00:00:00 2001 From: spl0k Date: Fri, 11 Nov 2016 17:28:14 +0100 Subject: [PATCH] References deletion Should fix #38 --- supysonic/api/playlists.py | 1 + supysonic/managers/folder.py | 4 ++++ supysonic/managers/user.py | 11 +++++++++++ supysonic/scanner.py | 12 ++++++++++++ 4 files changed, 28 insertions(+) diff --git a/supysonic/api/playlists.py b/supysonic/api/playlists.py index a56b35f..535de8f 100644 --- a/supysonic/api/playlists.py +++ b/supysonic/api/playlists.py @@ -98,6 +98,7 @@ def delete_playlist(): if res.user_id != request.user.id and not request.user.admin: return request.error_formatter(50, "You're not allowed to delete a playlist that isn't yours") + res.tracks.clear() store.remove(res) store.commit() return request.formatter({}) diff --git a/supysonic/managers/folder.py b/supysonic/managers/folder.py index c39196b..51206d7 100644 --- a/supysonic/managers/folder.py +++ b/supysonic/managers/folder.py @@ -87,6 +87,10 @@ class FolderManager: for track in store.find(Track, Track.root_folder_id == folder.id): scanner.remove_file(track.path) scanner.finish() + + store.find(StarredFolder, StarredFolder.starred_id == uid).remove() + store.find(RatingFolder, RatingFolder.rated_id == uid).remove() + store.remove(folder) store.commit() diff --git a/supysonic/managers/user.py b/supysonic/managers/user.py index 362eb75..8e7821a 100644 --- a/supysonic/managers/user.py +++ b/supysonic/managers/user.py @@ -74,6 +74,17 @@ class UserManager: if status != UserManager.SUCCESS: return status + store.find(StarredFolder, StarredFolder.user_id == uid).remove() + store.find(StarredArtist, StarredArtist.user_id == uid).remove() + store.find(StarredAlbum, StarredAlbum.user_id == uid).remove() + store.find(StarredTrack, StarredTrack.user_id == uid).remove() + store.find(RatingFolder, RatingFolder.user_id == uid).remove() + store.find(RatingTrack, RatingTrack.user_id == uid).remove() + store.find(ChatMessage, ChatMessage.user_id == uid).remove() + for playlist in store.find(Playlist, Playlist.user_id == uid): + playlist.tracks.clear() + store.remove(playlist) + store.remove(user) store.commit() diff --git a/supysonic/scanner.py b/supysonic/scanner.py index ec5a82a..7545331 100644 --- a/supysonic/scanner.py +++ b/supysonic/scanner.py @@ -102,12 +102,16 @@ class Scanner: def finish(self): for album in [ a for a in self.__albums_to_check if not a.tracks.count() ]: + self.__store.find(StarredAlbum, StarredAlbum.starred_id == album.id).remove() + self.__artists_to_check.add(album.artist) self.__store.remove(album) self.__deleted_albums += 1 self.__albums_to_check.clear() for artist in [ a for a in self.__artists_to_check if not a.albums.count() and not a.tracks.count() ]: + self.__store.find(StarredArtist, StarredArtist.starred_id == artist.id).remove() + self.__store.remove(artist) self.__deleted_artists += 1 self.__artists_to_check.clear() @@ -118,6 +122,9 @@ class Scanner: continue if not folder.tracks.count() and not folder.children.count(): + self.__store.find(StarredFolder, StarredFolder.starred_id == folder.id).remove() + self.__store.find(RatingFolder, RatingFolder.rated_id == folder.id).remove() + self.__folders_to_check.add(folder.parent) self.__store.remove(folder) @@ -193,6 +200,11 @@ class Scanner: if not tr: return + self.__store.find(StarredTrack, StarredTrack.starred_id == tr.id).remove() + self.__store.find(RatingTrack, RatingTrack.rated_id == tr.id).remove() + self.__store.find(PlaylistTrack, PlaylistTrack.track_id == tr.id).remove() + self.__store.find(User, User.last_play_id == tr.id).set(User.last_play_id = None) + self.__folders_to_check.add(tr.folder) self.__albums_to_check.add(tr.album) self.__artists_to_check.add(tr.artist)