From b3b2594a13dbdcaccd523ccb6e08dc75fcb355cc Mon Sep 17 00:00:00 2001
From: Ernesto Rico Schmidt <ernesto@helsinki.at>
Date: Tue, 11 Oct 2022 18:06:57 -0400
Subject: [PATCH] Integrate Profile admin

---
 program/admin.py | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

diff --git a/program/admin.py b/program/admin.py
index c83b90c8..7e0505b0 100644
--- a/program/admin.py
+++ b/program/admin.py
@@ -1,4 +1,6 @@
 from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.auth.models import User
 from program.models import (
     Category,
     FundingCategory,
@@ -8,6 +10,7 @@ from program.models import (
     MusicFocus,
     Topic,
     Type,
+    UserProfile,
 )
 
 
@@ -23,6 +26,49 @@ class AdminWithNameType(admin.ModelAdmin):
     list_display = ("name", "type")
 
 
+class UserProfileInline(admin.StackedInline):
+    model = UserProfile
+    fields = ("cba_username", "cba_user_token")
+    can_delete = False
+    verbose_name_plural = "Profile"
+    fk_name = "user"
+
+
+class UserProfileUserAdmin(UserAdmin):
+    inlines = (UserProfileInline,)
+
+    def get_queryset(self, request):
+        """Let common users only edit their own profile"""
+        if not request.user.is_superuser:
+            return super(UserAdmin, self).get_queryset(request).filter(pk=request.user.id)
+
+        return super(UserAdmin, self).get_queryset(request)
+
+    def get_readonly_fields(self, request, obj=None):
+        """Limit field access for common users"""
+        if not request.user.is_superuser:
+            return (
+                "username",
+                "is_staff",
+                "is_superuser",
+                "is_active",
+                "date_joined",
+                "last_login",
+                "groups",
+                "user_permissions",
+            )
+        return list()
+
+    def get_inline_instances(self, request, obj=None):
+        """Append profile fields to UserAdmin"""
+        if not obj:
+            return list()
+
+        return super(UserProfileUserAdmin, self).get_inline_instances(request, obj)
+
+
+admin.site.unregister(User)
+admin.site.register(User, UserProfileUserAdmin)
 admin.site.register(Category, AdminWithNameSlugIsActive)
 admin.site.register(FundingCategory, AdminWithNameSlugIsActive)
 admin.site.register(Language, LanguageAdmin)
-- 
GitLab