125890 basic group objectpermission views

This commit is contained in:
Arthur 2023-06-06 11:15:35 -07:00
parent a609467968
commit bd67cfb401
10 changed files with 339 additions and 17 deletions

View File

@ -351,7 +351,9 @@ ADMIN_MENU = Menu(
MenuGroup( MenuGroup(
label=_('Users'), label=_('Users'),
items=( items=(
get_model_item('users', 'user', _('Users'), actions=['add']), get_model_item('users', 'netboxuser', _('Users'), actions=['add']),
get_model_item('users', 'netboxgroup', _('Groups'), actions=['add']),
get_model_item('users', 'objectpermission', _('Permissions'), actions=['add']),
), ),
), ),
), ),

View File

@ -11,6 +11,8 @@ from utilities.forms.fields import CommentField, DynamicModelChoiceField, Dynami
from utilities.forms.widgets import DatePicker, NumberWithOptions from utilities.forms.widgets import DatePicker, NumberWithOptions
__all__ = ( __all__ = (
'GroupBulkEditForm',
'ObjectPermissionBulkEditForm',
'UserBulkEditForm', 'UserBulkEditForm',
) )
@ -36,3 +38,49 @@ class UserBulkEditForm(NetBoxModelBulkEditForm):
nullable_fields = ( nullable_fields = (
'asns', 'description', 'comments', 'asns', 'description', 'comments',
) )
class GroupBulkEditForm(NetBoxModelBulkEditForm):
asns = DynamicModelMultipleChoiceField(
queryset=ASN.objects.all(),
label=_('ASNs'),
required=False
)
description = forms.CharField(
max_length=200,
required=False
)
comments = CommentField(
label=_('Comments')
)
model = Provider
fieldsets = (
(None, ('asns', 'description')),
)
nullable_fields = (
'asns', 'description', 'comments',
)
class ObjectPermissionBulkEditForm(NetBoxModelBulkEditForm):
asns = DynamicModelMultipleChoiceField(
queryset=ASN.objects.all(),
label=_('ASNs'),
required=False
)
description = forms.CharField(
max_length=200,
required=False
)
comments = CommentField(
label=_('Comments')
)
model = Provider
fieldsets = (
(None, ('asns', 'description')),
)
nullable_fields = (
'asns', 'description', 'comments',
)

View File

@ -1,15 +1,14 @@
from django import forms from django import forms
from circuits.choices import CircuitStatusChoices from users.models import *
from circuits.models import *
from dcim.models import Site
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from netbox.forms import NetBoxModelImportForm from netbox.forms import NetBoxModelImportForm
from tenancy.models import Tenant
from utilities.forms import BootstrapMixin from utilities.forms import BootstrapMixin
from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField
__all__ = ( __all__ = (
'GroupImportForm',
'ObjectPermissionImportForm',
'UserImportForm', 'UserImportForm',
) )
@ -18,7 +17,27 @@ class UserImportForm(NetBoxModelImportForm):
slug = SlugField() slug = SlugField()
class Meta: class Meta:
model = Provider model = NetBoxUser
fields = ( fields = (
'name', 'slug', 'description', 'comments', 'tags', 'email',
)
class GroupImportForm(NetBoxModelImportForm):
slug = SlugField()
class Meta:
model = NetBoxGroup
fields = (
'name',
)
class ObjectPermissionImportForm(NetBoxModelImportForm):
slug = SlugField()
class Meta:
model = ObjectPermission
fields = (
'name',
) )

View File

