From ce2dada9fd2443ad94a14ecff6c0c2d9017db649 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 3 Aug 2020 16:10:51 -0400 Subject: [PATCH] Closes #4942: Make ObjectPermission's 'name' field required --- docs/release-notes/version-2.9.md | 7 ++++++- netbox/users/admin.py | 9 +-------- netbox/users/migrations/0008_objectpermission.py | 3 ++- netbox/users/migrations/0009_replicate_permissions.py | 8 ++++++-- netbox/users/models.py | 6 +++--- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/docs/release-notes/version-2.9.md b/docs/release-notes/version-2.9.md index a2e94d04f..043c198b7 100644 --- a/docs/release-notes/version-2.9.md +++ b/docs/release-notes/version-2.9.md @@ -1,6 +1,6 @@ # NetBox v2.9 -## v2.9.0 (FUTURE) +## v2.9-beta2 (FUTURE) ### Enhancements @@ -18,6 +18,11 @@ * [#4938](https://github.com/netbox-community/netbox/issues/4938) - Show add, import buttons on virtual chassis list view * [#4939](https://github.com/netbox-community/netbox/issues/4939) - Fix linking to LAG interfaces on other VC members +### Other Changes + +* [#4940](https://github.com/netbox-community/netbox/issues/4940) - Add an `occupied` field to rack unit representations for rack elevation views +* [#4942](https://github.com/netbox-community/netbox/issues/4942) - Make ObjectPermission's `name` field required + --- ## v2.9-beta1 (2020-07-23) diff --git a/netbox/users/admin.py b/netbox/users/admin.py index 850b2c460..6d2472e45 100644 --- a/netbox/users/admin.py +++ b/netbox/users/admin.py @@ -251,7 +251,7 @@ class ObjectPermissionAdmin(admin.ModelAdmin): filter_horizontal = ('object_types', 'groups', 'users') form = ObjectPermissionForm list_display = [ - 'get_name', 'enabled', 'list_models', 'list_users', 'list_groups', 'actions', 'constraints', + 'name', 'enabled', 'list_models', 'list_users', 'list_groups', 'actions', 'constraints', ] list_filter = [ 'enabled', ActionListFilter, ObjectTypeListFilter, 'groups', 'users' @@ -260,13 +260,6 @@ class ObjectPermissionAdmin(admin.ModelAdmin): def get_queryset(self, request): return super().get_queryset(request).prefetch_related('object_types', 'users', 'groups') - def get_name(self, obj): - return '{}: {}'.format( - ', '.join([ot.name for ot in obj.object_types.all()]), - ', '.join(obj.actions) - ) - get_name.short_description = 'Name' - def list_models(self, obj): return ', '.join([f"{ct}" for ct in obj.object_types.all()]) list_models.short_description = 'Models' diff --git a/netbox/users/migrations/0008_objectpermission.py b/netbox/users/migrations/0008_objectpermission.py index 2df065898..4fc7a0220 100644 --- a/netbox/users/migrations/0008_objectpermission.py +++ b/netbox/users/migrations/0008_objectpermission.py @@ -18,7 +18,7 @@ class Migration(migrations.Migration): name='ObjectPermission', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=100)), + ('name', models.CharField(max_length=100)), ('enabled', models.BooleanField(default=True)), ('constraints', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), ('actions', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), size=None)), @@ -27,6 +27,7 @@ class Migration(migrations.Migration): ('users', models.ManyToManyField(blank=True, related_name='object_permissions', to=settings.AUTH_USER_MODEL)), ], options={ + 'ordering': ['name'], 'verbose_name': 'permission', }, ), diff --git a/netbox/users/migrations/0009_replicate_permissions.py b/netbox/users/migrations/0009_replicate_permissions.py index a5d28beac..4583da302 100644 --- a/netbox/users/migrations/0009_replicate_permissions.py +++ b/netbox/users/migrations/0009_replicate_permissions.py @@ -13,7 +13,7 @@ def replicate_permissions(apps, schema_editor): # TODO: Optimize this iteration so that ObjectPermissions with identical sets of users and groups # are combined into a single ObjectPermission instance. - for perm in Permission.objects.all(): + for perm in Permission.objects.select_related('content_type'): if perm.codename.split('_')[0] in ACTIONS: action = perm.codename.split('_')[0] elif perm.codename == 'activate_userkey': @@ -24,7 +24,11 @@ def replicate_permissions(apps, schema_editor): action = perm.codename if perm.group_set.exists() or perm.user_set.exists(): - obj_perm = ObjectPermission(actions=[action]) + obj_perm = ObjectPermission( + # Copy name from original Permission object + name=f'{perm.content_type.app_label}.{perm.codename}'[:100], + actions=[action] + ) obj_perm.save() obj_perm.object_types.add(perm.content_type) if perm.group_set.exists(): diff --git a/netbox/users/models.py b/netbox/users/models.py index a531ba867..3d89e93d2 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -239,8 +239,7 @@ class ObjectPermission(models.Model): identified by ORM query parameters. """ name = models.CharField( - max_length=100, - blank=True + max_length=100 ) enabled = models.BooleanField( default=True @@ -277,7 +276,8 @@ class ObjectPermission(models.Model): objects = RestrictedQuerySet.as_manager() class Meta: + ordering = ['name'] verbose_name = "permission" def __str__(self): - return self.name or f'Permission #{self.pk}' + return self.name