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