django-orchestra/orchestra/apps/systemusers/admin.py

125 lines
4.6 KiB
Python
Raw Normal View History

import textwrap
from django import forms
from django.conf.urls import patterns, url
from django.core.urlresolvers import reverse
from django.contrib import admin
from django.contrib.admin.util import unquote
2014-10-06 14:57:02 +00:00
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import ugettext, ugettext_lazy as _
2014-10-23 15:38:46 +00:00
from django.utils.safestring import mark_safe
2014-10-06 14:57:02 +00:00
from orchestra.admin import ExtendedModelAdmin, ChangePasswordAdminMixin
from orchestra.admin.utils import wrap_admin_view
2014-09-30 16:39:47 +00:00
from orchestra.apps.accounts.admin import SelectAccountAdminMixin
2014-10-06 14:57:02 +00:00
from orchestra.forms import UserCreationForm, UserChangeForm
from . import settings
from .actions import grant_permission
2014-10-23 15:38:46 +00:00
from .filters import IsMainListFilter
from .models import SystemUser
2014-10-06 14:57:02 +00:00
class SystemUserAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedModelAdmin):
2014-11-14 15:51:18 +00:00
list_display = (
'username', 'account_link', 'shell', 'display_home', 'display_active', 'display_main'
)
2014-10-23 15:38:46 +00:00
list_filter = ('is_active', 'shell', IsMainListFilter)
fieldsets = (
(None, {
2014-09-30 10:20:11 +00:00
'fields': ('username', 'password', 'account_link', 'is_active')
}),
(_("System"), {
'fields': ('shell', ('home', 'directory'), 'groups'),
}),
)
add_fieldsets = (
(None, {
2014-10-23 15:38:46 +00:00
'fields': ('account_link', 'username', 'password1', 'password2')
}),
(_("System"), {
'fields': ('shell', ('home', 'directory'), 'groups'),
}),
)
search_fields = ['username']
2014-09-30 16:39:47 +00:00
readonly_fields = ('account_link',)
change_readonly_fields = ('username',)
filter_horizontal = ('groups',)
filter_by_account_fields = ('groups',)
add_form = UserCreationForm
form = UserChangeForm
ordering = ('-id',)
actions = (grant_permission,)
change_view_actions = actions
2014-10-23 15:38:46 +00:00
def display_active(self, user):
return user.active
display_active.short_description = _("Active")
display_active.admin_order_field = 'is_active'
display_active.boolean = True
def display_main(self, user):
return user.is_main
display_main.short_description = _("Main")
display_main.boolean = True
def display_home(self, user):
return user.get_home()
display_home.short_description = _("Home")
display_home.admin_order_field = 'home'
def get_form(self, request, obj=None, **kwargs):
form = super(SystemUserAdmin, self).get_form(request, obj=obj, **kwargs)
duplicate = lambda n: (n, n)
if obj:
# Has to be done here and not in the form because of strange phenomenon
# derived from monkeypatching formfield.widget.render on AccountAdminMinxin,
# don't ask.
formfield = form.base_fields['groups']
formfield.queryset = formfield.queryset.exclude(id=obj.id)
username = obj.username
choices=(
duplicate(self.account.main_systemuser.get_home()),
duplicate(obj.get_home()),
)
else:
username = '<username>'
choices=(
duplicate(self.account.main_systemuser.get_home()),
duplicate(SystemUser(username=username).get_home()),
)
form.base_fields['home'].widget = forms.Select(choices=choices)
if obj and (obj.is_main or obj.has_shell):
# hidde home option for shell users
form.base_fields['home'].widget = forms.HiddenInput()
form.base_fields['directory'].widget = forms.HiddenInput()
else:
# Some javascript for hidde home/directory inputs when convinient
form.base_fields['shell'].widget.attrs = {
'onChange': textwrap.dedent("""\
field = $(".form-row.field-home.field-directory");
if ($.inArray(this.value, %s) < 0) {
field.addClass("hidden");
} else {
field.removeClass("hidden");
};""" % str(list(settings.SYSTEMUSERS_DISABLED_SHELLS)))
}
form.base_fields['home'].widget.attrs = {
'onChange': textwrap.dedent("""\
field = $(".field-box.field-directory");
if (this.value.search("%s") > 0) {
field.addClass("hidden");
} else {
field.removeClass("hidden");
};""" % username)
}
return form
2014-10-23 15:38:46 +00:00
def has_delete_permission(self, request, obj=None):
if obj and obj.is_main:
return False
return super(SystemUserAdmin, self).has_delete_permission(request, obj=obj)
admin.site.register(SystemUser, SystemUserAdmin)