@ -12,6 +12,8 @@ from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterFie
from utilities.forms.widgets import DatePicker, NumberWithOptions from utilities.forms.widgets import DatePicker, NumberWithOptions
__all__ = ( __all__ = (
'GroupFilterForm',
'ObjectPermissionFilterForm',
'UserFilterForm', 'UserFilterForm',
) )
@ -44,3 +46,63 @@ class UserFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm):
required=False, required=False,
label='Is Active', label='Is Active',
) )
class GroupFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm):
model = NetBoxUser
fieldsets = (
(None, ('q', 'filter_id',)),
('Name', ('username', 'first_name', 'last_name')),
('Security', ('is_superuser', 'is_staff', 'is_active')),
)
username = forms.CharField(
required=False
)
first_name = forms.CharField(
required=False
)
last_name = forms.CharField(
required=False
)
is_superuser = forms.BooleanField(
required=False,
label='Is Superuser',
)
is_staff = forms.BooleanField(
required=False,
label='Is Staff',
)
is_active = forms.BooleanField(
required=False,
label='Is Active',
)
class ObjectPermissionFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm):
model = NetBoxUser
fieldsets = (
(None, ('q', 'filter_id',)),
('Name', ('username', 'first_name', 'last_name')),
('Security', ('is_superuser', 'is_staff', 'is_active')),
)
username = forms.CharField(
required=False
)
first_name = forms.CharField(
required=False
)
last_name = forms.CharField(
required=False
)
is_superuser = forms.BooleanField(
required=False,
label='Is Superuser',
)
is_staff = forms.BooleanField(
required=False,
label='Is Staff',
)
is_active = forms.BooleanField(
required=False,
label='Is Active',
)

View File

@ -18,7 +18,9 @@ from users.models import *
__all__ = ( __all__ = (
'GroupForm',
'LoginForm', 'LoginForm',
'ObjectPermissionForm',
'PasswordChangeForm', 'PasswordChangeForm',
'TokenForm', 'TokenForm',
'UserConfigForm', 'UserConfigForm',
@ -160,3 +162,31 @@ class UserForm(BootstrapMixin, forms.ModelForm):
'username', 'first_name', 'last_name', 'email', 'groups', 'username', 'first_name', 'last_name', 'email', 'groups',
'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined', 'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined',
] ]
class GroupForm(BootstrapMixin, forms.ModelForm):
fieldsets = (
('User', ('username', 'first_name', 'last_name', 'email', )),
)
class Meta:
model = NetBoxUser
fields = [
'username', 'first_name', 'last_name', 'email', 'groups',
'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined',
]
class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
fieldsets = (
('User', ('username', 'first_name', 'last_name', 'email', )),
)
class Meta:
model = NetBoxUser
fields = [
'username', 'first_name', 'last_name', 'email', 'groups',
'is_active', 'is_staff', 'is_superuser', 'last_login', 'date_joined',
]

View File

