Revert extraneous formatting changes

This commit is contained in:
Jeremy Stretch 2023-07-25 10:11:37 -04:00
parent ff338002e4
commit 43d2ba6fc8
5 changed files with 242 additions and 308 deletions

View File

@ -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
)

View File

@ -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)
) })

View File

@ -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

View File

@ -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'),
) )

View File

@ -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
# #