From 8c5924d6e3c4bd66d9f013aa2b5e8d7ec7e8ec97 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Sun, 21 Oct 2018 19:58:05 +0200
Subject: [PATCH] Ensure distinct is applied on all playable_by querysets

---
 api/funkwhale_api/music/models.py     | 16 ++++++++--------
 api/funkwhale_api/playlists/models.py |  8 ++++----
 2 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py
index 318640c8..6d3c0dff 100644
--- a/api/funkwhale_api/music/models.py
+++ b/api/funkwhale_api/music/models.py
@@ -135,9 +135,9 @@ class ArtistQuerySet(models.QuerySet):
     def playable_by(self, actor, include=True):
         tracks = Track.objects.playable_by(actor, include)
         if include:
-            return self.filter(tracks__in=tracks)
+            return self.filter(tracks__in=tracks).distinct()
         else:
-            return self.exclude(tracks__in=tracks)
+            return self.exclude(tracks__in=tracks).distinct()
 
 
 class Artist(APIModelMixin):
@@ -203,9 +203,9 @@ class AlbumQuerySet(models.QuerySet):
     def playable_by(self, actor, include=True):
         tracks = Track.objects.playable_by(actor, include)
         if include:
-            return self.filter(tracks__in=tracks)
+            return self.filter(tracks__in=tracks).distinct()
         else:
-            return self.exclude(tracks__in=tracks)
+            return self.exclude(tracks__in=tracks).distinct()
 
 
 class Album(APIModelMixin):
@@ -399,9 +399,9 @@ class TrackQuerySet(models.QuerySet):
     def playable_by(self, actor, include=True):
         files = Upload.objects.playable_by(actor, include)
         if include:
-            return self.filter(uploads__in=files)
+            return self.filter(uploads__in=files).distinct()
         else:
-            return self.exclude(uploads__in=files)
+            return self.exclude(uploads__in=files).distinct()
 
     def annotate_duration(self):
         first_upload = Upload.objects.filter(track=models.OuterRef("pk")).order_by("pk")
@@ -557,8 +557,8 @@ class UploadQuerySet(models.QuerySet):
         libraries = Library.objects.viewable_by(actor)
 
         if include:
-            return self.filter(library__in=libraries, import_status="finished")
-        return self.exclude(library__in=libraries, import_status="finished")
+            return self.filter(library__in=libraries, import_status="finished").distinct()
+        return self.exclude(library__in=libraries, import_status="finished").distinct()
 
     def local(self, include=True):
         return self.exclude(library__actor__user__isnull=include)
diff --git a/api/funkwhale_api/playlists/models.py b/api/funkwhale_api/playlists/models.py
index ac86b97a..e1895137 100644
--- a/api/funkwhale_api/playlists/models.py
+++ b/api/funkwhale_api/playlists/models.py
@@ -51,9 +51,9 @@ class PlaylistQuerySet(models.QuerySet):
     def playable_by(self, actor, include=True):
         plts = PlaylistTrack.objects.playable_by(actor, include)
         if include:
-            return self.filter(playlist_tracks__in=plts)
+            return self.filter(playlist_tracks__in=plts).distinct()
         else:
-            return self.exclude(playlist_tracks__in=plts)
+            return self.exclude(playlist_tracks__in=plts).distinct()
 
 
 class Playlist(models.Model):
@@ -167,9 +167,9 @@ class PlaylistTrackQuerySet(models.QuerySet):
     def playable_by(self, actor, include=True):
         tracks = music_models.Track.objects.playable_by(actor, include)
         if include:
-            return self.filter(track__pk__in=tracks)
+            return self.filter(track__pk__in=tracks).distinct()
         else:
-            return self.exclude(track__pk__in=tracks)
+            return self.exclude(track__pk__in=tracks).distinct()
 
 
 class PlaylistTrack(models.Model):
-- 
GitLab