@ -1,4 +1,4 @@
# Generated by Django 4.1.9 on 2023-06-02 16:55 # Generated by Django 4.1.9 on 2023-06-06 18:15
import django.contrib.auth.models import django.contrib.auth.models
from django.db import migrations from django.db import migrations
@ -11,6 +11,20 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.CreateModel(
name='NetBoxGroup',
fields=[],
options={
'verbose_name': 'Group',
'proxy': True,
'indexes': [],
'constraints': [],
},
bases=('auth.group',),
managers=[
('objects', django.contrib.auth.models.GroupManager()),
],
),
migrations.CreateModel( migrations.CreateModel(
name='NetBoxUser', name='NetBoxUser',
fields=[], fields=[],

View File

@ -20,6 +20,7 @@ from utilities.utils import flatten_dict
from .constants import * from .constants import *
__all__ = ( __all__ = (
'NetBoxGroup',
'NetBoxUser', 'NetBoxUser',
'ObjectPermission', 'ObjectPermission',
'Token', 'Token',
@ -58,6 +59,15 @@ class NetBoxUser(User):
verbose_name = 'User' verbose_name = 'User'
proxy = True proxy = True
class NetBoxGroup(Group):
"""
Proxy contrib.auth.models.User for the UI
"""
class Meta:
verbose_name = 'Group'
proxy = True
# #
# User preferences # User preferences
# #

View File

@ -5,6 +5,8 @@ from netbox.tables import NetBoxTable, columns
from users.models import NetBoxUser from users.models import NetBoxUser
__all__ = ( __all__ = (
'GroupTable',
'ObjectPermissionTable',
'TokenTable', 'TokenTable',
'UserTable', 'UserTable',
) )
@ -68,3 +70,31 @@ class UserTable(NetBoxTable):
'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active' 'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active'
) )
default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser') default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser')
class GroupTable(NetBoxTable):
username = tables.LinkColumn('users:netboxuser', args=[A('pk')])
actions = columns.ActionsColumn(
actions=('edit', 'delete'),
)
class Meta(NetBoxTable.Meta):
model = NetBoxUser
fields = (
'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active'
)
default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser')
class ObjectPermissionTable(NetBoxTable):
username = tables.LinkColumn('users:netboxuser', args=[A('pk')])
actions = columns.ActionsColumn(
actions=('edit', 'delete'),
)
class Meta(NetBoxTable.Meta):
model = NetBoxUser
fields = (
'pk', 'id', 'username', 'email', 'first_name', 'last_name', 'is_superuser', 'is_staff', 'is_active'
)
default_columns = ('pk', 'username', 'email', 'first_name', 'last_name', 'is_superuser')

View File

@ -12,14 +12,29 @@ urlpatterns = [
path('password/', views.ChangePasswordView.as_view(), name='change_password'), path('password/', views.ChangePasswordView.as_view(), name='change_password'),
# Users # Users
path('users/', views.NetBoxUserListView.as_view(), name='user_list'), path('users/', views.NetBoxUserListView.as_view(), name='netboxuser_list'),
path('users/add/', views.NetBoxUserEditView.as_view(), name='user_add'),
path('users/add/', views.NetBoxUserEditView.as_view(), name='netboxuser_add'), path('users/add/', views.NetBoxUserEditView.as_view(), name='netboxuser_add'),
path('users/import/', views.NetBoxUserBulkImportView.as_view(), name='netboxuser_import'), path('users/import/', views.NetBoxUserBulkImportView.as_view(), name='netboxuser_import'),
path('users/edit/', views.NetBoxUserBulkEditView.as_view(), name='netboxuser_bulk_edit'), path('users/edit/', views.NetBoxUserBulkEditView.as_view(), name='netboxuser_bulk_edit'),
path('users/delete/', views.NetBoxUserBulkDeleteView.as_view(), name='netboxuser_bulk_delete'), path('users/delete/', views.NetBoxUserBulkDeleteView.as_view(), name='netboxuser_bulk_delete'),
path('users/<int:pk>/', include(get_model_urls('users', 'netboxuser'))), path('users/<int:pk>/', include(get_model_urls('users', 'netboxuser'))),
# Groups
path('groups/', views.NetBoxUserListView.as_view(), name='netboxgroup_list'),
path('groups/add/', views.NetBoxUserEditView.as_view(), name='netboxgroup_add'),
path('groups/import/', views.NetBoxUserBulkImportView.as_view(), name='netboxgroup_import'),
path('groups/edit/', views.NetBoxUserBulkEditView.as_view(), name='netboxgroup_bulk_edit'),
path('groups/delete/', views.NetBoxUserBulkDeleteView.as_view(), name='netboxgroup_bulk_delete'),
path('groups/<int:pk>/', include(get_model_urls('users', 'netboxgroup'))),
# Permissions
path('permissions/', views.NetBoxUserListView.as_view(), name='objectpermission_list'),
path('permissions/add/', views.NetBoxUserEditView.as_view(), name='objectpermission_add'),
path('permissions/import/', views.NetBoxUserBulkImportView.as_view(), name='objectpermission_import'),
path('permissions/edit/', views.NetBoxUserBulkEditView.as_view(), name='objectpermission_bulk_edit'),
path('permissions/delete/', views.NetBoxUserBulkDeleteView.as_view(), name='objectpermission_bulk_delete'),
path('permissions/<int:pk>/', include(get_model_urls('users', 'objectpermission'))),
# API tokens # API tokens
path('api-tokens/', views.TokenListView.as_view(), name='token_list'), path('api-tokens/', views.TokenListView.as_view(), name='token_list'),
path('api-tokens/add/', views.TokenEditView.as_view(), name='token_add'), path('api-tokens/add/', views.TokenEditView.as_view(), name='token_add'),

View File

@ -23,7 +23,7 @@ from netbox.views import generic
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.views import register_model_view from utilities.views import register_model_view
from . import filtersets, forms, tables from . import filtersets, forms, tables
from .models import Token, UserConfig, NetBoxUser from .models import Token, UserConfig, NetBoxGroup, NetBoxUser, ObjectPermission
# #
@ -348,7 +348,7 @@ class NetBoxUserListView(generic.ObjectListView):
@register_model_view(NetBoxUser) @register_model_view(NetBoxUser)
class NetBoxUserView(generic.ObjectView): class NetBoxUserView(generic.ObjectView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
template_name = 'users/user.html' template_name = 'users/user.html'
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
@ -366,28 +366,120 @@ class NetBoxUserView(generic.ObjectView):
@register_model_view(NetBoxUser, 'edit') @register_model_view(NetBoxUser, 'edit')
class NetBoxUserEditView(generic.ObjectEditView): class NetBoxUserEditView(generic.ObjectEditView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
form = forms.UserForm form = forms.UserForm
@register_model_view(NetBoxUser, 'delete') @register_model_view(NetBoxUser, 'delete')
class NetBoxUserDeleteView(generic.ObjectDeleteView): class NetBoxUserDeleteView(generic.ObjectDeleteView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
class NetBoxUserBulkImportView(generic.BulkImportView): class NetBoxUserBulkImportView(generic.BulkImportView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
model_form = forms.UserImportForm model_form = forms.UserImportForm
class NetBoxUserBulkEditView(generic.BulkEditView): class NetBoxUserBulkEditView(generic.BulkEditView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
filterset = filtersets.UserFilterSet filterset = filtersets.UserFilterSet
table = tables.UserTable table = tables.UserTable
form = forms.UserBulkEditForm form = forms.UserBulkEditForm
class NetBoxUserBulkDeleteView(generic.BulkDeleteView): class NetBoxUserBulkDeleteView(generic.BulkDeleteView):
queryset = get_user_model().objects.all() queryset = NetBoxUser.objects.all()
filterset = filtersets.UserFilterSet filterset = filtersets.UserFilterSet
table = tables.UserTable table = tables.UserTable
#
# Groups
#
class NetBoxGroupListView(generic.ObjectListView):
queryset = NetBoxGroup.objects.all()
filterset = filtersets.GroupFilterSet
filterset_form = forms.GroupFilterForm
table = tables.GroupTable
@register_model_view(NetBoxGroup)
class NetBoxGroupView(generic.ObjectView):
queryset = NetBoxGroup.objects.all()
template_name = 'users/group.html'
@register_model_view(NetBoxGroup, 'edit')
class NetBoxGroupEditView(generic.ObjectEditView):
queryset = NetBoxGroup.objects.all()
form = forms.GroupForm
@register_model_view(NetBoxGroup, 'delete')
class NetBoxGroupDeleteView(generic.ObjectDeleteView):
queryset = NetBoxGroup.objects.all()
class NetBoxGroupBulkImportView(generic.BulkImportView):
queryset = NetBoxGroup.objects.all()
model_form = forms.GroupImportForm
class NetBoxGroupBulkEditView(generic.BulkEditView):
queryset = NetBoxGroup.objects.all()
filterset = filtersets.GroupFilterSet
table = tables.GroupTable
form = forms.GroupBulkEditForm
class NetBoxGroupBulkDeleteView(generic.BulkDeleteView):
queryset = NetBoxGroup.objects.all()
filterset = filtersets.GroupFilterSet
table = tables.GroupTable
#
# ObjectPermissions
#
class ObjectPermissionListView(generic.ObjectListView):
queryset = NetBoxGroup.objects.all()
filterset = filtersets.ObjectPermissionFilterSet
filterset_form = forms.ObjectPermissionFilterForm
table = tables.ObjectPermissionTable
@register_model_view(ObjectPermission)
class ObjectPermissionView(generic.ObjectView):
queryset = NetBoxGroup.objects.all()
template_name = 'users/objectpermission.html'
@register_model_view(ObjectPermission, 'edit')
class ObjectPermissionEditView(generic.ObjectEditView):
queryset = ObjectPermission.objects.all()
form = forms.ObjectPermissionForm
@register_model_view(ObjectPermission, 'delete')
class ObjectPermissionDeleteView(generic.ObjectDeleteView):
queryset = ObjectPermission.objects.all()
class ObjectPermissionBulkImportView(generic.BulkImportView):
queryset = ObjectPermission.objects.all()
model_form = forms.ObjectPermissionImportForm
class ObjectPermissionBulkEditView(generic.BulkEditView):
queryset = ObjectPermission.objects.all()
filterset = filtersets.ObjectPermissionFilterSet
table = tables.ObjectPermissionTable
form = forms.ObjectPermissionBulkEditForm
class ObjectPermissionBulkDeleteView(generic.BulkDeleteView):
queryset = ObjectPermission.objects.all()
filterset = filtersets.ObjectPermissionFilterSet
table = tables.ObjectPermissionTable