Further improvements to admin site

This commit is contained in:
ErikKalkoken 2020-02-06 22:47:02 +01:00
parent 2d24d064d5
commit ab061ba7a6
5 changed files with 207 additions and 48 deletions

View File

@ -8,6 +8,7 @@ from django.db.models import Q, F
from allianceauth.services.hooks import ServicesHook from allianceauth.services.hooks import ServicesHook
from django.db.models.signals import pre_save, post_save, pre_delete, \ from django.db.models.signals import pre_save, post_save, pre_delete, \
post_delete, m2m_changed post_delete, m2m_changed
from django.db.models.functions import Lower
from django.dispatch import receiver from django.dispatch import receiver
from django.forms import ModelForm from django.forms import ModelForm
from django.utils.html import format_html from django.utils.html import format_html
@ -102,7 +103,7 @@ class RealGroupsFilter(admin.SimpleListFilter):
parameter_name = 'real_groups' parameter_name = 'real_groups'
def lookups(self, request, model_admin): 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: if _has_auto_groups:
qs = qs\ qs = qs\
.filter(managedalliancegroup__exact=None)\ .filter(managedalliancegroup__exact=None)\
@ -125,10 +126,11 @@ class MainCorporationsFilter(admin.SimpleListFilter):
qs = EveCharacter.objects\ qs = EveCharacter.objects\
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.values('corporation_id', 'corporation_name')\ .values('corporation_id', 'corporation_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('corporation_name'))
(x['corporation_id'], x['corporation_name']) for x in qs return tuple(
]) [(x['corporation_id'], x['corporation_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None:
@ -148,10 +150,11 @@ class MainAllianceFilter(admin.SimpleListFilter):
.exclude(alliance_id=None)\ .exclude(alliance_id=None)\
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.values('alliance_id', 'alliance_name')\ .values('alliance_id', 'alliance_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('alliance_name'))
(x['alliance_id'], x['alliance_name']) for x in qs return tuple(
]) [(x['alliance_id'], x['alliance_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None:
@ -234,8 +237,8 @@ class UserAdmin(BaseUserAdmin):
def _user(self, obj): def _user(self, obj):
#/admin/<app>/<model>/<pk>/change/ link = '/admin/{}/{}/{}/change/'.format(
link = '/admin/authentication/{}/{}/change/'.format( __package__.rsplit('.', 1)[-1],
type(obj).__name__.lower(), type(obj).__name__.lower(),
obj.pk obj.pk
) )

View File

@ -1,4 +1,7 @@
from django.contrib import admin 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 allianceauth.eveonline.models import EveCharacter
from .models import DiscordUser from .models import DiscordUser
@ -14,10 +17,11 @@ class MainCorporationsFilter(admin.SimpleListFilter):
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.exclude(userprofile__user__discord=None)\ .exclude(userprofile__user__discord=None)\
.values('corporation_id', 'corporation_name')\ .values('corporation_id', 'corporation_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('corporation_name'))
(x['corporation_id'], x['corporation_name']) for x in qs return tuple(
]) [(x['corporation_id'], x['corporation_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None:
@ -38,10 +42,11 @@ class MainAllianceFilter(admin.SimpleListFilter):
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.exclude(userprofile__user__discord=None)\ .exclude(userprofile__user__discord=None)\
.values('alliance_id', 'alliance_name')\ .values('alliance_id', 'alliance_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('alliance_name'))
(x['alliance_id'], x['alliance_name']) for x in qs return tuple(
]) [(x['alliance_id'], x['alliance_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None:
@ -52,14 +57,19 @@ class MainAllianceFilter(admin.SimpleListFilter):
class DiscordUserAdmin(admin.ModelAdmin): class DiscordUserAdmin(admin.ModelAdmin):
class Media:
css = {
"all": ("services/discord/admin.css",)
}
ordering = ('user__username', ) ordering = ('user__username', )
list_select_related = True list_select_related = True
list_display = ( list_display = (
'user', '_profile_pic',
'uid', '_user',
'_corporation', '_uid',
'_alliance', '_main_organization',
'_date_joined' '_date_joined'
) )
search_fields = ( search_fields = (
@ -72,28 +82,61 @@ class DiscordUserAdmin(admin.ModelAdmin):
'user__date_joined', 'user__date_joined',
) )
def _corporation(self, obj): def _profile_pic(self, obj):
if obj.user.profile.main_character: if obj.user.profile.main_character:
return obj.user.profile.main_character.corporation_name return format_html(
'<img src="{}" class="img-circle">',
obj.user.profile.main_character.portrait_url(size=32)
)
else: else:
return '' return ''
_profile_pic.short_description = ''
_corporation.short_description = 'corporation (main)'
_corporation.admin_order_field \
= 'user__profile__main_character__corporation_name'
def _alliance(self, obj): def _user(self, obj):
link = '/admin/{}/{}/{}/change/'.format(
__package__.rsplit('.', 1)[-1],
type(obj).__name__.lower(),
obj.pk
)
return format_html(
'<strong><a href="{}">{}</a></strong><br>{}',
link,
obj.user.username,
obj.user.profile.main_character.character_name \
if obj.user.profile.main_character else ''
)
_user.short_description = 'user / main'
_user.admin_order_field = 'user__username'
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 if (obj.user.profile.main_character
and obj.user.profile.main_character.alliance_id 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: else:
return '' alliance = ''
return format_html('{}<br>{}',
corporation,
alliance
)
_alliance.short_description = 'alliance (main)' _main_organization.short_description = 'Corporation / Alliance (Main)'
_alliance.admin_order_field \ _main_organization.admin_order_field = \
= 'user__profile__main_character__alliance_name' 'profile__main_character__corporation_name'
def _date_joined(self, obj): def _date_joined(self, obj):

View File

@ -0,0 +1,6 @@
/*
CSS for allianceauth services admin site
*/
.img-circle { border-radius: 50%; }
.column-_profile_pic { width: 50px; }

View File

@ -1,10 +1,114 @@
from django.contrib import admin from django.contrib import admin
from django.db.models.functions import Lower
from allianceauth.eveonline.models import EveCharacter
from .models import MumbleUser from .models import MumbleUser
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): 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 fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel
list_display = ('user', 'username', 'groups')
search_fields = ('user__username', 'username', 'groups') 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) admin.site.register(MumbleUser, MumbleUserAdmin)

View File

@ -1,4 +1,5 @@
from django.contrib import admin from django.contrib import admin
from django.db.models.functions import Lower
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter
from .models import AuthTS, Teamspeak3User, StateGroup from .models import AuthTS, Teamspeak3User, StateGroup
@ -14,10 +15,11 @@ class MainCorporationsFilter(admin.SimpleListFilter):
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.exclude(userprofile__user__teamspeak3=None)\ .exclude(userprofile__user__teamspeak3=None)\
.values('corporation_id', 'corporation_name')\ .values('corporation_id', 'corporation_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('corporation_name'))
(x['corporation_id'], x['corporation_name']) for x in qs return tuple(
]) [(x['corporation_id'], x['corporation_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None:
@ -38,10 +40,11 @@ class MainAllianceFilter(admin.SimpleListFilter):
.exclude(userprofile=None)\ .exclude(userprofile=None)\
.exclude(userprofile__user__teamspeak3=None)\ .exclude(userprofile__user__teamspeak3=None)\
.values('alliance_id', 'alliance_name')\ .values('alliance_id', 'alliance_name')\
.distinct() .distinct()\
return tuple([ .order_by(Lower('alliance_name'))
(x['alliance_id'], x['alliance_name']) for x in qs return tuple(
]) [(x['alliance_id'], x['alliance_name']) for x in qs]
)
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() is None: if self.value() is None: