mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 08:46:10 -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__ = (
|
__all__ = (
|
||||||
'GroupFilterSet',
|
'GroupFilterSet',
|
||||||
'ObjectPermissionFilterSet',
|
'ObjectPermissionFilterSet',
|
||||||
|
'TokenFilterSet',
|
||||||
'UserFilterSet',
|
'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):
|
class ObjectPermissionFilterSet(BaseFilterSet):
|
||||||
q = django_filters.CharFilter(
|
q = django_filters.CharFilter(
|
||||||
method='search',
|
method='search',
|
||||||
|
@ -6,16 +6,11 @@ from utilities.forms.widgets import BulkEditNullBooleanSelect
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'ObjectPermissionBulkEditForm',
|
'ObjectPermissionBulkEditForm',
|
||||||
'TokenBulkEditForm',
|
|
||||||
'UserBulkEditForm',
|
'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):
|
class UserBulkEditForm(BootstrapMixin, forms.Form):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=NetBoxUser.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=NetBoxUser.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
first_name = forms.CharField(label=_('First name'), max_length=150, required=False)
|
first_name = forms.CharField(label=_('First name'), max_length=150, required=False)
|
||||||
@ -37,3 +32,8 @@ class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
|
|||||||
model = ObjectPermission
|
model = ObjectPermission
|
||||||
fieldsets = ((None, ('enabled', 'description')),)
|
fieldsets = ((None, ('enabled', 'description')),)
|
||||||
nullable_fields = ('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__ = (
|
__all__ = (
|
||||||
'GroupImportForm',
|
'GroupImportForm',
|
||||||
'TokenImportForm',
|
|
||||||
'UserImportForm',
|
'UserImportForm',
|
||||||
|
'UserTokenImportForm',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TokenImportForm(CSVModelForm):
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
model = Token
|
|
||||||
fields = ('description', )
|
|
||||||
|
|
||||||
|
|
||||||
class GroupImportForm(CSVModelForm):
|
class GroupImportForm(CSVModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -39,3 +32,10 @@ class UserImportForm(CSVModelForm):
|
|||||||
self.instance.set_password(self.cleaned_data.get('password'))
|
self.instance.set_password(self.cleaned_data.get('password'))
|
||||||
|
|
||||||
return super().save(*args, **kwargs)
|
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__ = (
|
__all__ = (
|
||||||
'GroupFilterForm',
|
'GroupFilterForm',
|
||||||
'ObjectPermissionFilterForm',
|
'ObjectPermissionFilterForm',
|
||||||
'TokenFilterForm',
|
|
||||||
'UserFilterForm',
|
'UserFilterForm',
|
||||||
|
'UserTokenFilterForm',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TokenFilterForm(SavedFiltersMixin, FilterForm):
|
|
||||||
model = Token
|
|
||||||
|
|
||||||
|
|
||||||
class GroupFilterForm(NetBoxModelFilterSetForm):
|
class GroupFilterForm(NetBoxModelFilterSetForm):
|
||||||
model = NetBoxGroup
|
model = NetBoxGroup
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
@ -117,3 +113,7 @@ class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
|
|||||||
),
|
),
|
||||||
label=_('Can Delete'),
|
label=_('Can Delete'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UserTokenFilterForm(SavedFiltersMixin, FilterForm):
|
||||||
|
model = Token
|
||||||
|
@ -32,6 +32,7 @@ __all__ = (
|
|||||||
'TokenForm',
|
'TokenForm',
|
||||||
'UserConfigForm',
|
'UserConfigForm',
|
||||||
'UserForm',
|
'UserForm',
|
||||||
|
'UserTokenForm',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -146,6 +147,41 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
|
|||||||
del self.fields['key']
|
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):
|
class UserForm(BootstrapMixin, forms.ModelForm):
|
||||||
password = forms.CharField(
|
password = forms.CharField(
|
||||||
label=_('Password'),
|
label=_('Password'),
|
||||||
|
@ -9,6 +9,7 @@ __all__ = (
|
|||||||
'ObjectPermissionTable',
|
'ObjectPermissionTable',
|
||||||
'TokenTable',
|
'TokenTable',
|
||||||
'UserTable',
|
'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):
|
class UserTable(NetBoxTable):
|
||||||
username = tables.Column(
|
username = tables.Column(
|
||||||
linkify=True
|
linkify=True
|
||||||
|
@ -27,7 +27,7 @@ from netbox.config import get_config
|
|||||||
from netbox.views import generic
|
from netbox.views import generic
|
||||||
|
|
||||||
from . import filtersets, forms, tables
|
from . import filtersets, forms, tables
|
||||||
from .filtersets import TokenFilterSet
|
from .filtersets import TokenFilterSet, UserTokenFilterSet
|
||||||
from .models import (
|
from .models import (
|
||||||
NetBoxGroup,
|
NetBoxGroup,
|
||||||
NetBoxUser,
|
NetBoxUser,
|
||||||
@ -36,7 +36,7 @@ from .models import (
|
|||||||
UserConfig,
|
UserConfig,
|
||||||
UserToken,
|
UserToken,
|
||||||
)
|
)
|
||||||
from .tables import TokenTable
|
from .tables import TokenTable, UserTokenTable
|
||||||
|
|
||||||
#
|
#
|
||||||
# Login/logout
|
# Login/logout
|
||||||
@ -421,9 +421,9 @@ class TokenDeleteView(LoginRequiredMixin, View):
|
|||||||
|
|
||||||
class UserTokenListView(generic.ObjectListView):
|
class UserTokenListView(generic.ObjectListView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
filterset = TokenFilterSet
|
filterset = UserTokenFilterSet
|
||||||
filterset_form = forms.TokenFilterForm
|
filterset_form = forms.UserTokenFilterForm
|
||||||
table = TokenTable
|
table = UserTokenTable
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(UserToken)
|
@register_model_view(UserToken)
|
||||||
@ -437,7 +437,7 @@ class UserTokenView(generic.ObjectView):
|
|||||||
@register_model_view(UserToken, 'edit')
|
@register_model_view(UserToken, 'edit')
|
||||||
class UserTokenEditView(generic.ObjectEditView):
|
class UserTokenEditView(generic.ObjectEditView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
form = forms.TokenForm
|
form = forms.UserTokenForm
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(UserToken, 'delete')
|
@register_model_view(UserToken, 'delete')
|
||||||
@ -447,18 +447,18 @@ class UserTokenDeleteView(generic.ObjectDeleteView):
|
|||||||
|
|
||||||
class UserTokenBulkImportView(generic.BulkImportView):
|
class UserTokenBulkImportView(generic.BulkImportView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
model_form = forms.TokenImportForm
|
model_form = forms.UserTokenImportForm
|
||||||
|
|
||||||
|
|
||||||
class UserTokenBulkEditView(generic.BulkEditView):
|
class UserTokenBulkEditView(generic.BulkEditView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
table = TokenTable
|
table = TokenTable
|
||||||
form = forms.TokenBulkEditForm
|
form = forms.UserTokenBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
class UserTokenBulkDeleteView(generic.BulkDeleteView):
|
class UserTokenBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
table = TokenTable
|
table = UserTokenTable
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user