Improve user and group admin lists

This commit is contained in:
ErikKalkoken 2020-02-05 23:20:44 +01:00
parent 2b8bfbe544
commit f902f59b31
2 changed files with 161 additions and 35 deletions

View File

@ -1,15 +1,28 @@
from django.conf import settings
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User as BaseUser, Permission as BasePermission
from django.utils.text import slugify
from django.contrib.auth.models import User as BaseUser, \
Permission as BasePermission
from django.db.models import Q
from allianceauth.services.hooks import ServicesHook
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete, m2m_changed
from django.db.models.signals import pre_save, post_save, pre_delete, \
post_delete, m2m_changed
from django.dispatch import receiver
from allianceauth.authentication.models import State, get_guest_state, CharacterOwnership, UserProfile, OwnershipRecord
from django.forms import ModelForm
from django.utils.safestring import mark_safe
from django.utils.text import slugify
from allianceauth.authentication.models import State, get_guest_state,\
CharacterOwnership, UserProfile, OwnershipRecord
from allianceauth.hooks import get_hooks
from allianceauth.eveonline.models import EveCharacter
from django.forms import ModelForm
if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS:
_has_auto_groups = True
from allianceauth.eveonline.autogroups.models import *
else:
_has_auto_groups = False
def make_service_hooks_update_groups_action(service):
@ -83,6 +96,25 @@ class UserProfileInline(admin.StackedInline):
return False
class MyGroupFilter(admin.SimpleListFilter):
title = 'group'
parameter_name = 'my_groups'
def lookups(self, request, model_admin):
qs = Group.objects.all().order_by('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 UserAdmin(BaseUserAdmin):
"""
Extending Django's UserAdmin model
@ -106,48 +138,139 @@ class UserAdmin(BaseUserAdmin):
action.short_description)
return actions
inlines = BaseUserAdmin.inlines + [UserProfileInline]
list_select_related = True
list_filter = BaseUserAdmin.list_filter + (
'profile__main_character__corporation_name',
'profile__main_character__alliance_name',
'profile__state',
'date_joined'
)
list_select_related = True
show_full_result_count = True
list_display = (
'username',
'get_main_character',
'get_main_corporation',
'get_main_alliance',
'get_state',
'_profile_pic',
'_username',
'_state',
'_groups',
'_main_organization',
'_characters',
'is_active',
'date_joined',
'is_active'
'_role'
)
list_display_links = None
list_filter = (
'profile__state',
MyGroupFilter,
'profile__main_character__corporation_name',
'profile__main_character__alliance_name',
'is_active',
'date_joined',
'is_staff',
'is_superuser'
)
search_fields = (
'username',
'character_ownerships__character__character_name',
'groups__name'
)
def get_main_character(self, obj):
return obj.profile.main_character
get_main_character.short_description = "Main Character"
def get_main_corporation(self, obj):
def _profile_pic(self, obj):
if obj.profile.main_character:
return obj.profile.main_character.corporation_name
return mark_safe(
'<img src="{}" style="border-radius: 50%;">'.format(
obj.profile.main_character.portrait_url(size=32)
))
else:
return None
get_main_corporation.short_description = "Main Corporation"
return ''
_profile_pic.short_description = ''
def get_main_alliance(self, obj):
def _username(self, obj):
#/admin/<app>/<model>/<pk>/change/
link = '/admin/authentication/{}/{}/change/'.format(
type(obj).__name__.lower(),
obj.pk
)
return mark_safe('<strong><a href="{}">{}</a></strong><br>{}'.format(
link,
obj.username,
obj.email
))
_username.short_description = 'user'
_username.admin_order_field = 'username'
def _main_organization(self, obj):
if obj.profile.main_character:
return obj.profile.main_character.alliance_name
corporation = obj.profile.main_character.corporation_name
else:
return None
get_main_alliance.short_description = "Main Alliance"
corporation = ''
if (obj.profile.main_character
and obj.profile.main_character.alliance_id
):
alliance = obj.profile.main_character.alliance_name
else:
alliance = ''
return mark_safe('{}<br>{}'.format(corporation, alliance))
def get_state(self, obj):
_main_organization.short_description = 'Corporation / Alliance (Main)'
_main_organization.admin_order_field = \
'profile__main_character__corporation_name'
def _characters(self, obj):
alts = [
x.character.character_name
for x in CharacterOwnership.objects\
.filter(user=obj)\
.order_by('character__character_name')
.exclude(character=obj.profile.main_character)
]
if obj.profile.main_character:
result = [
'<b>{}</b>'.format(obj.profile.main_character.character_name)
]
else:
result = []
return mark_safe(', '.join(result + alts))
_characters.short_description = 'characters'
def _state(self, obj):
return obj.profile.state
get_state.short_description = "State"
_state.short_description = 'state'
_state.admin_order_field = 'profile__state'
def _groups(self, obj):
if not _has_auto_groups:
my_groups = [x.name for x in obj.groups.order_by('name')]
else:
my_groups = [
x.name for x in obj.groups\
.filter(managedalliancegroup=None)\
.filter(managedcorpgroup=None)\
.order_by('name')
]
return ', '.join(my_groups)
_groups.short_description = 'groups'
def _role(self, obj):
if obj.is_superuser:
role = 'Superuser'
elif obj.is_staff:
role = 'Staff'
else:
role = 'User'
return role
_role.short_description = 'role'
def has_change_permission(self, request, obj=None):
return request.user.has_perm('auth.change_user')

View File

@ -102,9 +102,12 @@ class GroupAdmin(admin.ModelAdmin):
def _attributes(self, obj):
attributes = list()
if _has_auto_groups and (obj.managedalliancegroup_set.exists()
if (_has_auto_groups
and (
obj.managedalliancegroup_set.exists()
or obj.managedcorpgroup_set.exists()
):
)
):
attributes.append('Auto Group')
elif obj.authgroup.internal:
attributes.append('Internal')