From 84b1ddc5d9872c1c51f65d1ae4fd411798106008 Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 30 Jun 2017 17:57:29 -0400 Subject: [PATCH] Enhance admin site. Regroup auth models. --- authentication/admin.py | 114 ++++++++++-------- .../migrations/0015_user_profiles.py | 1 + authentication/models.py | 1 + fleetactivitytracking/views.py | 1 - groupmanagement/admin.py | 15 ++- 5 files changed, 81 insertions(+), 51 deletions(-) diff --git a/authentication/admin.py b/authentication/admin.py index 9017e7f5..c88f108b 100644 --- a/authentication/admin.py +++ b/authentication/admin.py @@ -2,9 +2,8 @@ from __future__ import unicode_literals from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Permission from django.utils.text import slugify -from django import forms from authentication.models import State, get_guest_state, CharacterOwnership, UserProfile from alliance_auth.hooks import get_hooks from services.hooks import ServicesHook @@ -63,79 +62,96 @@ class UserAdmin(BaseUserAdmin): action.short_description) return actions - -# Re-register UserAdmin -try: - admin.site.unregister(User) -finally: - admin.site.register(User, UserAdmin) - - -class StateForm(forms.ModelForm): - def _is_none_state(self): - instance = getattr(self, 'instance', None) - if instance and instance.pk: - return instance == get_guest_state() - - def __init__(self, *args, **kwargs): - super(StateForm, self).__init__(*args, **kwargs) - if self._is_none_state(): - self.fields['name'].widget.attrs['readonly'] = True - - def clean_name(self): - if self._is_none_state(): - return self.instance.name - return self.cleaned_data['name'] + list_filter = BaseUserAdmin.list_filter + ('profile__state',) @admin.register(State) class StateAdmin(admin.ModelAdmin): - form = StateForm - fieldsets = ( (None, { 'fields': ('name', 'permissions', 'priority'), }), ('Membership', { - 'classes': ('collapse',), 'fields': ('public', 'member_characters', 'member_corporations', 'member_alliances'), }) ) - filter_horizontal = ['member_characters', 'member_corporations', 'member_alliances', 'permissions'] + list_display = ('name', 'priority', 'user_count') def has_delete_permission(self, request, obj=None): if obj == get_guest_state(): return False + return super(StateAdmin, self).has_delete_permission(request, obj=obj) + def get_fieldsets(self, request, obj=None): + if obj == get_guest_state(): + return ( + (None, { + 'fields': ('permissions', 'priority'), + }), + ) + return super(StateAdmin, self).get_fieldsets(request, obj=obj) -admin.site.register(CharacterOwnership) - - -class UserProfileAdminForm(forms.ModelForm): - def __init__(self, *args, **kwargs): - super(UserProfileAdminForm, self).__init__(*args, **kwargs) - self.fields['state'].widget.attrs['disabled'] = True - instance = getattr(self, 'instance', None) - if instance and instance.pk: - self.fields['state'].queryset = State.objects.filter(pk=instance.state.pk) - else: - self.fields['state'].queryset = State.objects.filter(pk=get_guest_state().pk) - - def clean_state(self): - instance = getattr(self, 'instance', None) - if instance and instance.pk: - return UserProfile.objects.get(pk=instance.pk).state - else: - return get_guest_state() + @staticmethod + def user_count(obj): + return obj.userprofile_set.all().count() @admin.register(UserProfile) class UserProfileAdmin(admin.ModelAdmin): - form = UserProfileAdminForm + readonly_fields = ('user', 'state') + search_fields = ('user__username', 'main_character__character_name') + list_filter = ('state',) + list_display = ('user', 'main_character') + actions = None def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False + + +@admin.register(CharacterOwnership) +class CharacterOwnershipAdmin(admin.ModelAdmin): + list_display = ('user', 'character') + search_fields = ('user__username', 'character__character_name', 'character__corporation_name', 'character__alliance_name') + readonly_fields = ('owner_hash', 'character') + + +class PermissionAdmin(admin.ModelAdmin): + actions = None + readonly_fields = [field.name for field in Permission._meta.fields] + list_display = ('admin_name', 'name', 'codename', 'content_type') + list_filter = ('content_type__app_label',) + + @staticmethod + def admin_name(obj): + return str(obj) + + def has_add_permission(self, request): + return False + + def has_delete_permission(self, request, obj=None): + return False + + +# Hack to allow registration of django.contrib.auth models in our authentication app +class ProxyUser(User): + class Meta: + proxy = True + verbose_name = User._meta.verbose_name + verbose_name_plural = User._meta.verbose_name_plural + + +class ProxyPermission(Permission): + class Meta: + proxy = True + verbose_name = Permission._meta.verbose_name + verbose_name_plural = Permission._meta.verbose_name_plural + +try: + admin.site.unregister(User) +finally: + admin.site.register(ProxyUser, UserAdmin) + admin.site.register(ProxyPermission, PermissionAdmin) \ No newline at end of file diff --git a/authentication/migrations/0015_user_profiles.py b/authentication/migrations/0015_user_profiles.py index 06bf2d48..a0857eb9 100644 --- a/authentication/migrations/0015_user_profiles.py +++ b/authentication/migrations/0015_user_profiles.py @@ -191,6 +191,7 @@ class Migration(migrations.Migration): ], options={ 'default_permissions': ('change', 'delete'), + 'ordering': ['user', 'character__character_name'], }, ), migrations.CreateModel( diff --git a/authentication/models.py b/authentication/models.py index 4c88f547..1deaa360 100755 --- a/authentication/models.py +++ b/authentication/models.py @@ -83,6 +83,7 @@ class UserProfile(models.Model): class CharacterOwnership(models.Model): class Meta: default_permissions = ('change', 'delete') + ordering = ['user', 'character__character_name'] character = models.OneToOneField(EveCharacter, on_delete=models.CASCADE, related_name='character_ownership') owner_hash = models.CharField(max_length=28, unique=True) diff --git a/fleetactivitytracking/views.py b/fleetactivitytracking/views.py index 5aa25657..f86e8894 100644 --- a/fleetactivitytracking/views.py +++ b/fleetactivitytracking/views.py @@ -123,7 +123,6 @@ def fatlink_statistics_corp_view(request, corpid, year=None, month=None): corp_members = CharacterOwnership.objects.filter(character__corporation_id=corpid).values('user_id').distinct() for member in corp_members: - print(member) try: fat_stats[member['user_id']] = MemberStat(User.objects.get(pk=member['user_id']), start_of_month, start_of_next_month) except ObjectDoesNotExist: diff --git a/groupmanagement/admin.py b/groupmanagement/admin.py index aa7ea35a..bf2df202 100644 --- a/groupmanagement/admin.py +++ b/groupmanagement/admin.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals from django.contrib import admin - +from django.contrib.auth.models import Group from groupmanagement.models import GroupRequest from groupmanagement.models import AuthGroup @@ -11,5 +11,18 @@ class AuthGroupAdmin(admin.ModelAdmin): """ filter_horizontal = ('group_leaders',) + +class ProxyGroup(Group): + class Meta: + proxy = True + verbose_name = Group._meta.verbose_name + verbose_name_plural = Group._meta.verbose_name_plural + +try: + admin.site.unregister(Group) +finally: + admin.site.register(ProxyGroup) + + admin.site.register(GroupRequest) admin.site.register(AuthGroup, AuthGroupAdmin)