From 3f4dfe9b0b5d04b3d423f04bee052024acec8cdb Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Fri, 7 Feb 2020 20:37:06 +0100 Subject: [PATCH] Move common service user list features into central admin class --- allianceauth/services/admin.py | 140 +++++++++++++++++- .../services/modules/discord/admin.py | 140 +----------------- allianceauth/services/modules/mumble/admin.py | 108 +------------- .../services/modules/teamspeak3/admin.py | 105 +------------ .../discord => static/services}/admin.css | 0 5 files changed, 156 insertions(+), 337 deletions(-) rename allianceauth/services/{modules/discord/static/services/discord => static/services}/admin.css (100%) diff --git a/allianceauth/services/admin.py b/allianceauth/services/admin.py index d37a30fb..bffd5c98 100644 --- a/allianceauth/services/admin.py +++ b/allianceauth/services/admin.py @@ -1,9 +1,147 @@ -from django.contrib import admin from django import forms +from django.contrib import admin +from django.db.models.functions import Lower +from django.utils.html import format_html + from allianceauth import hooks +from allianceauth.eveonline.models import EveCharacter + 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: + css = { + "all": ("services/admin.css",) + } + + search_fields = ( + 'user__username', + 'uid' + ) + ordering = ('user__username', ) + list_select_related = True + list_display = ( + '_profile_pic', + '_user', + '_main_organization', + '_date_joined' + ) + list_filter = ( + MainCorporationsFilter, + MainAllianceFilter, + 'user__date_joined' + ) + + def _profile_pic(self, obj): + if obj.user.profile.main_character: + 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 '' + ) + + _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('{}
{}', + 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 + + _date_joined.short_description = 'date joined' + _date_joined.admin_order_field = 'user__date_joined' + + class NameFormatConfigForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(NameFormatConfigForm, self).__init__(*args, **kwargs) diff --git a/allianceauth/services/modules/discord/admin.py b/allianceauth/services/modules/discord/admin.py index 67122cb1..b30cc354 100644 --- a/allianceauth/services/modules/discord/admin.py +++ b/allianceauth/services/modules/discord/admin.py @@ -1,114 +1,14 @@ 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 +from ...admin import ServicesUserAdmin -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)\ - .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)\ - .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 DiscordUserAdmin(admin.ModelAdmin): - class Media: - css = { - "all": ("services/discord/admin.css",) - } - - ordering = ('user__username', ) - list_select_related = True - - list_display = ( - '_profile_pic', - '_user', - '_uid', - '_main_organization', - '_date_joined' - ) - search_fields = ( - 'user__username', - 'uid' - ) - list_filter = ( - MainCorporationsFilter, - MainAllianceFilter, - 'user__date_joined', - ) - - def _profile_pic(self, obj): - if obj.user.profile.main_character: - 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 '' - ) - - _user.short_description = 'user / main' - _user.admin_order_field = 'user__username' - - +class DiscordUserAdmin(ServicesUserAdmin): + list_display = ServicesUserAdmin.list_display + ( + '_uid', + ) + def _uid(self, obj): return obj.uid @@ -116,32 +16,4 @@ class DiscordUserAdmin(admin.ModelAdmin): _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 - ): - alliance = obj.user.profile.main_character.alliance_name - else: - 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): - return obj.user.date_joined - - _date_joined.short_description = 'date joined' - _date_joined.admin_order_field = 'user__date_joined' - - admin.site.register(DiscordUser, DiscordUserAdmin) diff --git a/allianceauth/services/modules/mumble/admin.py b/allianceauth/services/modules/mumble/admin.py index 11b6d177..a895f1bb 100644 --- a/allianceauth/services/modules/mumble/admin.py +++ b/allianceauth/services/modules/mumble/admin.py @@ -1,114 +1,20 @@ from django.contrib import admin -from django.db.models.functions import Lower -from allianceauth.eveonline.models import EveCharacter from .models import MumbleUser +from ...admin import ServicesUserAdmin -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', +class MumbleUserAdmin(ServicesUserAdmin): + list_display = ServicesUserAdmin.list_display + ( + 'username', + 'groups', + ) + search_fields = ServicesUserAdmin.search_fields + ( '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 6fdacd67..1c75e636 100644 --- a/allianceauth/services/modules/teamspeak3/admin.py +++ b/allianceauth/services/modules/teamspeak3/admin.py @@ -1,112 +1,15 @@ from django.contrib import admin -from django.db.models.functions import Lower -from allianceauth.eveonline.models import EveCharacter from .models import AuthTS, Teamspeak3User, StateGroup +from ...admin import ServicesUserAdmin -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__teamspeak3=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__teamspeak3=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 Teamspeak3UserAdmin(admin.ModelAdmin): - ordering = ('user__username', ) - list_select_related = True - - list_display = ( - 'user', - 'uid', - '_corporation', - '_alliance', - '_date_joined', - 'perm_key', - ) - search_fields = ( - 'user__username', +class Teamspeak3UserAdmin(ServicesUserAdmin): + list_display = ServicesUserAdmin.list_display + ( 'uid', - 'perm_key' + 'perm_key' ) - list_filter = ( - MainCorporationsFilter, - MainAllianceFilter, - 'user__date_joined', - ) - - 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' - class AuthTSgroupAdmin(admin.ModelAdmin): ordering = ('auth_group__name', ) diff --git a/allianceauth/services/modules/discord/static/services/discord/admin.css b/allianceauth/services/static/services/admin.css similarity index 100% rename from allianceauth/services/modules/discord/static/services/discord/admin.css rename to allianceauth/services/static/services/admin.css