diff --git a/netbox/users/admin.py b/netbox/users/admin.py index 8ea33514a..e13904eea 100644 --- a/netbox/users/admin.py +++ b/netbox/users/admin.py @@ -3,8 +3,14 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin as UserAdmin_ from django.contrib.auth.models import Group, User +from extras.admin import order_content_types from .models import ObjectPermission, Token, UserConfig + +# +# Users & groups +# + # Unregister the built-in GroupAdmin and UserAdmin classes so that we can use our custom admin classes below admin.site.unregister(Group) admin.site.unregister(User) @@ -44,6 +50,10 @@ class UserAdmin(UserAdmin_): inlines = (UserConfigInline,) +# +# REST API tokens +# + class TokenAdminForm(forms.ModelForm): key = forms.CharField( required=False, @@ -65,8 +75,27 @@ class TokenAdmin(admin.ModelAdmin): ] +# +# Permissions +# + +class ObjectPermissionForm(forms.ModelForm): + + class Meta: + model = ObjectPermission + exclude = [] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Format ContentType choices + order_content_types(self.fields['model']) + self.fields['model'].choices.insert(0, ('', '---------')) + + @admin.register(ObjectPermission) class ObjectPermissionAdmin(admin.ModelAdmin): + form = ObjectPermissionForm list_display = [ 'model', 'can_view', 'can_add', 'can_change', 'can_delete' ] diff --git a/netbox/users/migrations/0007_objectpermission.py b/netbox/users/migrations/0007_objectpermission.py index 1fadcc9a5..da176dd5d 100644 --- a/netbox/users/migrations/0007_objectpermission.py +++ b/netbox/users/migrations/0007_objectpermission.py @@ -26,7 +26,7 @@ class Migration(migrations.Migration): ('can_change', models.BooleanField(default=False)), ('can_delete', models.BooleanField(default=False)), ('groups', models.ManyToManyField(blank=True, related_name='object_permissions', to='auth.Group')), - ('model', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('model', models.ForeignKey(limit_choices_to={'app_label__in': ['circuits', 'dcim', 'extras', 'ipam', 'secrets', 'tenancy', 'virtualization']}, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), ('users', models.ManyToManyField(blank=True, related_name='object_permissions', to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/netbox/users/models.py b/netbox/users/models.py index cf2ee3953..6de7bf01a 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -214,6 +214,11 @@ class ObjectPermission(models.Model): ) model = models.ForeignKey( to=ContentType, + limit_choices_to={ + 'app_label__in': [ + 'circuits', 'dcim', 'extras', 'ipam', 'secrets', 'tenancy', 'virtualization', + ], + }, on_delete=models.CASCADE ) attrs = JSONField(