Move common service user list features into central admin class

This commit is contained in:
ErikKalkoken 2020-02-07 20:37:06 +01:00
parent 0caac20d77
commit 3f4dfe9b0b
5 changed files with 156 additions and 337 deletions

View File

@ -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(
'<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 = '/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 _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
_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)

View File

@ -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(
'<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 = '/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'
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('{}<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
_date_joined.short_description = 'date joined'
_date_joined.admin_order_field = 'user__date_joined'
admin.site.register(DiscordUser, DiscordUserAdmin)

View File

@ -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)

View File

@ -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', )