From f146c0ae9109233cb6f0c40975264afed2703599 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Fri, 14 Feb 2020 10:21:48 +0100
Subject: [PATCH] Include only local content in nodeinfo stats, added downloads
 count

---
 api/funkwhale_api/instance/nodeinfo.py   |  1 +
 api/funkwhale_api/instance/stats.py      | 11 ++++++++---
 api/tests/instance/test_nodeinfo.py      |  2 ++
 api/tests/instance/test_stats.py         |  7 ++++---
 changes/changelog.d/nodeinfo.enhancement |  1 +
 5 files changed, 16 insertions(+), 6 deletions(-)
 create mode 100644 changes/changelog.d/nodeinfo.enhancement

diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index 579b74fe4..6c86c9b2b 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -87,6 +87,7 @@ def get():
         data["metadata"]["usage"] = {
             "favorites": {"tracks": {"total": statistics["track_favorites"]}},
             "listenings": {"total": statistics["listenings"]},
+            "downloads": {"total": statistics["downloads"]},
         }
         if not auth_required:
             data["metadata"]["knownNodesListUrl"] = federation_utils.full_url(
diff --git a/api/funkwhale_api/instance/stats.py b/api/funkwhale_api/instance/stats.py
index 50f69da84..923a1dadb 100644
--- a/api/funkwhale_api/instance/stats.py
+++ b/api/funkwhale_api/instance/stats.py
@@ -17,6 +17,7 @@ def get():
         "artists": get_artists(),
         "track_favorites": get_track_favorites(),
         "listenings": get_listenings(),
+        "downloads": get_downloads(),
         "music_duration": get_music_duration(),
     }
 
@@ -43,15 +44,19 @@ def get_track_favorites():
 
 
 def get_tracks():
-    return models.Track.objects.count()
+    return models.Track.objects.local().count()
 
 
 def get_albums():
-    return models.Album.objects.count()
+    return models.Album.objects.local().count()
 
 
 def get_artists():
-    return models.Artist.objects.count()
+    return models.Artist.objects.local().count()
+
+
+def get_downloads():
+    return models.Track.objects.aggregate(d=Sum("downloads_count"))["d"] or 0
 
 
 def get_music_duration():
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index c124910e5..04bdfe6f5 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -27,6 +27,7 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
         "track_favorites": 5,
         "music_duration": 6,
         "listenings": 7,
+        "downloads": 42,
     }
     mocker.patch("funkwhale_api.instance.stats.get", return_value=stats)
 
@@ -61,6 +62,7 @@ def test_nodeinfo_dump(preferences, mocker, avatar):
             "usage": {
                 "favorites": {"tracks": {"total": stats["track_favorites"]}},
                 "listenings": {"total": stats["listenings"]},
+                "downloads": {"total": stats["downloads"]},
             },
             "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
             "allowList": {"enabled": False, "domains": None},
diff --git a/api/tests/instance/test_stats.py b/api/tests/instance/test_stats.py
index 255e60d13..5c45f8a75 100644
--- a/api/tests/instance/test_stats.py
+++ b/api/tests/instance/test_stats.py
@@ -34,17 +34,17 @@ def test_get_track_favorites(mocker):
 
 
 def test_get_tracks(mocker):
-    mocker.patch("funkwhale_api.music.models.Track.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.TrackQuerySet.count", return_value=42)
     assert stats.get_tracks() == 42
 
 
 def test_get_albums(mocker):
-    mocker.patch("funkwhale_api.music.models.Album.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.AlbumQuerySet.count", return_value=42)
     assert stats.get_albums() == 42
 
 
 def test_get_artists(mocker):
-    mocker.patch("funkwhale_api.music.models.Artist.objects.count", return_value=42)
+    mocker.patch("funkwhale_api.music.models.ArtistQuerySet.count", return_value=42)
     assert stats.get_artists() == 42
 
 
@@ -57,6 +57,7 @@ def test_get(mocker):
         "track_favorites",
         "listenings",
         "music_duration",
+        "downloads",
     ]
     [
         mocker.patch.object(stats, "get_{}".format(k), return_value=i)
diff --git a/changes/changelog.d/nodeinfo.enhancement b/changes/changelog.d/nodeinfo.enhancement
new file mode 100644
index 000000000..3b9daa487
--- /dev/null
+++ b/changes/changelog.d/nodeinfo.enhancement
@@ -0,0 +1 @@
+Include only local content in nodeinfo stats, added downloads count
-- 
GitLab