mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-25 08:46:10 -06:00
Revert extraneous formatting changes
This commit is contained in:
parent
ff338002e4
commit
43d2ba6fc8
@ -1,7 +1,8 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from users.models import *
|
from users.models import *
|
||||||
from utilities.forms import BootstrapMixin, BulkEditForm, add_blank_choice
|
from utilities.forms import BootstrapMixin, BulkEditForm
|
||||||
from utilities.forms.widgets import BulkEditNullBooleanSelect
|
from utilities.forms.widgets import BulkEditNullBooleanSelect
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -12,28 +13,72 @@ __all__ = (
|
|||||||
|
|
||||||
|
|
||||||
class UserBulkEditForm(BootstrapMixin, forms.Form):
|
class UserBulkEditForm(BootstrapMixin, forms.Form):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=NetBoxUser.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(
|
||||||
first_name = forms.CharField(label=_('First name'), max_length=150, required=False)
|
queryset=NetBoxUser.objects.all(),
|
||||||
last_name = forms.CharField(label=_('Last name'), max_length=150, required=False)
|
widget=forms.MultipleHiddenInput
|
||||||
is_active = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect, label=_('Active'))
|
)
|
||||||
is_staff = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect, label=_('Staff status'))
|
first_name = forms.CharField(
|
||||||
is_superuser = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect, label=_('Superuser status'))
|
label=_('First name'),
|
||||||
|
max_length=150,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
last_name = forms.CharField(
|
||||||
|
label=_('Last name'),
|
||||||
|
max_length=150,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
is_active = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect,
|
||||||
|
label=_('Active')
|
||||||
|
)
|
||||||
|
is_staff = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect,
|
||||||
|
label=_('Staff status')
|
||||||
|
)
|
||||||
|
is_superuser = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect,
|
||||||
|
label=_('Superuser status')
|
||||||
|
)
|
||||||
|
|
||||||
model = NetBoxUser
|
model = NetBoxUser
|
||||||
fieldsets = ((None, ('first_name', 'last_name', 'is_active', 'is_staff', 'is_superuser')),)
|
fieldsets = (
|
||||||
|
(None, ('first_name', 'last_name', 'is_active', 'is_staff', 'is_superuser')),
|
||||||
|
)
|
||||||
nullable_fields = ('first_name', 'last_name')
|
nullable_fields = ('first_name', 'last_name')
|
||||||
|
|
||||||
|
|
||||||
class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
|
class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=ObjectPermission.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(
|
||||||
description = forms.CharField(label=_('Description'), max_length=200, required=False)
|
queryset=ObjectPermission.objects.all(),
|
||||||
enabled = forms.NullBooleanField(required=False, widget=BulkEditNullBooleanSelect, label=_('Enabled'))
|
widget=forms.MultipleHiddenInput
|
||||||
|
)
|
||||||
|
description = forms.CharField(
|
||||||
|
label=_('Description'),
|
||||||
|
max_length=200,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
enabled = forms.NullBooleanField(
|
||||||
|
required=False,
|
||||||
|
widget=BulkEditNullBooleanSelect,
|
||||||
|
label=_('Enabled')
|
||||||
|
)
|
||||||
|
|
||||||
model = ObjectPermission
|
model = ObjectPermission
|
||||||
fieldsets = ((None, ('enabled', 'description')),)
|
fieldsets = (
|
||||||
|
(None, ('enabled', 'description')),
|
||||||
|
)
|
||||||
nullable_fields = ('description',)
|
nullable_fields = ('description',)
|
||||||
|
|
||||||
|
|
||||||
class UserTokenBulkEditForm(BulkEditForm):
|
class UserTokenBulkEditForm(BulkEditForm):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Token.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(
|
||||||
description = forms.CharField(max_length=200, required=False)
|
queryset=Token.objects.all(),
|
||||||
|
widget=forms.MultipleHiddenInput
|
||||||
|
)
|
||||||
|
description = forms.CharField(
|
||||||
|
max_length=200,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
@ -1,31 +1,24 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.forms import AuthenticationForm
|
|
||||||
from django.contrib.auth.forms import PasswordChangeForm as DjangoPasswordChangeForm
|
|
||||||
from django.contrib.auth.models import Group
|
from django.contrib.auth.models import Group
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.contrib.postgres.forms import SimpleArrayField
|
from django.contrib.postgres.forms import SimpleArrayField
|
||||||
from django.core.exceptions import FieldError
|
from django.core.exceptions import FieldError
|
||||||
from django.utils.html import mark_safe
|
from django.utils.html import mark_safe
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from ipam.formfields import IPNetworkFormField
|
from ipam.formfields import IPNetworkFormField
|
||||||
from ipam.validators import prefix_validator
|
from ipam.validators import prefix_validator
|
||||||
|
from netbox.preferences import PREFERENCES
|
||||||
from users.constants import *
|
from users.constants import *
|
||||||
from users.models import *
|
from users.models import *
|
||||||
from users.models import Token, UserConfig
|
|
||||||
from utilities.forms import BootstrapMixin
|
from utilities.forms import BootstrapMixin
|
||||||
from utilities.forms.fields import (
|
from utilities.forms.fields import ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField
|
||||||
ContentTypeMultipleChoiceField,
|
|
||||||
DynamicModelMultipleChoiceField,
|
|
||||||
)
|
|
||||||
from utilities.forms.widgets import DateTimePicker
|
from utilities.forms.widgets import DateTimePicker
|
||||||
from utilities.permissions import qs_filter_from_constraints
|
from utilities.permissions import qs_filter_from_constraints
|
||||||
from utilities.utils import flatten_dict
|
from utilities.utils import flatten_dict
|
||||||
|
|
||||||
from netbox.preferences import PREFERENCES
|
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'GroupForm',
|
'GroupForm',
|
||||||
'ObjectPermissionForm',
|
'ObjectPermissionForm',
|
||||||
@ -36,16 +29,10 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class LoginForm(BootstrapMixin, AuthenticationForm):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
|
class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
|
||||||
|
|
||||||
def __new__(mcs, name, bases, attrs):
|
def __new__(mcs, name, bases, attrs):
|
||||||
|
|
||||||
# Emulate a declared field for each supported user preference
|
# Emulate a declared field for each supported user preference
|
||||||
preference_fields = {}
|
preference_fields = {}
|
||||||
for field_name, preference in PREFERENCES.items():
|
for field_name, preference in PREFERENCES.items():
|
||||||
@ -67,24 +54,28 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
|
|||||||
|
|
||||||
class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
|
class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(
|
(_('User Interface'), (
|
||||||
_('User Interface'),
|
'pagination.per_page',
|
||||||
(
|
'pagination.placement',
|
||||||
'pagination.per_page',
|
'ui.colormode',
|
||||||
'pagination.placement',
|
)),
|
||||||
'ui.colormode',
|
(_('Miscellaneous'), (
|
||||||
),
|
'data_format',
|
||||||
),
|
)),
|
||||||
(_('Miscellaneous'), ('data_format',)),
|
|
||||||
)
|
)
|
||||||
# List of clearable preferences
|
# List of clearable preferences
|
||||||
pk = forms.MultipleChoiceField(label=_('Pk'), choices=[], required=False)
|
pk = forms.MultipleChoiceField(
|
||||||
|
label=_('Pk'),
|
||||||
|
choices=[],
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = UserConfig
|
model = UserConfig
|
||||||
fields = ()
|
fields = ()
|
||||||
|
|
||||||
def __init__(self, *args, instance=None, **kwargs):
|
def __init__(self, *args, instance=None, **kwargs):
|
||||||
|
|
||||||
# Get initial data from UserConfig instance
|
# Get initial data from UserConfig instance
|
||||||
initial_data = flatten_dict(instance.data)
|
initial_data = flatten_dict(instance.data)
|
||||||
kwargs['initial'] = initial_data
|
kwargs['initial'] = initial_data
|
||||||
@ -92,9 +83,12 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe
|
|||||||
super().__init__(*args, instance=instance, **kwargs)
|
super().__init__(*args, instance=instance, **kwargs)
|
||||||
|
|
||||||
# Compile clearable preference choices
|
# Compile clearable preference choices
|
||||||
self.fields['pk'].choices = ((f'tables.{table_name}', '') for table_name in instance.data.get('tables', []))
|
self.fields['pk'].choices = (
|
||||||
|
(f'tables.{table_name}', '') for table_name in instance.data.get('tables', [])
|
||||||
|
)
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
|
|
||||||
# Set UserConfig data
|
# Set UserConfig data
|
||||||
for pref_name, value in self.cleaned_data.items():
|
for pref_name, value in self.cleaned_data.items():
|
||||||
if pref_name == 'pk':
|
if pref_name == 'pk':
|
||||||
@ -109,7 +103,9 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def plugin_fields(self):
|
def plugin_fields(self):
|
||||||
return [name for name in self.fields.keys() if name.startswith('plugins.')]
|
return [
|
||||||
|
name for name in self.fields.keys() if name.startswith('plugins.')
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class TokenForm(BootstrapMixin, forms.ModelForm):
|
class TokenForm(BootstrapMixin, forms.ModelForm):
|
||||||
@ -129,11 +125,7 @@ class TokenForm(BootstrapMixin, forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Token
|
model = Token
|
||||||
fields = [
|
fields = [
|
||||||
'key',
|
'key', 'write_enabled', 'expires', 'description', 'allowed_ips',
|
||||||
'write_enabled',
|
|
||||||
'expires',
|
|
||||||
'description',
|
|
||||||
'allowed_ips',
|
|
||||||
]
|
]
|
||||||
widgets = {
|
widgets = {
|
||||||
'expires': DateTimePicker(),
|
'expires': DateTimePicker(),
|
||||||
@ -170,12 +162,7 @@ class UserTokenForm(BootstrapMixin, forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = Token
|
model = Token
|
||||||
fields = [
|
fields = [
|
||||||
'key',
|
'user', 'key', 'write_enabled', 'expires', 'description', 'allowed_ips',
|
||||||
'user',
|
|
||||||
'write_enabled',
|
|
||||||
'expires',
|
|
||||||
'description',
|
|
||||||
'allowed_ips',
|
|
||||||
]
|
]
|
||||||
widgets = {
|
widgets = {
|
||||||
'expires': DateTimePicker(),
|
'expires': DateTimePicker(),
|
||||||
@ -201,7 +188,11 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
|||||||
required=True,
|
required=True,
|
||||||
help_text=_("Enter the same password as before, for verification."),
|
help_text=_("Enter the same password as before, for verification."),
|
||||||
)
|
)
|
||||||
groups = DynamicModelMultipleChoiceField(label=_('Groups'), required=False, queryset=Group.objects.all())
|
groups = DynamicModelMultipleChoiceField(
|
||||||
|
label=_('Groups'),
|
||||||
|
required=False,
|
||||||
|
queryset=Group.objects.all()
|
||||||
|
)
|
||||||
object_permissions = DynamicModelMultipleChoiceField(
|
object_permissions = DynamicModelMultipleChoiceField(
|
||||||
required=False,
|
required=False,
|
||||||
label=_('Permissions'),
|
label=_('Permissions'),
|
||||||
@ -211,7 +202,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
|||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(_('User'), ('username', 'password', 'confirm_password', 'first_name', 'last_name', 'email')),
|
(_('User'), ('username', 'password', 'confirm_password', 'first_name', 'last_name', 'email')),
|
||||||
(_('Groups'), ('groups',)),
|
(_('Groups'), ('groups', )),
|
||||||
(_('Status'), ('is_active', 'is_staff', 'is_superuser')),
|
(_('Status'), ('is_active', 'is_staff', 'is_superuser')),
|
||||||
(_('Permissions'), ('object_permissions',)),
|
(_('Permissions'), ('object_permissions',)),
|
||||||
)
|
)
|
||||||
@ -219,15 +210,8 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = NetBoxUser
|
model = NetBoxUser
|
||||||
fields = [
|
fields = [
|
||||||
'username',
|
'username', 'first_name', 'last_name', 'email', 'groups', 'object_permissions',
|
||||||
'first_name',
|
'is_active', 'is_staff', 'is_superuser',
|
||||||
'last_name',
|
|
||||||
'email',
|
|
||||||
'groups',
|
|
||||||
'object_permissions',
|
|
||||||
'is_active',
|
|
||||||
'is_staff',
|
|
||||||
'is_superuser',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -257,6 +241,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
|||||||
return instance
|
return instance
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
# Check that password confirmation matches if password is set
|
# Check that password confirmation matches if password is set
|
||||||
if self.cleaned_data['password'] and self.cleaned_data['password'] != self.cleaned_data['confirm_password']:
|
if self.cleaned_data['password'] and self.cleaned_data['password'] != self.cleaned_data['confirm_password']:
|
||||||
raise forms.ValidationError(_("Passwords do not match! Please check your input and try again."))
|
raise forms.ValidationError(_("Passwords do not match! Please check your input and try again."))
|
||||||
@ -271,14 +256,22 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
|||||||
qs = self._meta.model.objects.all()
|
qs = self._meta.model.objects.all()
|
||||||
|
|
||||||
username = self.cleaned_data.get("username")
|
username = self.cleaned_data.get("username")
|
||||||
if username and qs.filter(username__iexact=username).exists():
|
if (
|
||||||
raise forms.ValidationError(_("user with this username already exists"))
|
username and qs.filter(username__iexact=username).exists()
|
||||||
|
):
|
||||||
|
raise forms.ValidationError(
|
||||||
|
_("user with this username already exists")
|
||||||
|
)
|
||||||
|
|
||||||
return username
|
return username
|
||||||
|
|
||||||
|
|
||||||
class GroupForm(BootstrapMixin, forms.ModelForm):
|
class GroupForm(BootstrapMixin, forms.ModelForm):
|
||||||
users = DynamicModelMultipleChoiceField(label=_('Users'), required=False, queryset=get_user_model().objects.all())
|
users = DynamicModelMultipleChoiceField(
|
||||||
|
label=_('Users'),
|
||||||
|
required=False,
|
||||||
|
queryset=get_user_model().objects.all()
|
||||||
|
)
|
||||||
object_permissions = DynamicModelMultipleChoiceField(
|
object_permissions = DynamicModelMultipleChoiceField(
|
||||||
required=False,
|
required=False,
|
||||||
label=_('Permissions'),
|
label=_('Permissions'),
|
||||||
@ -287,17 +280,15 @@ class GroupForm(BootstrapMixin, forms.ModelForm):
|
|||||||
)
|
)
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, ('name',)),
|
(None, ('name', )),
|
||||||
(_('Users'), ('users',)),
|
(_('Users'), ('users', )),
|
||||||
(_('Permissions'), ('object_permissions',)),
|
(_('Permissions'), ('object_permissions', )),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = NetBoxGroup
|
model = NetBoxGroup
|
||||||
fields = [
|
fields = [
|
||||||
'name',
|
'name', 'users', 'object_permissions',
|
||||||
'users',
|
|
||||||
'object_permissions',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -323,47 +314,49 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
|
|||||||
label=_('Object types'),
|
label=_('Object types'),
|
||||||
queryset=ContentType.objects.all(),
|
queryset=ContentType.objects.all(),
|
||||||
limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES,
|
limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES,
|
||||||
widget=forms.SelectMultiple(attrs={'size': 6}),
|
widget=forms.SelectMultiple(attrs={'size': 6})
|
||||||
|
)
|
||||||
|
can_view = forms.BooleanField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
can_add = forms.BooleanField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
can_change = forms.BooleanField(
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
can_delete = forms.BooleanField(
|
||||||
|
required=False
|
||||||
)
|
)
|
||||||
can_view = forms.BooleanField(required=False)
|
|
||||||
can_add = forms.BooleanField(required=False)
|
|
||||||
can_change = forms.BooleanField(required=False)
|
|
||||||
can_delete = forms.BooleanField(required=False)
|
|
||||||
actions = SimpleArrayField(
|
actions = SimpleArrayField(
|
||||||
label=_('Additional actions'),
|
label=_('Additional actions'),
|
||||||
base_field=forms.CharField(),
|
base_field=forms.CharField(),
|
||||||
required=False,
|
required=False,
|
||||||
help_text=_('Actions granted in addition to those listed above'),
|
help_text=_('Actions granted in addition to those listed above')
|
||||||
|
)
|
||||||
|
users = DynamicModelMultipleChoiceField(
|
||||||
|
label=_('Users'),
|
||||||
|
required=False,
|
||||||
|
queryset=get_user_model().objects.all()
|
||||||
|
)
|
||||||
|
groups = DynamicModelMultipleChoiceField(
|
||||||
|
label=_('Groups'),
|
||||||
|
required=False,
|
||||||
|
queryset=Group.objects.all()
|
||||||
)
|
)
|
||||||
users = DynamicModelMultipleChoiceField(label=_('Users'), required=False, queryset=get_user_model().objects.all())
|
|
||||||
groups = DynamicModelMultipleChoiceField(label=_('Groups'), required=False, queryset=Group.objects.all())
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(
|
(None, ('name', 'description', 'enabled',)),
|
||||||
None,
|
|
||||||
(
|
|
||||||
'name',
|
|
||||||
'description',
|
|
||||||
'enabled',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(_('Actions'), ('can_view', 'can_add', 'can_change', 'can_delete', 'actions')),
|
(_('Actions'), ('can_view', 'can_add', 'can_change', 'can_delete', 'actions')),
|
||||||
(_('Objects'), ('object_types',)),
|
(_('Objects'), ('object_types', )),
|
||||||
(_('Assignment'), ('groups', 'users')),
|
(_('Assignment'), ('groups', 'users')),
|
||||||
(_('Constraints'), ('constraints',)),
|
(_('Constraints'), ('constraints',))
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ObjectPermission
|
model = ObjectPermission
|
||||||
fields = [
|
fields = [
|
||||||
'name',
|
'name', 'description', 'enabled', 'object_types', 'users', 'groups', 'constraints', 'actions',
|
||||||
'description',
|
|
||||||
'enabled',
|
|
||||||
'object_types',
|
|
||||||
'users',
|
|
||||||
'groups',
|
|
||||||
'constraints',
|
|
||||||
'actions',
|
|
||||||
]
|
]
|
||||||
help_texts = {
|
help_texts = {
|
||||||
'constraints': _(
|
'constraints': _(
|
||||||
@ -421,6 +414,6 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
|
|||||||
}
|
}
|
||||||
model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists()
|
model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists()
|
||||||
except FieldError as e:
|
except FieldError as e:
|
||||||
raise forms.ValidationError(
|
raise forms.ValidationError({
|
||||||
{'constraints': _('Invalid filter for {model}: {e}').format(model=model, e=e)}
|
'constraints': _('Invalid filter for {model}: {e}').format(model=model, e=e)
|
||||||
)
|
})
|
||||||
|
@ -328,11 +328,11 @@ class UserToken(Token):
|
|||||||
|
|
||||||
objects = RestrictedQuerySet.as_manager()
|
objects = RestrictedQuerySet.as_manager()
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Permissions
|
# Permissions
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ObjectPermission(models.Model):
|
class ObjectPermission(models.Model):
|
||||||
"""
|
"""
|
||||||
A mapping of view, add, change, and/or delete permission for users and/or groups to an arbitrary set of objects
|
A mapping of view, add, change, and/or delete permission for users and/or groups to an arbitrary set of objects
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
from django.conf import settings
|
|
||||||
import django_tables2 as tables
|
import django_tables2 as tables
|
||||||
|
|
||||||
from netbox.tables import NetBoxTable, columns
|
from netbox.tables import NetBoxTable, columns
|
||||||
@ -34,27 +33,18 @@ class TokenActionsColumn(columns.ActionsColumn):
|
|||||||
|
|
||||||
class TokenTable(NetBoxTable):
|
class TokenTable(NetBoxTable):
|
||||||
key = columns.TemplateColumn(
|
key = columns.TemplateColumn(
|
||||||
verbose_name='Key',
|
|
||||||
template_code=TOKEN
|
template_code=TOKEN
|
||||||
)
|
)
|
||||||
write_enabled = columns.BooleanColumn(
|
write_enabled = columns.BooleanColumn(
|
||||||
verbose_name='Write'
|
verbose_name='Write'
|
||||||
)
|
)
|
||||||
created = columns.DateColumn(
|
created = columns.DateColumn()
|
||||||
verbose_name='Created',
|
expired = columns.DateColumn()
|
||||||
)
|
last_used = columns.DateTimeColumn()
|
||||||
expired = columns.DateColumn(
|
|
||||||
verbose_name='Expired',
|
|
||||||
)
|
|
||||||
last_used = columns.DateTimeColumn(
|
|
||||||
verbose_name='Last used',
|
|
||||||
)
|
|
||||||
allowed_ips = columns.TemplateColumn(
|
allowed_ips = columns.TemplateColumn(
|
||||||
verbose_name='Allowed IPs',
|
|
||||||
template_code=ALLOWED_IPS
|
template_code=ALLOWED_IPS
|
||||||
)
|
)
|
||||||
actions = TokenActionsColumn(
|
actions = TokenActionsColumn(
|
||||||
verbose_name='Actions',
|
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
extra_buttons=COPY_BUTTON
|
extra_buttons=COPY_BUTTON
|
||||||
)
|
)
|
||||||
@ -102,24 +92,15 @@ class UserTokenTable(NetBoxTable):
|
|||||||
|
|
||||||
class UserTable(NetBoxTable):
|
class UserTable(NetBoxTable):
|
||||||
username = tables.Column(
|
username = tables.Column(
|
||||||
verbose_name='Username',
|
|
||||||
linkify=True
|
linkify=True
|
||||||
)
|
)
|
||||||
groups = columns.ManyToManyColumn(
|
groups = columns.ManyToManyColumn(
|
||||||
verbose_name='Groups',
|
|
||||||
linkify_item=('users:netboxgroup', {'pk': tables.A('pk')})
|
linkify_item=('users:netboxgroup', {'pk': tables.A('pk')})
|
||||||
)
|
)
|
||||||
is_active = columns.BooleanColumn(
|
is_active = columns.BooleanColumn()
|
||||||
verbose_name='Is active',
|
is_staff = columns.BooleanColumn()
|
||||||
)
|
is_superuser = columns.BooleanColumn()
|
||||||
is_staff = columns.BooleanColumn(
|
|
||||||
verbose_name='Is staff',
|
|
||||||
)
|
|
||||||
is_superuser = columns.BooleanColumn(
|
|
||||||
verbose_name='Is superuser',
|
|
||||||
)
|
|
||||||
actions = columns.ActionsColumn(
|
actions = columns.ActionsColumn(
|
||||||
verbose_name='Actions',
|
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -133,12 +114,8 @@ class UserTable(NetBoxTable):
|
|||||||
|
|
||||||
|
|
||||||
class GroupTable(NetBoxTable):
|
class GroupTable(NetBoxTable):
|
||||||
name = tables.Column(
|
name = tables.Column(linkify=True)
|
||||||
verbose_name='Name',
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
actions = columns.ActionsColumn(
|
actions = columns.ActionsColumn(
|
||||||
verbose_name='Actions',
|
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -151,42 +128,23 @@ class GroupTable(NetBoxTable):
|
|||||||
|
|
||||||
|
|
||||||
class ObjectPermissionTable(NetBoxTable):
|
class ObjectPermissionTable(NetBoxTable):
|
||||||
name = tables.Column(
|
name = tables.Column(linkify=True)
|
||||||
verbose_name='Name',
|
object_types = columns.ContentTypesColumn()
|
||||||
linkify=True
|
enabled = columns.BooleanColumn()
|
||||||
)
|
can_view = columns.BooleanColumn()
|
||||||
object_types = columns.ContentTypesColumn(
|
can_add = columns.BooleanColumn()
|
||||||
verbose_name='Object types',
|
can_change = columns.BooleanColumn()
|
||||||
)
|
can_delete = columns.BooleanColumn()
|
||||||
enabled = columns.BooleanColumn(
|
|
||||||
verbose_name='Enabled',
|
|
||||||
)
|
|
||||||
can_view = columns.BooleanColumn(
|
|
||||||
verbose_name='Can view',
|
|
||||||
)
|
|
||||||
can_add = columns.BooleanColumn(
|
|
||||||
verbose_name='Can add',
|
|
||||||
)
|
|
||||||
can_change = columns.BooleanColumn(
|
|
||||||
verbose_name='Can change',
|
|
||||||
)
|
|
||||||
can_delete = columns.BooleanColumn(
|
|
||||||
verbose_name='Can delete',
|
|
||||||
)
|
|
||||||
custom_actions = columns.ArrayColumn(
|
custom_actions = columns.ArrayColumn(
|
||||||
verbose_name='Custom actions',
|
|
||||||
accessor=tables.A('actions')
|
accessor=tables.A('actions')
|
||||||
)
|
)
|
||||||
users = columns.ManyToManyColumn(
|
users = columns.ManyToManyColumn(
|
||||||
verbose_name='Users',
|
|
||||||
linkify_item=('users:netboxuser', {'pk': tables.A('pk')})
|
linkify_item=('users:netboxuser', {'pk': tables.A('pk')})
|
||||||
)
|
)
|
||||||
groups = columns.ManyToManyColumn(
|
groups = columns.ManyToManyColumn(
|
||||||
verbose_name='Groups',
|
|
||||||
linkify_item=('users:netboxgroup', {'pk': tables.A('pk')})
|
linkify_item=('users:netboxgroup', {'pk': tables.A('pk')})
|
||||||
)
|
)
|
||||||
actions = columns.ActionsColumn(
|
actions = columns.ActionsColumn(
|
||||||
verbose_name='Actions',
|
|
||||||
actions=('edit', 'delete'),
|
actions=('edit', 'delete'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -2,9 +2,7 @@ import logging
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth import login as auth_login
|
from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash
|
||||||
from django.contrib.auth import logout as auth_logout
|
|
||||||
from django.contrib.auth import update_session_auth_hash
|
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib.auth.models import update_last_login
|
from django.contrib.auth.models import update_last_login
|
||||||
from django.contrib.auth.signals import user_logged_in
|
from django.contrib.auth.signals import user_logged_in
|
||||||
@ -16,38 +14,27 @@ from django.utils.decorators import method_decorator
|
|||||||
from django.utils.http import url_has_allowed_host_and_scheme, urlencode
|
from django.utils.http import url_has_allowed_host_and_scheme, urlencode
|
||||||
from django.views.decorators.debug import sensitive_post_parameters
|
from django.views.decorators.debug import sensitive_post_parameters
|
||||||
from django.views.generic import View
|
from django.views.generic import View
|
||||||
|
from social_core.backends.utils import load_backends
|
||||||
|
|
||||||
from extras.models import Bookmark, ObjectChange
|
from extras.models import Bookmark, ObjectChange
|
||||||
from extras.tables import BookmarkTable, ObjectChangeTable
|
from extras.tables import BookmarkTable, ObjectChangeTable
|
||||||
from social_core.backends.utils import load_backends
|
|
||||||
from utilities.forms import ConfirmationForm
|
|
||||||
from utilities.views import register_model_view
|
|
||||||
|
|
||||||
from netbox.authentication import get_auth_backend_display, get_saml_idps
|
from netbox.authentication import get_auth_backend_display, get_saml_idps
|
||||||
from netbox.config import get_config
|
from netbox.config import get_config
|
||||||
from netbox.views import generic
|
from netbox.views import generic
|
||||||
|
from utilities.forms import ConfirmationForm
|
||||||
|
from utilities.views import register_model_view
|
||||||
from . import filtersets, forms, tables
|
from . import filtersets, forms, tables
|
||||||
from .filtersets import TokenFilterSet, UserTokenFilterSet
|
from .models import Token, UserConfig, NetBoxGroup, NetBoxUser, ObjectPermission, UserToken
|
||||||
from .models import (
|
|
||||||
NetBoxGroup,
|
|
||||||
NetBoxUser,
|
|
||||||
ObjectPermission,
|
|
||||||
Token,
|
|
||||||
UserConfig,
|
|
||||||
UserToken,
|
|
||||||
)
|
|
||||||
from .tables import TokenTable, UserTokenTable
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Login/logout
|
# Login/logout
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class LoginView(View):
|
class LoginView(View):
|
||||||
"""
|
"""
|
||||||
Perform user authentication via the web UI.
|
Perform user authentication via the web UI.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
template_name = 'login.html'
|
template_name = 'login.html'
|
||||||
|
|
||||||
@method_decorator(sensitive_post_parameters('password'))
|
@method_decorator(sensitive_post_parameters('password'))
|
||||||
@ -89,14 +76,10 @@ class LoginView(View):
|
|||||||
logger = logging.getLogger('netbox.auth.login')
|
logger = logging.getLogger('netbox.auth.login')
|
||||||
return self.redirect_to_next(request, logger)
|
return self.redirect_to_next(request, logger)
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'auth_backends': self.get_auth_backends(request),
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'auth_backends': self.get_auth_backends(request),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
logger = logging.getLogger('netbox.auth.login')
|
logger = logging.getLogger('netbox.auth.login')
|
||||||
@ -127,14 +110,10 @@ class LoginView(View):
|
|||||||
else:
|
else:
|
||||||
logger.debug(f"Login form validation failed for username: {form['username'].value()}")
|
logger.debug(f"Login form validation failed for username: {form['username'].value()}")
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'auth_backends': self.get_auth_backends(request),
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'auth_backends': self.get_auth_backends(request),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def redirect_to_next(self, request, logger):
|
def redirect_to_next(self, request, logger):
|
||||||
data = request.POST if request.method == "POST" else request.GET
|
data = request.POST if request.method == "POST" else request.GET
|
||||||
@ -175,28 +154,23 @@ class LogoutView(View):
|
|||||||
# User profiles
|
# User profiles
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ProfileView(LoginRequiredMixin, View):
|
class ProfileView(LoginRequiredMixin, View):
|
||||||
template_name = 'users/account/profile.html'
|
template_name = 'users/account/profile.html'
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
|
||||||
# Compile changelog table
|
# Compile changelog table
|
||||||
changelog = (
|
changelog = ObjectChange.objects.valid_models().restrict(request.user, 'view').filter(
|
||||||
ObjectChange.objects.valid_models()
|
user=request.user
|
||||||
.restrict(request.user, 'view')
|
).prefetch_related(
|
||||||
.filter(user=request.user)
|
'changed_object_type'
|
||||||
.prefetch_related('changed_object_type')[:20]
|
)[:20]
|
||||||
)
|
|
||||||
changelog_table = ObjectChangeTable(changelog)
|
changelog_table = ObjectChangeTable(changelog)
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'changelog_table': changelog_table,
|
||||||
self.template_name,
|
'active_tab': 'profile',
|
||||||
{
|
})
|
||||||
'changelog_table': changelog_table,
|
|
||||||
'active_tab': 'profile',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class UserConfigView(LoginRequiredMixin, View):
|
class UserConfigView(LoginRequiredMixin, View):
|
||||||
@ -206,14 +180,10 @@ class UserConfigView(LoginRequiredMixin, View):
|
|||||||
userconfig = request.user.config
|
userconfig = request.user.config
|
||||||
form = forms.UserConfigForm(instance=userconfig)
|
form = forms.UserConfigForm(instance=userconfig)
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'active_tab': 'preferences',
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'active_tab': 'preferences',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
userconfig = request.user.config
|
userconfig = request.user.config
|
||||||
@ -225,14 +195,10 @@ class UserConfigView(LoginRequiredMixin, View):
|
|||||||
messages.success(request, "Your preferences have been updated.")
|
messages.success(request, "Your preferences have been updated.")
|
||||||
return redirect('users:preferences')
|
return redirect('users:preferences')
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'active_tab': 'preferences',
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'active_tab': 'preferences',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ChangePasswordView(LoginRequiredMixin, View):
|
class ChangePasswordView(LoginRequiredMixin, View):
|
||||||
@ -246,14 +212,10 @@ class ChangePasswordView(LoginRequiredMixin, View):
|
|||||||
|
|
||||||
form = forms.PasswordChangeForm(user=request.user)
|
form = forms.PasswordChangeForm(user=request.user)
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'active_tab': 'password',
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'active_tab': 'password',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
form = forms.PasswordChangeForm(user=request.user, data=request.POST)
|
form = forms.PasswordChangeForm(user=request.user, data=request.POST)
|
||||||
@ -263,21 +225,16 @@ class ChangePasswordView(LoginRequiredMixin, View):
|
|||||||
messages.success(request, "Your password has been changed successfully.")
|
messages.success(request, "Your password has been changed successfully.")
|
||||||
return redirect('users:profile')
|
return redirect('users:profile')
|
||||||
|
|
||||||
return render(
|
return render(request, self.template_name, {
|
||||||
request,
|
'form': form,
|
||||||
self.template_name,
|
'active_tab': 'change_password',
|
||||||
{
|
})
|
||||||
'form': form,
|
|
||||||
'active_tab': 'change_password',
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bookmarks
|
# Bookmarks
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class BookmarkListView(LoginRequiredMixin, generic.ObjectListView):
|
class BookmarkListView(LoginRequiredMixin, generic.ObjectListView):
|
||||||
table = BookmarkTable
|
table = BookmarkTable
|
||||||
template_name = 'users/account/bookmarks.html'
|
template_name = 'users/account/bookmarks.html'
|
||||||
@ -295,27 +252,26 @@ class BookmarkListView(LoginRequiredMixin, generic.ObjectListView):
|
|||||||
# API tokens
|
# API tokens
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class TokenListView(LoginRequiredMixin, View):
|
class TokenListView(LoginRequiredMixin, View):
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
|
||||||
tokens = Token.objects.filter(user=request.user)
|
tokens = Token.objects.filter(user=request.user)
|
||||||
table = tables.TokenTable(tokens)
|
table = tables.TokenTable(tokens)
|
||||||
table.configure(request)
|
table.configure(request)
|
||||||
|
|
||||||
return render(
|
return render(request, 'users/account/api_tokens.html', {
|
||||||
request,
|
'tokens': tokens,
|
||||||
'users/account/api_tokens.html',
|
'active_tab': 'api-tokens',
|
||||||
{
|
'table': table,
|
||||||
'tokens': tokens,
|
})
|
||||||
'active_tab': 'api-tokens',
|
|
||||||
'table': table,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(Token, 'edit')
|
@register_model_view(Token, 'edit')
|
||||||
class TokenEditView(LoginRequiredMixin, View):
|
class TokenEditView(LoginRequiredMixin, View):
|
||||||
|
|
||||||
def get(self, request, pk=None):
|
def get(self, request, pk=None):
|
||||||
|
|
||||||
if pk:
|
if pk:
|
||||||
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
||||||
else:
|
else:
|
||||||
@ -323,17 +279,14 @@ class TokenEditView(LoginRequiredMixin, View):
|
|||||||
|
|
||||||
form = forms.TokenForm(instance=token)
|
form = forms.TokenForm(instance=token)
|
||||||
|
|
||||||
return render(
|
return render(request, 'generic/object_edit.html', {
|
||||||
request,
|
'object': token,
|
||||||
'generic/object_edit.html',
|
'form': form,
|
||||||
{
|
'return_url': reverse('users:token_list'),
|
||||||
'object': token,
|
})
|
||||||
'form': form,
|
|
||||||
'return_url': reverse('users:token_list'),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request, pk=None):
|
def post(self, request, pk=None):
|
||||||
|
|
||||||
if pk:
|
if pk:
|
||||||
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
||||||
form = forms.TokenForm(request.POST, instance=token)
|
form = forms.TokenForm(request.POST, instance=token)
|
||||||
@ -342,6 +295,7 @@ class TokenEditView(LoginRequiredMixin, View):
|
|||||||
form = forms.TokenForm(request.POST)
|
form = forms.TokenForm(request.POST)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
token = form.save(commit=False)
|
token = form.save(commit=False)
|
||||||
token.user = request.user
|
token.user = request.user
|
||||||
token.save()
|
token.save()
|
||||||
@ -350,52 +304,43 @@ class TokenEditView(LoginRequiredMixin, View):
|
|||||||
messages.success(request, msg)
|
messages.success(request, msg)
|
||||||
|
|
||||||
if not pk and not settings.ALLOW_TOKEN_RETRIEVAL:
|
if not pk and not settings.ALLOW_TOKEN_RETRIEVAL:
|
||||||
return render(
|
return render(request, 'users/account/api_token.html', {
|
||||||
request,
|
'object': token,
|
||||||
'users/account/api_token.html',
|
'key': token.key,
|
||||||
{
|
'return_url': reverse('users:token_list'),
|
||||||
'object': token,
|
})
|
||||||
'key': token.key,
|
|
||||||
'return_url': reverse('users:token_list'),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
elif '_addanother' in request.POST:
|
elif '_addanother' in request.POST:
|
||||||
return redirect(request.path)
|
return redirect(request.path)
|
||||||
else:
|
else:
|
||||||
return redirect('users:token_list')
|
return redirect('users:token_list')
|
||||||
|
|
||||||
return render(
|
return render(request, 'generic/object_edit.html', {
|
||||||
request,
|
'object': token,
|
||||||
'generic/object_edit.html',
|
'form': form,
|
||||||
{
|
'return_url': reverse('users:token_list'),
|
||||||
'object': token,
|
'disable_addanother': not settings.ALLOW_TOKEN_RETRIEVAL
|
||||||
'form': form,
|
})
|
||||||
'return_url': reverse('users:token_list'),
|
|
||||||
'disable_addanother': not settings.ALLOW_TOKEN_RETRIEVAL,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(Token, 'delete')
|
@register_model_view(Token, 'delete')
|
||||||
class TokenDeleteView(LoginRequiredMixin, View):
|
class TokenDeleteView(LoginRequiredMixin, View):
|
||||||
|
|
||||||
def get(self, request, pk):
|
def get(self, request, pk):
|
||||||
|
|
||||||
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
||||||
initial_data = {
|
initial_data = {
|
||||||
'return_url': reverse('users:token_list'),
|
'return_url': reverse('users:token_list'),
|
||||||
}
|
}
|
||||||
form = ConfirmationForm(initial=initial_data)
|
form = ConfirmationForm(initial=initial_data)
|
||||||
|
|
||||||
return render(
|
return render(request, 'generic/object_delete.html', {
|
||||||
request,
|
'object': token,
|
||||||
'generic/object_delete.html',
|
'form': form,
|
||||||
{
|
'return_url': reverse('users:token_list'),
|
||||||
'object': token,
|
})
|
||||||
'form': form,
|
|
||||||
'return_url': reverse('users:token_list'),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
def post(self, request, pk):
|
def post(self, request, pk):
|
||||||
|
|
||||||
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
|
||||||
form = ConfirmationForm(request.POST)
|
form = ConfirmationForm(request.POST)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
@ -403,27 +348,22 @@ class TokenDeleteView(LoginRequiredMixin, View):
|
|||||||
messages.success(request, "Token deleted")
|
messages.success(request, "Token deleted")
|
||||||
return redirect('users:token_list')
|
return redirect('users:token_list')
|
||||||
|
|
||||||
return render(
|
return render(request, 'generic/object_delete.html', {
|
||||||
request,
|
'object': token,
|
||||||
'generic/object_delete.html',
|
'form': form,
|
||||||
{
|
'return_url': reverse('users:token_list'),
|
||||||
'object': token,
|
})
|
||||||
'form': form,
|
|
||||||
'return_url': reverse('users:token_list'),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# User Token
|
# User Token
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class UserTokenListView(generic.ObjectListView):
|
class UserTokenListView(generic.ObjectListView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
filterset = UserTokenFilterSet
|
filterset = filtersets.UserTokenFilterSet
|
||||||
filterset_form = forms.UserTokenFilterForm
|
filterset_form = forms.UserTokenFilterForm
|
||||||
table = UserTokenTable
|
table = tables.UserTokenTable
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(UserToken)
|
@register_model_view(UserToken)
|
||||||
@ -452,20 +392,19 @@ class UserTokenBulkImportView(generic.BulkImportView):
|
|||||||
|
|
||||||
class UserTokenBulkEditView(generic.BulkEditView):
|
class UserTokenBulkEditView(generic.BulkEditView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
table = TokenTable
|
table = tables.TokenTable
|
||||||
form = forms.UserTokenBulkEditForm
|
form = forms.UserTokenBulkEditForm
|
||||||
|
|
||||||
|
|
||||||
class UserTokenBulkDeleteView(generic.BulkDeleteView):
|
class UserTokenBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = UserToken.objects.all()
|
queryset = UserToken.objects.all()
|
||||||
table = UserTokenTable
|
table = tables.UserTokenTable
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Users
|
# Users
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class UserListView(generic.ObjectListView):
|
class UserListView(generic.ObjectListView):
|
||||||
queryset = NetBoxUser.objects.all()
|
queryset = NetBoxUser.objects.all()
|
||||||
filterset = filtersets.UserFilterSet
|
filterset = filtersets.UserFilterSet
|
||||||
@ -555,7 +494,6 @@ class GroupBulkDeleteView(generic.BulkDeleteView):
|
|||||||
filterset = filtersets.GroupFilterSet
|
filterset = filtersets.GroupFilterSet
|
||||||
table = tables.GroupTable
|
table = tables.GroupTable
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# ObjectPermissions
|
# ObjectPermissions
|
||||||
#
|
#
|
||||||
|
Loading…
Reference in New Issue
Block a user