From cdd51aee750e588d5f3164c38dd21bf42dfba2c8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 30 Dec 2021 13:19:18 -0500 Subject: [PATCH] Closes #8194: Enable bulk user assignment to groups under admin UI --- docs/release-notes/version-3.1.md | 1 + netbox/users/admin/__init__.py | 2 +- netbox/users/admin/forms.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 9112aa100..90c7520e2 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -5,6 +5,7 @@ ### Enhancements * [#8192](https://github.com/netbox-community/netbox/issues/8192) - Add "add prefix" button to aggregate child prefixes view +* [#8194](https://github.com/netbox-community/netbox/issues/8194) - Enable bulk user assignment to groups under admin UI ### Bug Fixes diff --git a/netbox/users/admin/__init__.py b/netbox/users/admin/__init__.py index f2e2e0ed5..1b163ed06 100644 --- a/netbox/users/admin/__init__.py +++ b/netbox/users/admin/__init__.py @@ -17,7 +17,7 @@ admin.site.unregister(User) @admin.register(Group) class GroupAdmin(admin.ModelAdmin): - fields = ('name',) + form = forms.GroupAdminForm list_display = ('name', 'user_count') ordering = ('name',) search_fields = ('name',) diff --git a/netbox/users/admin/forms.py b/netbox/users/admin/forms.py index 6d94859cd..7d0212441 100644 --- a/netbox/users/admin/forms.py +++ b/netbox/users/admin/forms.py @@ -1,4 +1,6 @@ from django import forms +from django.contrib.auth.models import Group, User +from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldError, ValidationError from django.db.models import Q @@ -8,11 +10,39 @@ from users.models import ObjectPermission, Token from utilities.forms.fields import ContentTypeMultipleChoiceField __all__ = ( + 'GroupAdminForm', 'ObjectPermissionForm', 'TokenAdminForm', ) +class GroupAdminForm(forms.ModelForm): + users = forms.ModelMultipleChoiceField( + queryset=User.objects.all(), + required=False, + widget=FilteredSelectMultiple('users', False) + ) + + class Meta: + model = Group + fields = ('name', 'users') + + def __init__(self, *args, **kwargs): + super(GroupAdminForm, self).__init__(*args, **kwargs) + + if self.instance.pk: + self.fields['users'].initial = self.instance.user_set.all() + + def save_m2m(self): + self.instance.user_set.set(self.cleaned_data['users']) + + def save(self, *args, **kwargs): + instance = super(GroupAdminForm, self).save() + self.save_m2m() + + return instance + + class TokenAdminForm(forms.ModelForm): key = forms.CharField( required=False,