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.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 def make_service_hooks_update_groups_action(service): """ Make a admin action for the given service :param service: services.hooks.ServicesHook :return: fn to update services groups for the selected users """ def update_service_groups(modeladmin, request, queryset): for user in queryset: # queryset filtering doesn't work here? service.update_groups(user) update_service_groups.__name__ = str('update_{}_groups'.format(slugify(service.name))) update_service_groups.short_description = "Sync groups for selected {} accounts".format(service.title) return update_service_groups def make_service_hooks_sync_nickname_action(service): """ Make a sync_nickname admin action for the given service :param service: services.hooks.ServicesHook :return: fn to sync nickname for the selected users """ def sync_nickname(modeladmin, request, queryset): for user in queryset: # queryset filtering doesn't work here? service.sync_nickname(user) sync_nickname.__name__ = str('sync_{}_nickname'.format(slugify(service.name))) sync_nickname.short_description = "Sync nicknames for selected {} accounts".format(service.title) return sync_nickname class UserAdmin(BaseUserAdmin): """ Extending Django's UserAdmin model """ def get_actions(self, request): actions = super(BaseUserAdmin, self).get_actions(request) for hook in get_hooks('services_hook'): svc = hook() # Check update_groups is redefined/overloaded if svc.update_groups.__module__ != ServicesHook.update_groups.__module__: action = make_service_hooks_update_groups_action(svc) actions[action.__name__] = (action, action.__name__, action.short_description) # Create sync nickname action if service implements it if svc.sync_nickname.__module__ != ServicesHook.sync_nickname.__module__: action = make_service_hooks_sync_nickname_action(svc) actions[action.__name__] = (action, action.__name__, 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'] @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'] def has_delete_permission(self, request, obj=None): if obj == get_guest_state(): return False 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() @admin.register(UserProfile) class UserProfileAdmin(admin.ModelAdmin): form = UserProfileAdminForm def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False