From 3895034089bc9e4aa8eda2b78c9bd2e7de517bed Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Mon, 1 Oct 2018 21:56:52 +0200
Subject: [PATCH] Ensure we always use raw_ids for related fields in django's
 admin

---
 api/config/urls.py                    |  2 +-
 api/funkwhale_api/common/admin.py     | 19 +++++++++++++++++++
 api/funkwhale_api/favorites/admin.py  |  2 +-
 api/funkwhale_api/federation/admin.py |  2 +-
 api/funkwhale_api/history/admin.py    |  2 +-
 api/funkwhale_api/music/admin.py      |  2 +-
 api/funkwhale_api/playlists/admin.py  |  2 +-
 api/funkwhale_api/radios/admin.py     |  2 +-
 api/funkwhale_api/users/admin.py      |  2 +-
 9 files changed, 27 insertions(+), 8 deletions(-)
 create mode 100644 api/funkwhale_api/common/admin.py

diff --git a/api/config/urls.py b/api/config/urls.py
index ba3b630d99..99fc32f1fc 100644
--- a/api/config/urls.py
+++ b/api/config/urls.py
@@ -5,7 +5,7 @@ from django.conf import settings
 from django.conf.urls import url
 from django.urls import include, path
 from django.conf.urls.static import static
-from django.contrib import admin
+from funkwhale_api.common import admin
 from django.views import defaults as default_views
 
 
diff --git a/api/funkwhale_api/common/admin.py b/api/funkwhale_api/common/admin.py
new file mode 100644
index 0000000000..4124a69b89
--- /dev/null
+++ b/api/funkwhale_api/common/admin.py
@@ -0,0 +1,19 @@
+from django.contrib.admin import register as initial_register, site, ModelAdmin  # noqa
+from django.db.models.fields.related import RelatedField
+
+
+def register(model):
+    """
+    To make the admin more performant, we ensure all the the relations
+    are listed under raw_id_fields
+    """
+
+    def decorator(modeladmin):
+        raw_id_fields = []
+        for field in model._meta.fields:
+            if isinstance(field, RelatedField):
+                raw_id_fields.append(field.name)
+        setattr(modeladmin, "raw_id_fields", raw_id_fields)
+        return initial_register(model)(modeladmin)
+
+    return decorator
diff --git a/api/funkwhale_api/favorites/admin.py b/api/funkwhale_api/favorites/admin.py
index f56980e8cc..05530b0c67 100644
--- a/api/funkwhale_api/favorites/admin.py
+++ b/api/funkwhale_api/favorites/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 
diff --git a/api/funkwhale_api/federation/admin.py b/api/funkwhale_api/federation/admin.py
index 7be8ac89cc..98bc65247c 100644
--- a/api/funkwhale_api/federation/admin.py
+++ b/api/funkwhale_api/federation/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 from . import tasks
diff --git a/api/funkwhale_api/history/admin.py b/api/funkwhale_api/history/admin.py
index cbc7f89dd4..6aac94d0a4 100644
--- a/api/funkwhale_api/history/admin.py
+++ b/api/funkwhale_api/history/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 
diff --git a/api/funkwhale_api/music/admin.py b/api/funkwhale_api/music/admin.py
index 0cb4641808..8f9768857b 100644
--- a/api/funkwhale_api/music/admin.py
+++ b/api/funkwhale_api/music/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 
diff --git a/api/funkwhale_api/playlists/admin.py b/api/funkwhale_api/playlists/admin.py
index 98ced232ee..0565352707 100644
--- a/api/funkwhale_api/playlists/admin.py
+++ b/api/funkwhale_api/playlists/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 
diff --git a/api/funkwhale_api/radios/admin.py b/api/funkwhale_api/radios/admin.py
index 187950aeb2..0cfd5d9250 100644
--- a/api/funkwhale_api/radios/admin.py
+++ b/api/funkwhale_api/radios/admin.py
@@ -1,4 +1,4 @@
-from django.contrib import admin
+from funkwhale_api.common import admin
 
 from . import models
 
diff --git a/api/funkwhale_api/users/admin.py b/api/funkwhale_api/users/admin.py
index 365db615ef..f7ee90c7e5 100644
--- a/api/funkwhale_api/users/admin.py
+++ b/api/funkwhale_api/users/admin.py
@@ -2,7 +2,7 @@
 from __future__ import absolute_import, unicode_literals
 
 from django import forms
-from django.contrib import admin
+from funkwhale_api.common import admin
 from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
 from django.contrib.auth.forms import UserChangeForm, UserCreationForm
 from django.utils.translation import ugettext_lazy as _
-- 
GitLab