From ab061ba7a63e571b372a53f1f9a63f03a0b7369e Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Thu, 6 Feb 2020 22:47:02 +0100 Subject: [PATCH] Further improvements to admin site --- allianceauth/authentication/admin.py | 27 +++-- .../services/modules/discord/admin.py | 91 ++++++++++---- .../discord/static/services/discord/admin.css | 6 + allianceauth/services/modules/mumble/admin.py | 112 +++++++++++++++++- .../services/modules/teamspeak3/admin.py | 19 +-- 5 files changed, 207 insertions(+), 48 deletions(-) create mode 100644 allianceauth/services/modules/discord/static/services/discord/admin.css diff --git a/allianceauth/authentication/admin.py b/allianceauth/authentication/admin.py index 874858b0..df8c71be 100644 --- a/allianceauth/authentication/admin.py +++ b/allianceauth/authentication/admin.py @@ -8,6 +8,7 @@ from django.db.models import Q, F from allianceauth.services.hooks import ServicesHook from django.db.models.signals import pre_save, post_save, pre_delete, \ post_delete, m2m_changed +from django.db.models.functions import Lower from django.dispatch import receiver from django.forms import ModelForm from django.utils.html import format_html @@ -102,11 +103,11 @@ class RealGroupsFilter(admin.SimpleListFilter): parameter_name = 'real_groups' def lookups(self, request, model_admin): - qs = Group.objects.all().order_by('name') + qs = Group.objects.all().order_by(Lower('name')) if _has_auto_groups: qs = qs\ .filter(managedalliancegroup__exact=None)\ - .filter(managedcorpgroup__exact=None) + .filter(managedcorpgroup__exact=None) return tuple([(x.pk, x.name) for x in qs]) def queryset(self, request, queryset): @@ -125,10 +126,11 @@ class MainCorporationsFilter(admin.SimpleListFilter): qs = EveCharacter.objects\ .exclude(userprofile=None)\ .values('corporation_id', 'corporation_name')\ - .distinct() - return tuple([ - (x['corporation_id'], x['corporation_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('corporation_name')) + return tuple( + [(x['corporation_id'], x['corporation_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: @@ -148,10 +150,11 @@ class MainAllianceFilter(admin.SimpleListFilter): .exclude(alliance_id=None)\ .exclude(userprofile=None)\ .values('alliance_id', 'alliance_name')\ - .distinct() - return tuple([ - (x['alliance_id'], x['alliance_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('alliance_name')) + return tuple( + [(x['alliance_id'], x['alliance_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: @@ -234,8 +237,8 @@ class UserAdmin(BaseUserAdmin): def _user(self, obj): - #/admin////change/ - link = '/admin/authentication/{}/{}/change/'.format( + link = '/admin/{}/{}/{}/change/'.format( + __package__.rsplit('.', 1)[-1], type(obj).__name__.lower(), obj.pk ) diff --git a/allianceauth/services/modules/discord/admin.py b/allianceauth/services/modules/discord/admin.py index d7ca52a6..778e4d5d 100644 --- a/allianceauth/services/modules/discord/admin.py +++ b/allianceauth/services/modules/discord/admin.py @@ -1,4 +1,7 @@ from django.contrib import admin +from django.db.models.functions import Lower +from django.utils.html import format_html + from allianceauth.eveonline.models import EveCharacter from .models import DiscordUser @@ -14,10 +17,11 @@ class MainCorporationsFilter(admin.SimpleListFilter): .exclude(userprofile=None)\ .exclude(userprofile__user__discord=None)\ .values('corporation_id', 'corporation_name')\ - .distinct() - return tuple([ - (x['corporation_id'], x['corporation_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('corporation_name')) + return tuple( + [(x['corporation_id'], x['corporation_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: @@ -38,10 +42,11 @@ class MainAllianceFilter(admin.SimpleListFilter): .exclude(userprofile=None)\ .exclude(userprofile__user__discord=None)\ .values('alliance_id', 'alliance_name')\ - .distinct() - return tuple([ - (x['alliance_id'], x['alliance_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('alliance_name')) + return tuple( + [(x['alliance_id'], x['alliance_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: @@ -52,14 +57,19 @@ class MainAllianceFilter(admin.SimpleListFilter): class DiscordUserAdmin(admin.ModelAdmin): + class Media: + css = { + "all": ("services/discord/admin.css",) + } + ordering = ('user__username', ) list_select_related = True list_display = ( - 'user', - 'uid', - '_corporation', - '_alliance', + '_profile_pic', + '_user', + '_uid', + '_main_organization', '_date_joined' ) search_fields = ( @@ -72,28 +82,61 @@ class DiscordUserAdmin(admin.ModelAdmin): 'user__date_joined', ) - def _corporation(self, obj): + def _profile_pic(self, obj): if obj.user.profile.main_character: - return obj.user.profile.main_character.corporation_name + return format_html( + '', + obj.user.profile.main_character.portrait_url(size=32) + ) else: return '' + _profile_pic.short_description = '' + + + def _user(self, obj): + link = '/admin/{}/{}/{}/change/'.format( + __package__.rsplit('.', 1)[-1], + type(obj).__name__.lower(), + obj.pk + ) + return format_html( + '{}
{}', + link, + obj.user.username, + obj.user.profile.main_character.character_name \ + if obj.user.profile.main_character else '' + ) - _corporation.short_description = 'corporation (main)' - _corporation.admin_order_field \ - = 'user__profile__main_character__corporation_name' + _user.short_description = 'user / main' + _user.admin_order_field = 'user__username' - def _alliance(self, obj): + def _uid(self, obj): + return obj.uid + + _uid.short_description = 'Discord ID (UID)' + _uid.admin_order_field = 'uid' + + + def _main_organization(self, obj): + if obj.user.profile.main_character: + corporation = obj.user.profile.main_character.corporation_name + else: + corporation = '' if (obj.user.profile.main_character and obj.user.profile.main_character.alliance_id ): - return obj.user.profile.main_character.alliance_name + alliance = obj.user.profile.main_character.alliance_name else: - return '' - - _alliance.short_description = 'alliance (main)' - _alliance.admin_order_field \ - = 'user__profile__main_character__alliance_name' + alliance = '' + return format_html('{}
{}', + corporation, + alliance + ) + + _main_organization.short_description = 'Corporation / Alliance (Main)' + _main_organization.admin_order_field = \ + 'profile__main_character__corporation_name' def _date_joined(self, obj): diff --git a/allianceauth/services/modules/discord/static/services/discord/admin.css b/allianceauth/services/modules/discord/static/services/discord/admin.css new file mode 100644 index 00000000..55a52f35 --- /dev/null +++ b/allianceauth/services/modules/discord/static/services/discord/admin.css @@ -0,0 +1,6 @@ +/* +CSS for allianceauth services admin site +*/ + +.img-circle { border-radius: 50%; } +.column-_profile_pic { width: 50px; } \ No newline at end of file diff --git a/allianceauth/services/modules/mumble/admin.py b/allianceauth/services/modules/mumble/admin.py index 387f7549..11b6d177 100644 --- a/allianceauth/services/modules/mumble/admin.py +++ b/allianceauth/services/modules/mumble/admin.py @@ -1,10 +1,114 @@ from django.contrib import admin +from django.db.models.functions import Lower +from allianceauth.eveonline.models import EveCharacter + from .models import MumbleUser -class MumbleUserAdmin(admin.ModelAdmin): - fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel - list_display = ('user', 'username', 'groups') - search_fields = ('user__username', 'username', 'groups') +class MainCorporationsFilter(admin.SimpleListFilter): + """Custom filter to show corporations from service users only""" + title = 'corporation' + parameter_name = 'main_corporations' + + def lookups(self, request, model_admin): + qs = EveCharacter.objects\ + .exclude(userprofile=None)\ + .exclude(userprofile__user__mumble=None)\ + .values('corporation_id', 'corporation_name')\ + .distinct()\ + .order_by(Lower('corporation_name')) + return tuple( + [(x['corporation_id'], x['corporation_name']) for x in qs] + ) + + def queryset(self, request, queryset): + if self.value() is None: + return queryset.all() + else: + return queryset\ + .filter(user__profile__main_character__corporation_id=self.value()) + + +class MainAllianceFilter(admin.SimpleListFilter): + """Custom filter to show alliances from service users only""" + title = 'alliance' + parameter_name = 'main_alliances' + + def lookups(self, request, model_admin): + qs = EveCharacter.objects\ + .exclude(alliance_id=None)\ + .exclude(userprofile=None)\ + .exclude(userprofile__user__mumble=None)\ + .values('alliance_id', 'alliance_name')\ + .distinct()\ + .order_by(Lower('alliance_name')) + return tuple( + [(x['alliance_id'], x['alliance_name']) for x in qs] + ) + + def queryset(self, request, queryset): + if self.value() is None: + return queryset.all() + else: + return queryset\ + .filter(user__profile__main_character__alliance_id=self.value()) + + +class MumbleUserAdmin(admin.ModelAdmin): + ordering = ('user__username', ) + list_select_related = True + + list_display = ( + 'user', + 'username', + 'groups', + '_corporation', + '_alliance', + '_date_joined' + ) + search_fields = ( + 'user__username', + 'username', + 'groups' + ) + + list_filter = ( + MainCorporationsFilter, + MainAllianceFilter, + 'user__date_joined', + ) + + fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel + + def _corporation(self, obj): + if obj.user.profile.main_character: + return obj.user.profile.main_character.corporation_name + else: + return '' + + _corporation.short_description = 'corporation (main)' + _corporation.admin_order_field \ + = 'user__profile__main_character__corporation_name' + + + def _alliance(self, obj): + if (obj.user.profile.main_character + and obj.user.profile.main_character.alliance_id + ): + return obj.user.profile.main_character.alliance_name + else: + return '' + + _alliance.short_description = 'alliance (main)' + _alliance.admin_order_field \ + = 'user__profile__main_character__alliance_name' + + + def _date_joined(self, obj): + return obj.user.date_joined + + _date_joined.short_description = 'date joined' + _date_joined.admin_order_field = 'user__date_joined' + admin.site.register(MumbleUser, MumbleUserAdmin) diff --git a/allianceauth/services/modules/teamspeak3/admin.py b/allianceauth/services/modules/teamspeak3/admin.py index 26dd1291..6fdacd67 100644 --- a/allianceauth/services/modules/teamspeak3/admin.py +++ b/allianceauth/services/modules/teamspeak3/admin.py @@ -1,4 +1,5 @@ from django.contrib import admin +from django.db.models.functions import Lower from allianceauth.eveonline.models import EveCharacter from .models import AuthTS, Teamspeak3User, StateGroup @@ -14,10 +15,11 @@ class MainCorporationsFilter(admin.SimpleListFilter): .exclude(userprofile=None)\ .exclude(userprofile__user__teamspeak3=None)\ .values('corporation_id', 'corporation_name')\ - .distinct() - return tuple([ - (x['corporation_id'], x['corporation_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('corporation_name')) + return tuple( + [(x['corporation_id'], x['corporation_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: @@ -38,10 +40,11 @@ class MainAllianceFilter(admin.SimpleListFilter): .exclude(userprofile=None)\ .exclude(userprofile__user__teamspeak3=None)\ .values('alliance_id', 'alliance_name')\ - .distinct() - return tuple([ - (x['alliance_id'], x['alliance_name']) for x in qs - ]) + .distinct()\ + .order_by(Lower('alliance_name')) + return tuple( + [(x['alliance_id'], x['alliance_name']) for x in qs] + ) def queryset(self, request, queryset): if self.value() is None: