Refactor common functions for creating admin user list, peformance tweaks

This commit is contained in:
ErikKalkoken
2020-02-08 00:51:13 +01:00
parent c1388bf23f
commit 47babf2ed7
5 changed files with 179 additions and 340 deletions

View File

@@ -6,61 +6,13 @@ from django.utils.html import format_html
from allianceauth import hooks
from allianceauth.eveonline.models import EveCharacter
from allianceauth.authentication.admin import user_profile_pic, \
user_username, user_main_organization, MainCorporationsFilter,\
MainAllianceFilter
from .models import NameFormatConfig
class MainCorporationsFilter(admin.SimpleListFilter):
"""Custom filter to show corporations from service users only
To be used together with ServicesUserAdmin class
"""
title = 'corporation'
parameter_name = 'main_corporations'
def lookups(self, request, model_admin):
qs = EveCharacter.objects\
.exclude(userprofile=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
To be used together with ServicesUserAdmin class
"""
title = 'alliance'
parameter_name = 'main_alliances'
def lookups(self, request, model_admin):
qs = EveCharacter.objects\
.exclude(alliance_id=None)\
.exclude(userprofile=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 ServicesUserAdmin(admin.ModelAdmin):
"""Parent class for UserAdmin classes for all services"""
class Media:
@@ -75,9 +27,9 @@ class ServicesUserAdmin(admin.ModelAdmin):
ordering = ('user__username', )
list_select_related = True
list_display = (
'_profile_pic',
'_user',
'_main_organization',
user_profile_pic,
user_username,
user_main_organization,
'_date_joined'
)
list_filter = (
@@ -86,58 +38,6 @@ class ServicesUserAdmin(admin.ModelAdmin):
'user__date_joined'
)
def _profile_pic(self, obj):
if obj.user.profile.main_character:
return format_html(
'<img src="{}" class="img-circle">',
obj.user.profile.main_character.portrait_url(size=32)
)
else:
return ''
_profile_pic.short_description = ''
def _user(self, obj):
link = reverse(
'admin:{}_{}_change'.format(
obj._meta.app_label,
type(obj).__name__.lower()
),
args=(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 _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
):
alliance = obj.user.profile.main_character.alliance_name
else:
alliance = ''
return format_html('{}<br>{}',
corporation,
alliance
)
_main_organization.short_description = 'Corporation / Alliance (Main)'
_main_organization.admin_order_field = \
'profile__main_character__corporation_name'
def _date_joined(self, obj):
return obj.user.date_joined

View File

@@ -3,4 +3,4 @@ CSS for allianceauth admin site
*/
.img-circle { border-radius: 50%; }
.column-_profile_pic { width: 50px; }
.column-user_profile_pic { width: 50px; }