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 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 import hooks
from allianceauth.eveonline.models import EveCharacter
from .models import NameFormatConfig 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): class NameFormatConfigForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(NameFormatConfigForm, self).__init__(*args, **kwargs) super(NameFormatConfigForm, self).__init__(*args, **kwargs)

View File

@ -1,114 +1,14 @@
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 .models import DiscordUser from .models import DiscordUser
from ...admin import ServicesUserAdmin
class MainCorporationsFilter(admin.SimpleListFilter): class DiscordUserAdmin(ServicesUserAdmin):
"""Custom filter to show corporations from service users only""" list_display = ServicesUserAdmin.list_display + (
title = 'corporation' '_uid',
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'
def _uid(self, obj): def _uid(self, obj):
return obj.uid return obj.uid
@ -116,32 +16,4 @@ class DiscordUserAdmin(admin.ModelAdmin):
_uid.admin_order_field = '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
):
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) admin.site.register(DiscordUser, DiscordUserAdmin)

View File

@ -1,114 +1,20 @@
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
from ...admin import ServicesUserAdmin
class MainCorporationsFilter(admin.SimpleListFilter): class MumbleUserAdmin(ServicesUserAdmin):
"""Custom filter to show corporations from service users only""" list_display = ServicesUserAdmin.list_display + (
title = 'corporation' 'username',
parameter_name = 'main_corporations' 'groups',
)
def lookups(self, request, model_admin): search_fields = ServicesUserAdmin.search_fields + (
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', 'username',
'groups' '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
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,112 +1,15 @@
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 AuthTS, Teamspeak3User, StateGroup from .models import AuthTS, Teamspeak3User, StateGroup
from ...admin import ServicesUserAdmin
class MainCorporationsFilter(admin.SimpleListFilter): class Teamspeak3UserAdmin(ServicesUserAdmin):
"""Custom filter to show corporations from service users only""" list_display = ServicesUserAdmin.list_display + (
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',
'uid', '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): class AuthTSgroupAdmin(admin.ModelAdmin):
ordering = ('auth_group__name', ) ordering = ('auth_group__name', )