mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 00:36:11 -06:00
13044 user separate forms and filtersets for UserToken
This commit is contained in:
parent
53ec3d43e7
commit
d66318aa36
@ -10,7 +10,9 @@ from users.models import ObjectPermission, Token
|
||||
__all__ = (
|
||||
'GroupFilterSet',
|
||||
'ObjectPermissionFilterSet',
|
||||
'TokenFilterSet',
|
||||
'UserFilterSet',
|
||||
'UserTokenFilterSet',
|
||||
)
|
||||
|
||||
|
||||
@ -110,6 +112,54 @@ class TokenFilterSet(BaseFilterSet):
|
||||
)
|
||||
|
||||
|
||||
class UserTokenFilterSet(BaseFilterSet):
|
||||
q = django_filters.CharFilter(
|
||||
method='search',
|
||||
label=_('Search'),
|
||||
)
|
||||
user_id = django_filters.ModelMultipleChoiceFilter(
|
||||
field_name='user',
|
||||
queryset=get_user_model().objects.all(),
|
||||
label=_('User'),
|
||||
)
|
||||
user = django_filters.ModelMultipleChoiceFilter(
|
||||
field_name='user__username',
|
||||
queryset=get_user_model().objects.all(),
|
||||
to_field_name='username',
|
||||
label=_('User (name)'),
|
||||
)
|
||||
created = django_filters.DateTimeFilter()
|
||||
created__gte = django_filters.DateTimeFilter(
|
||||
field_name='created',
|
||||
lookup_expr='gte'
|
||||
)
|
||||
created__lte = django_filters.DateTimeFilter(
|
||||
field_name='created',
|
||||
lookup_expr='lte'
|
||||
)
|
||||
expires = django_filters.DateTimeFilter()
|
||||
expires__gte = django_filters.DateTimeFilter(
|
||||
field_name='expires',
|
||||
lookup_expr='gte'
|
||||
)
|
||||
expires__lte = django_filters.DateTimeFilter(
|
||||
field_name='expires',
|
||||
lookup_expr='lte'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Token
|
||||
fields = ['id', 'key', 'write_enabled', 'description']
|
||||
|
||||
def search(self, queryset, name, value):
|
||||
if not value.strip():
|
||||
return queryset
|
||||
return queryset.filter(
|
||||
Q(user__username__icontains=value) |
|
||||
Q(description__icontains=value)
|
||||
)
|
||||
|
||||
|
||||
class ObjectPermissionFilterSet(BaseFilterSet):
|
||||
q = django_filters.CharFilter(
|
||||
method='search',
|
||||
|
@ -6,16 +6,11 @@ from utilities.forms.widgets import BulkEditNullBooleanSelect
|
||||
|
||||
__all__ = (
|
||||
'ObjectPermissionBulkEditForm',
|
||||
'TokenBulkEditForm',
|
||||
'UserBulkEditForm',
|
||||
'UserTokenBulkEditForm',
|
||||
)
|
||||
|
||||
|
||||
class TokenBulkEditForm(BulkEditForm):
|
||||
pk = forms.ModelMultipleChoiceField(queryset=Token.objects.all(), widget=forms.MultipleHiddenInput)
|
||||
description = forms.CharField(max_length=200, required=False)
|
||||
|
||||
|
||||
class UserBulkEditForm(BootstrapMixin, forms.Form):
|
||||
pk = forms.ModelMultipleChoiceField(queryset=NetBoxUser.objects.all(), widget=forms.MultipleHiddenInput)
|
||||
first_name = forms.CharField(label=_('First name'), max_length=150, required=False)
|
||||
@ -37,3 +32,8 @@ class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
|
||||
model = ObjectPermission
|
||||
fieldsets = ((None, ('enabled', 'description')),)
|
||||
nullable_fields = ('description',)
|
||||
|
||||
|
||||
class UserTokenBulkEditForm(BulkEditForm):
|
||||
pk = forms.ModelMultipleChoiceField(queryset=Token.objects.all(), widget=forms.MultipleHiddenInput)
|
||||
description = forms.CharField(max_length=200, required=False)
|
||||
|
@ -4,18 +4,11 @@ from utilities.forms import CSVModelForm
|
||||
|
||||
__all__ = (
|
||||
'GroupImportForm',
|
||||
'TokenImportForm',
|
||||
'UserImportForm',
|
||||
'UserTokenImportForm',
|
||||
)
|
||||
|
||||
|
||||
class TokenImportForm(CSVModelForm):
|
||||
|
||||
class Meta:
|
||||
model = Token
|
||||
fields = ('description', )
|
||||
|
||||
|
||||
class GroupImportForm(CSVModelForm):
|
||||
|
||||
class Meta:
|
||||
@ -39,3 +32,10 @@ class UserImportForm(CSVModelForm):
|
||||
self.instance.set_password(self.cleaned_data.get('password'))
|
||||
|
||||
return super().save(*args, **kwargs)
|
||||
|
||||
|
||||
class UserTokenImportForm(CSVModelForm):
|
||||
|
||||
class Meta:
|
||||
model = Token
|
||||
fields = ('description', )
|
||||
|
@ -14,15 +14,11 @@ from utilities.forms.fields import DynamicModelMultipleChoiceField
|
||||
__all__ = (
|
||||
'GroupFilterForm',
|
||||
'ObjectPermissionFilterForm',
|
||||
'TokenFilterForm',
|
||||
'UserFilterForm',
|
||||
'UserTokenFilterForm',
|
||||
)
|
||||
|
||||
|
||||
class TokenFilterForm(SavedFiltersMixin, FilterForm):
|
||||
model = Token
|
||||
|
||||
|
||||
class GroupFilterForm(NetBoxModelFilterSetForm):
|
||||
model = NetBoxGroup
|
||||
fieldsets = (
|
||||
@ -117,3 +113,7 @@ class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
|
||||
),
|
||||
label=_('Can Delete'),
|
||||
)
|
||||
|
||||
|
||||
class UserTokenFilterForm(SavedFiltersMixin, FilterForm):
|
||||
model = Token
|
||||
|
@ -32,6 +32,7 @@ __all__ = (
|
||||
'TokenForm',
|
||||
'UserConfigForm',
|
||||
'UserForm',
|
||||
'UserTokenForm',
|
||||
)
|
||||
|
||||
|
||||
@ -146,6 +147,41 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
|
||||
del self.fields['key']
|
||||
|
||||
|
||||
class UserTokenForm(BootstrapMixin, forms.ModelForm):
|
||||
key = forms.CharField(
|
||||
label=_('Key'), required=False, help_text=_("If no key is provided, one will be generated automatically.")
|
||||
)
|
||||
allowed_ips = SimpleArrayField(
|
||||
base_field=IPNetworkFormField(validators=[prefix_validator]),
|
||||
required=False,
|
||||
label=_('Allowed IPs'),
|
||||
help_text=_(
|
||||
'Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for no restrictions. '
|
||||
'Example: <code>10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64</code>'
|
||||
),
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = Token
|
||||
fields = [
|
||||
'key',
|
||||
'write_enabled',
|
||||
'expires',
|
||||
'description',
|
||||
'allowed_ips',
|
||||
]
|
||||
widgets = {
|
||||
'expires': DateTimePicker(),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Omit the key field if token retrieval is not permitted
|
||||
if self.instance.pk and not settings.ALLOW_TOKEN_RETRIEVAL:
|
||||
del self.fields['key']
|
||||
|
||||
|
||||
class UserForm(BootstrapMixin, forms.ModelForm):
|
||||
password = forms.CharField(
|
||||
label=_('Password'),
|
||||
|
@ -9,6 +9,7 @@ __all__ = (
|
||||
'ObjectPermissionTable',
|
||||
'TokenTable',
|
||||
'UserTable',
|
||||
'UserTokenTable',
|
||||
)
|
||||
|
||||
|
||||
@ -56,6 +57,31 @@ class TokenTable(NetBoxTable):
|
||||
)
|
||||
|
||||
|
||||
class UserTokenTable(NetBoxTable):
|
||||
key = columns.TemplateColumn(
|
||||
template_code=TOKEN
|
||||
)
|
||||
write_enabled = columns.BooleanColumn(
|
||||
verbose_name='Write'
|
||||
)
|
||||
created = columns.DateColumn()
|
||||
expired = columns.DateColumn()
|
||||
last_used = columns.DateTimeColumn()
|
||||
allowed_ips = columns.TemplateColumn(
|
||||
template_code=ALLOWED_IPS
|
||||
)
|
||||
actions = TokenActionsColumn(
|
||||
actions=('edit', 'delete'),
|
||||
extra_buttons=COPY_BUTTON
|
||||
)
|
||||
|
||||
class Meta(NetBoxTable.Meta):
|
||||
model = Token
|
||||
fields = (
|
||||
'pk', 'description', 'key', 'write_enabled', 'created', 'expires', 'last_used', 'allowed_ips',
|
||||
)
|
||||
|
||||
|
||||
class UserTable(NetBoxTable):
|
||||
username = tables.Column(
|
||||
linkify=True
|
||||
|
@ -27,7 +27,7 @@ from netbox.config import get_config
|
||||
from netbox.views import generic
|
||||
|
||||
from . import filtersets, forms, tables
|
||||
from .filtersets import TokenFilterSet
|
||||
from .filtersets import TokenFilterSet, UserTokenFilterSet
|
||||
from .models import (
|
||||
NetBoxGroup,
|
||||
NetBoxUser,
|
||||
@ -36,7 +36,7 @@ from .models import (
|
||||
UserConfig,
|
||||
UserToken,
|
||||
)
|
||||
from .tables import TokenTable
|
||||
from .tables import TokenTable, UserTokenTable
|
||||
|
||||
#
|
||||
# Login/logout
|
||||
@ -421,9 +421,9 @@ class TokenDeleteView(LoginRequiredMixin, View):
|
||||
|
||||
class UserTokenListView(generic.ObjectListView):
|
||||
queryset = UserToken.objects.all()
|
||||
filterset = TokenFilterSet
|
||||
filterset_form = forms.TokenFilterForm
|
||||
table = TokenTable
|
||||
filterset = UserTokenFilterSet
|
||||
filterset_form = forms.UserTokenFilterForm
|
||||
table = UserTokenTable
|
||||
|
||||
|
||||
@register_model_view(UserToken)
|
||||
@ -437,7 +437,7 @@ class UserTokenView(generic.ObjectView):
|
||||
@register_model_view(UserToken, 'edit')
|
||||
class UserTokenEditView(generic.ObjectEditView):
|
||||
queryset = UserToken.objects.all()
|
||||
form = forms.TokenForm
|
||||
form = forms.UserTokenForm
|
||||
|
||||
|
||||
@register_model_view(UserToken, 'delete')
|
||||
@ -447,18 +447,18 @@ class UserTokenDeleteView(generic.ObjectDeleteView):
|
||||
|
||||
class UserTokenBulkImportView(generic.BulkImportView):
|
||||
queryset = UserToken.objects.all()
|
||||
model_form = forms.TokenImportForm
|
||||
model_form = forms.UserTokenImportForm
|
||||
|
||||
|
||||
class UserTokenBulkEditView(generic.BulkEditView):
|
||||
queryset = UserToken.objects.all()
|
||||
table = TokenTable
|
||||
form = forms.TokenBulkEditForm
|
||||
form = forms.UserTokenBulkEditForm
|
||||
|
||||
|
||||
class UserTokenBulkDeleteView(generic.BulkDeleteView):
|
||||
queryset = UserToken.objects.all()
|
||||
table = TokenTable
|
||||
table = UserTokenTable
|
||||
|
||||
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user