diff --git a/netbox/users/admin.py b/netbox/users/admin.py index 4c3da5acd..80b7affaf 100644 --- a/netbox/users/admin.py +++ b/netbox/users/admin.py @@ -35,20 +35,42 @@ class UserConfigInline(admin.TabularInline): verbose_name = 'Preferences' +class ObjectPermissionInline(admin.TabularInline): + model = AdminUser.object_permissions.through + fields = ['content_types', 'actions', 'attrs'] + readonly_fields = fields + extra = 0 + verbose_name = 'Permission' + + def content_types(self, instance): + return ', '.join(instance.objectpermission.content_types.values_list('model', flat=True)) + + def actions(self, instance): + return ', '.join(instance.objectpermission.actions) + + def attrs(self, instance): + return instance.objectpermission.attrs + + def has_add_permission(self, request, obj): + # Don't allow the creation of new ObjectPermission assignments via this form + return False + + @admin.register(AdminUser) class UserAdmin(UserAdmin_): list_display = [ 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active' ] fieldsets = ( - (None, {'fields': ('username', 'password')}), - ('Personal info', {'fields': ('first_name', 'last_name', 'email')}), + (None, {'fields': ('username', 'password', 'first_name', 'last_name', 'email')}), + ('Groups', {'fields': ('groups',)}), ('Permissions', { 'fields': ('is_active', 'is_staff', 'is_superuser'), }), ('Important dates', {'fields': ('last_login', 'date_joined')}), ) - inlines = (UserConfigInline,) + inlines = [ObjectPermissionInline, UserConfigInline] + filter_horizontal = ('groups',) # @@ -154,7 +176,7 @@ class ObjectPermissionAdmin(admin.ModelAdmin): 'fields': ('content_types',) }), ('Assignment', { - 'fields': (('groups', 'users'),) + 'fields': ('groups', 'users') }), ('Actions', { 'fields': (('can_view', 'can_add', 'can_change', 'can_delete'), 'actions') @@ -163,10 +185,14 @@ class ObjectPermissionAdmin(admin.ModelAdmin): 'fields': ('attrs',) }), ) + filter_horizontal = ('content_types', 'groups', 'users') form = ObjectPermissionForm list_display = [ 'list_models', 'list_users', 'list_groups', 'actions', 'attrs', ] + list_filter = [ + 'groups', 'users' + ] def get_queryset(self, request): return super().get_queryset(request).prefetch_related('content_types', 'users', 'groups') diff --git a/netbox/users/migrations/0007_proxy_group_user.py b/netbox/users/migrations/0007_proxy_group_user.py index dfd0512bd..2aec9e425 100644 --- a/netbox/users/migrations/0007_proxy_group_user.py +++ b/netbox/users/migrations/0007_proxy_group_user.py @@ -21,6 +21,7 @@ class Migration(migrations.Migration): 'proxy': True, 'indexes': [], 'constraints': [], + 'verbose_name': 'Group', }, bases=('auth.group',), managers=[ @@ -35,6 +36,7 @@ class Migration(migrations.Migration): 'proxy': True, 'indexes': [], 'constraints': [], + 'verbose_name': 'User', }, bases=('auth.user',), managers=[ diff --git a/netbox/users/models.py b/netbox/users/models.py index 1c8775699..9dde9d009 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -29,6 +29,7 @@ class AdminGroup(Group): Proxy contrib.auth.models.Group for the admin UI """ class Meta: + verbose_name = 'Group' proxy = True @@ -37,6 +38,7 @@ class AdminUser(User): Proxy contrib.auth.models.User for the admin UI """ class Meta: + verbose_name = 'User' proxy = True @@ -264,4 +266,7 @@ class ObjectPermission(models.Model): verbose_name = "Permission" def __str__(self): - return "Object permission" + return '{}: {}'.format( + ', '.join(self.content_types.values_list('model', flat=True)), + ', '.join(self.actions) + )