Adopt all services user and auth user lists to new format

This commit is contained in:
ErikKalkoken 2020-02-07 23:01:13 +01:00
parent 3f4dfe9b0b
commit c1388bf23f
10 changed files with 289 additions and 151 deletions

View File

@ -12,6 +12,7 @@ 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
from django.urls import reverse
from django.utils.text import slugify from django.utils.text import slugify
from allianceauth.authentication.models import State, get_guest_state,\ from allianceauth.authentication.models import State, get_guest_state,\
@ -99,102 +100,6 @@ class UserProfileInline(admin.StackedInline):
return False return False
class RealGroupsFilter(admin.SimpleListFilter):
"""Custom filter to get groups w/o Autogroups"""
title = 'group'
parameter_name = 'real_groups'
def lookups(self, request, model_admin):
qs = Group.objects.all().order_by(Lower('name'))
if _has_auto_groups:
qs = qs\
.filter(managedalliancegroup__exact=None)\
.filter(managedcorpgroup__exact=None)
return tuple([(x.pk, x.name) for x in qs])
def queryset(self, request, queryset):
if self.value() is None:
return queryset.all()
else:
return queryset.filter(groups__pk=self.value())
class MainCorporationsFilter(admin.SimpleListFilter):
"""Custom filter to show corporations from mains 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(profile__main_character__corporation_id=self.value())
class MainAllianceFilter(admin.SimpleListFilter):
"""Custom filter to show alliances from mains 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(profile__main_character__alliance_id=self.value())
def update_main_character_model(modeladmin, request, queryset):
tasks_count = 0
for obj in queryset:
if obj.profile.main_character:
update_character.delay(obj.profile.main_character.character_id)
tasks_count += 1
modeladmin.message_user(
request,
'Update from ESI started for {} characters'.format(tasks_count)
)
update_main_character_model.short_description = \
'Update main character model from ESI'
def list_2_html_w_tooltips(my_items: list, max_items: int) -> str:
"""converts list of strings into HTML with cutoff and tooltip when > max"""
items_truncated_str = ', '.join(my_items[:max_items])
if len(my_items) <= max_items:
return items_truncated_str
else:
items_truncated_str += ' (...)'
items_all_str = ', '.join(my_items)
return format_html(
'<span data-tooltip="{}" class="tooltip">{}</span>',
items_all_str,
items_truncated_str
)
class UserAdmin(BaseUserAdmin): class UserAdmin(BaseUserAdmin):
""" """
Extending Django's UserAdmin model Extending Django's UserAdmin model
@ -204,14 +109,98 @@ class UserAdmin(BaseUserAdmin):
css = { css = {
"all": ("authentication/css/admin.css",) "all": ("authentication/css/admin.css",)
} }
class MainCorporationsFilter(admin.SimpleListFilter):
"""Custom filter to filter on corporations from mains 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(profile__main_character__corporation_id=self.value())
class MainAllianceFilter(admin.SimpleListFilter):
"""Custom filter to filter on alliances from mains 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(profile__main_character__alliance_id=self.value())
class RealGroupsFilter(admin.SimpleListFilter):
"""Custom filter to get groups w/o Autogroups"""
title = 'group'
parameter_name = 'real_groups'
def lookups(self, request, model_admin):
qs = Group.objects.all().order_by(Lower('name'))
if _has_auto_groups:
qs = qs\
.filter(managedalliancegroup__exact=None)\
.filter(managedcorpgroup__exact=None)
return tuple([(x.pk, x.name) for x in qs])
def queryset(self, request, queryset):
if self.value() is None:
return queryset.all()
else:
return queryset.filter(groups__pk=self.value())
def update_main_character_model(self, request, queryset):
tasks_count = 0
for obj in queryset:
if obj.profile.main_character:
update_character.delay(obj.profile.main_character.character_id)
tasks_count += 1
self.message_user(
request,
'Update from ESI started for {} characters'.format(tasks_count)
)
update_main_character_model.short_description = \
'Update main character model from ESI'
def get_actions(self, request): def get_actions(self, request):
actions = super(BaseUserAdmin, self).get_actions(request) actions = super(BaseUserAdmin, self).get_actions(request)
actions[update_main_character_model.__name__] = ( actions[self.update_main_character_model.__name__] = (
update_main_character_model, self.update_main_character_model,
update_main_character_model.__name__, self.update_main_character_model.__name__,
update_main_character_model.short_description self.update_main_character_model.short_description
) )
for hook in get_hooks('services_hook'): for hook in get_hooks('services_hook'):
@ -231,18 +220,33 @@ class UserAdmin(BaseUserAdmin):
return actions return actions
def _list_2_html_w_tooltips(self, my_items: list, max_items: int) -> str:
"""converts list of strings into HTML with cutoff and tooltip when > max"""
items_truncated_str = ', '.join(my_items[:max_items])
if len(my_items) <= max_items:
return items_truncated_str
else:
items_truncated_str += ' (...)'
items_all_str = ', '.join(my_items)
return format_html(
'<span data-tooltip="{}" class="tooltip">{}</span>',
items_all_str,
items_truncated_str
)
inlines = BaseUserAdmin.inlines + [UserProfileInline] inlines = BaseUserAdmin.inlines + [UserProfileInline]
ordering = ('username', ) ordering = ('username', )
list_select_related = True list_select_related = True
show_full_result_count = True show_full_result_count = True
list_display = ( list_display = (
'_profile_pic', '_profile_pic',
'_user', '_user',
'_state', '_state',
'_groups', '_groups',
'_main_organization', '_main_organization',
'_characters', '_characters',
'is_active', 'is_active',
'date_joined', 'date_joined',
@ -265,7 +269,9 @@ class UserAdmin(BaseUserAdmin):
'character_ownerships__character__character_name' 'character_ownerships__character__character_name'
) )
def _profile_pic(self, obj): def _profile_pic(self, obj):
"""profile pic column data for user objects"""
if obj.profile.main_character: if obj.profile.main_character:
return format_html( return format_html(
'<img src="{}" class="img-circle">', '<img src="{}" class="img-circle">',
@ -277,10 +283,13 @@ class UserAdmin(BaseUserAdmin):
def _user(self, obj): def _user(self, obj):
link = '/admin/{}/{}/{}/change/'.format( """user column data for user objects"""
__package__.rsplit('.', 1)[-1], link = reverse(
type(obj).__name__.lower(), 'admin:{}_{}_change'.format(
obj.pk obj._meta.app_label,
type(obj).__name__.lower()
),
args=(obj.pk,)
) )
return format_html( return format_html(
'<strong><a href="{}">{}</a></strong><br>{}', '<strong><a href="{}">{}</a></strong><br>{}',
@ -289,11 +298,13 @@ class UserAdmin(BaseUserAdmin):
obj.profile.main_character.character_name \ obj.profile.main_character.character_name \
if obj.profile.main_character else '' if obj.profile.main_character else ''
) )
_user.short_description = 'user / main' _user.short_description = 'user / main'
_user.admin_order_field = 'username' _user.admin_order_field = 'username'
def _main_organization(self, obj): def _main_organization(self, obj):
"""main organization column data for user objects"""
if obj.profile.main_character: if obj.profile.main_character:
corporation = obj.profile.main_character.corporation_name corporation = obj.profile.main_character.corporation_name
else: else:
@ -313,7 +324,6 @@ class UserAdmin(BaseUserAdmin):
_main_organization.admin_order_field = \ _main_organization.admin_order_field = \
'profile__main_character__corporation_name' 'profile__main_character__corporation_name'
def _characters(self, obj): def _characters(self, obj):
my_characters = [ my_characters = [
x.character.character_name x.character.character_name
@ -321,7 +331,7 @@ class UserAdmin(BaseUserAdmin):
.filter(user=obj)\ .filter(user=obj)\
.order_by('character__character_name') .order_by('character__character_name')
] ]
return list_2_html_w_tooltips( return self._list_2_html_w_tooltips(
my_characters, my_characters,
AUTHENTICATION_ADMIN_USERS_MAX_CHARS AUTHENTICATION_ADMIN_USERS_MAX_CHARS
) )
@ -347,7 +357,7 @@ class UserAdmin(BaseUserAdmin):
.order_by('name') .order_by('name')
] ]
return list_2_html_w_tooltips( return self._list_2_html_w_tooltips(
my_groups, my_groups,
AUTHENTICATION_ADMIN_USERS_MAX_GROUPS AUTHENTICATION_ADMIN_USERS_MAX_GROUPS
) )
@ -411,14 +421,138 @@ class StateAdmin(admin.ModelAdmin):
class BaseOwnershipAdmin(admin.ModelAdmin): class BaseOwnershipAdmin(admin.ModelAdmin):
list_display = ('user', 'character') class Media:
search_fields = ('user__user', 'character__character_name', 'character__corporation_name', 'character__alliance_name') css = {
"all": ("authentication/css/admin.css",)
}
class MainCorporationsFilter(admin.SimpleListFilter):
"""Custom filter to filter on corporations from mains 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 filter on alliances from mains 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()
)
list_select_related = True
list_display = (
'_profile_pic',
'_user',
'_main_organization',
'character',
)
search_fields = (
'user__user',
'character__character_name',
'character__corporation_name',
'character__alliance_name'
)
list_filter = (
MainCorporationsFilter,
MainAllianceFilter,
)
def get_readonly_fields(self, request, obj=None): def get_readonly_fields(self, request, obj=None):
if obj and obj.pk: if obj and obj.pk:
return 'owner_hash', 'character' return 'owner_hash', 'character'
return tuple() return tuple()
def _profile_pic(self, obj):
"""profile pic column data for user objects"""
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):
"""user column data for user objects"""
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):
"""main organization column data for user objects"""
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 = \
'user__profile__main_character__corporation_name'
@admin.register(OwnershipRecord) @admin.register(OwnershipRecord)
class OwnershipRecordAdmin(BaseOwnershipAdmin): class OwnershipRecordAdmin(BaseOwnershipAdmin):

View File

@ -1,6 +1,7 @@
from django import forms from django import forms
from django.contrib import admin from django.contrib import admin
from django.db.models.functions import Lower from django.db.models.functions import Lower
from django.urls import reverse
from django.utils.html import format_html from django.utils.html import format_html
from allianceauth import hooks from allianceauth import hooks
@ -97,10 +98,12 @@ class ServicesUserAdmin(admin.ModelAdmin):
def _user(self, obj): def _user(self, obj):
link = '/admin/{}/{}/{}/change/'.format( link = reverse(
__package__.rsplit('.', 1)[-1], 'admin:{}_{}_change'.format(
type(obj).__name__.lower(), obj._meta.app_label,
obj.pk type(obj).__name__.lower()
),
args=(obj.pk,)
) )
return format_html( return format_html(
'<strong><a href="{}">{}</a></strong><br>{}', '<strong><a href="{}">{}</a></strong><br>{}',

View File

@ -4,6 +4,7 @@ from .models import DiscordUser
from ...admin import ServicesUserAdmin from ...admin import ServicesUserAdmin
@admin.register(DiscordUser)
class DiscordUserAdmin(ServicesUserAdmin): class DiscordUserAdmin(ServicesUserAdmin):
list_display = ServicesUserAdmin.list_display + ( list_display = ServicesUserAdmin.list_display + (
'_uid', '_uid',
@ -15,5 +16,3 @@ class DiscordUserAdmin(ServicesUserAdmin):
_uid.short_description = 'Discord ID (UID)' _uid.short_description = 'Discord ID (UID)'
_uid.admin_order_field = 'uid' _uid.admin_order_field = 'uid'
admin.site.register(DiscordUser, DiscordUserAdmin)

View File

@ -1,9 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import DiscourseUser from .models import DiscourseUser
from ...admin import ServicesUserAdmin
class DiscourseUserAdmin(admin.ModelAdmin): @admin.register(DiscourseUser)
list_display = ('user',) class DiscourseUserAdmin(ServicesUserAdmin):
search_fields = ('user__username',) list_display = ServicesUserAdmin.list_display + (
'enabled',
admin.site.register(DiscourseUser, DiscourseUserAdmin) )

View File

@ -4,6 +4,7 @@ from .models import MumbleUser
from ...admin import ServicesUserAdmin from ...admin import ServicesUserAdmin
@admin.register(MumbleUser)
class MumbleUserAdmin(ServicesUserAdmin): class MumbleUserAdmin(ServicesUserAdmin):
list_display = ServicesUserAdmin.list_display + ( list_display = ServicesUserAdmin.list_display + (
'username', 'username',
@ -15,6 +16,3 @@ class MumbleUserAdmin(ServicesUserAdmin):
) )
fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel fields = ('user', 'username', 'groups') # pwhash is hidden from admin panel
admin.site.register(MumbleUser, MumbleUserAdmin)

View File

@ -1,9 +1,11 @@
from django.contrib import admin from django.contrib import admin
from .models import OpenfireUser from .models import OpenfireUser
from ...admin import ServicesUserAdmin
class OpenfireUserAdmin(admin.ModelAdmin): @admin.register(OpenfireUser)
list_display = ('user', 'username') class OpenfireUserAdmin(ServicesUserAdmin):
search_fields = ('user__username', 'username') list_display = ServicesUserAdmin.list_display + ('username',)
search_fields = ServicesUserAdmin.search_fields + ('username', )
admin.site.register(OpenfireUser, OpenfireUserAdmin)

View File

@ -1,9 +1,9 @@
from django.contrib import admin from django.contrib import admin
from .models import Phpbb3User from .models import Phpbb3User
from ...admin import ServicesUserAdmin
class Phpbb3UserAdmin(admin.ModelAdmin): @admin.register(Phpbb3User)
list_display = ('user', 'username') class Phpbb3UserAdmin(ServicesUserAdmin):
search_fields = ('user__username', 'username') list_display = ServicesUserAdmin.list_display + ('username',)
search_fields = ServicesUserAdmin.search_fields + ('username', )
admin.site.register(Phpbb3User, Phpbb3UserAdmin)

View File

@ -1,9 +1,10 @@
from django.contrib import admin from django.contrib import admin
from .models import SmfUser from .models import SmfUser
from ...admin import ServicesUserAdmin
class SmfUserAdmin(admin.ModelAdmin): @admin.register(SmfUser)
list_display = ('user', 'username') class SmfUserAdmin(ServicesUserAdmin):
search_fields = ('user__username', 'username') list_display = ServicesUserAdmin.list_display + ('username',)
search_fields = ServicesUserAdmin.search_fields + ('username', )
admin.site.register(SmfUser, SmfUserAdmin)

View File

@ -4,6 +4,7 @@ from .models import AuthTS, Teamspeak3User, StateGroup
from ...admin import ServicesUserAdmin from ...admin import ServicesUserAdmin
@admin.register(Teamspeak3User)
class Teamspeak3UserAdmin(ServicesUserAdmin): class Teamspeak3UserAdmin(ServicesUserAdmin):
list_display = ServicesUserAdmin.list_display + ( list_display = ServicesUserAdmin.list_display + (
'uid', 'uid',
@ -11,6 +12,7 @@ class Teamspeak3UserAdmin(ServicesUserAdmin):
) )
@admin.register(AuthTS)
class AuthTSgroupAdmin(admin.ModelAdmin): class AuthTSgroupAdmin(admin.ModelAdmin):
ordering = ('auth_group__name', ) ordering = ('auth_group__name', )
list_select_related = True list_select_related = True
@ -32,7 +34,3 @@ class AuthTSgroupAdmin(admin.ModelAdmin):
class StateGroupAdmin(admin.ModelAdmin): class StateGroupAdmin(admin.ModelAdmin):
list_display = ('state', 'ts_group') list_display = ('state', 'ts_group')
search_fields = ('state__name', 'ts_group__ts_group_name') search_fields = ('state__name', 'ts_group__ts_group_name')
admin.site.register(AuthTS, AuthTSgroupAdmin)
admin.site.register(Teamspeak3User, Teamspeak3UserAdmin)

View File

@ -1,9 +1,10 @@
from django.contrib import admin from django.contrib import admin
from .models import XenforoUser from .models import XenforoUser
from ...admin import ServicesUserAdmin
class XenforoUserAdmin(admin.ModelAdmin): @admin.register(XenforoUser)
list_display = ('user', 'username') class XenforoUserAdmin(ServicesUserAdmin):
search_fields = ('user__username', 'username') list_display = ServicesUserAdmin.list_display + ('username',)
search_fields = ServicesUserAdmin.search_fields + ('username', )
admin.site.register(XenforoUser, XenforoUserAdmin)