mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
9856 merge feature
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.models import Group, User
|
||||
|
||||
# Unregister Django's built-in Group and User admin views
|
||||
admin.site.unregister(Group)
|
||||
admin.site.unregister(User)
|
||||
@@ -6,3 +6,14 @@ class UsersConfig(AppConfig):
|
||||
|
||||
def ready(self):
|
||||
import users.signals
|
||||
from .models import NetBoxGroup, ObjectPermission, Token, User, UserConfig
|
||||
from netbox.models.features import _register_features
|
||||
|
||||
# have to register these manually as the signal handler for class_prepared does
|
||||
# not get registered until after these models are loaded. Any models defined in
|
||||
# users.models should be registered here.
|
||||
_register_features(NetBoxGroup)
|
||||
_register_features(ObjectPermission)
|
||||
_register_features(Token)
|
||||
_register_features(User)
|
||||
_register_features(UserConfig)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
from .authentication import *
|
||||
from .bulk_edit import *
|
||||
from .bulk_import import *
|
||||
from .filtersets import *
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
from django.contrib.auth.forms import (
|
||||
AuthenticationForm,
|
||||
PasswordChangeForm as DjangoPasswordChangeForm,
|
||||
)
|
||||
|
||||
from utilities.forms import BootstrapMixin
|
||||
|
||||
__all__ = (
|
||||
'LoginForm',
|
||||
'PasswordChangeForm',
|
||||
)
|
||||
|
||||
|
||||
class LoginForm(BootstrapMixin, AuthenticationForm):
|
||||
"""
|
||||
Used to authenticate a user by username and password.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class PasswordChangeForm(BootstrapMixin, DjangoPasswordChangeForm):
|
||||
"""
|
||||
This form enables a user to change his or her own password.
|
||||
"""
|
||||
pass
|
||||
@@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from ipam.formfields import IPNetworkFormField
|
||||
from ipam.validators import prefix_validator
|
||||
from users.models import *
|
||||
from utilities.forms import BootstrapMixin, BulkEditForm
|
||||
from utilities.forms import BulkEditForm
|
||||
from utilities.forms.widgets import BulkEditNullBooleanSelect, DateTimePicker
|
||||
|
||||
__all__ = (
|
||||
@@ -15,9 +15,9 @@ __all__ = (
|
||||
)
|
||||
|
||||
|
||||
class UserBulkEditForm(BootstrapMixin, forms.Form):
|
||||
class UserBulkEditForm(forms.Form):
|
||||
pk = forms.ModelMultipleChoiceField(
|
||||
queryset=NetBoxUser.objects.all(),
|
||||
queryset=User.objects.all(),
|
||||
widget=forms.MultipleHiddenInput
|
||||
)
|
||||
first_name = forms.CharField(
|
||||
@@ -46,14 +46,14 @@ class UserBulkEditForm(BootstrapMixin, forms.Form):
|
||||
label=_('Superuser status')
|
||||
)
|
||||
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
fieldsets = (
|
||||
(None, ('first_name', 'last_name', 'is_active', 'is_staff', 'is_superuser')),
|
||||
)
|
||||
nullable_fields = ('first_name', 'last_name')
|
||||
|
||||
|
||||
class ObjectPermissionBulkEditForm(BootstrapMixin, forms.Form):
|
||||
class ObjectPermissionBulkEditForm(forms.Form):
|
||||
pk = forms.ModelMultipleChoiceField(
|
||||
queryset=ObjectPermission.objects.all(),
|
||||
widget=forms.MultipleHiddenInput
|
||||
|
||||
@@ -23,7 +23,7 @@ class GroupImportForm(CSVModelForm):
|
||||
class UserImportForm(CSVModelForm):
|
||||
|
||||
class Meta:
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
fields = (
|
||||
'username', 'first_name', 'last_name', 'email', 'password', 'is_staff',
|
||||
'is_active', 'is_superuser'
|
||||
|
||||
@@ -5,7 +5,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from netbox.forms import NetBoxModelFilterSetForm
|
||||
from netbox.forms.mixins import SavedFiltersMixin
|
||||
from users.models import NetBoxGroup, NetBoxUser, ObjectPermission, Token
|
||||
from users.models import NetBoxGroup, User, ObjectPermission, Token
|
||||
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm
|
||||
from utilities.forms.fields import DynamicModelMultipleChoiceField
|
||||
from utilities.forms.widgets import DateTimePicker
|
||||
@@ -26,7 +26,7 @@ class GroupFilterForm(NetBoxModelFilterSetForm):
|
||||
|
||||
|
||||
class UserFilterForm(NetBoxModelFilterSetForm):
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
fieldsets = (
|
||||
(None, ('q', 'filter_id',)),
|
||||
(_('Group'), ('group_id',)),
|
||||
|
||||
@@ -13,7 +13,6 @@ from ipam.validators import prefix_validator
|
||||
from netbox.preferences import PREFERENCES
|
||||
from users.constants import *
|
||||
from users.models import *
|
||||
from utilities.forms import BootstrapMixin
|
||||
from utilities.forms.fields import ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField
|
||||
from utilities.forms.widgets import DateTimePicker
|
||||
from utilities.permissions import qs_filter_from_constraints
|
||||
@@ -53,7 +52,7 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass):
|
||||
return super().__new__(mcs, name, bases, attrs)
|
||||
|
||||
|
||||
class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass):
|
||||
class UserConfigForm(forms.ModelForm, metaclass=UserConfigFormMetaclass):
|
||||
fieldsets = (
|
||||
(_('User Interface'), (
|
||||
'locale.language',
|
||||
@@ -109,7 +108,7 @@ class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMe
|
||||
]
|
||||
|
||||
|
||||
class UserTokenForm(BootstrapMixin, forms.ModelForm):
|
||||
class UserTokenForm(forms.ModelForm):
|
||||
key = forms.CharField(
|
||||
label=_('Key'),
|
||||
help_text=_(
|
||||
@@ -167,7 +166,7 @@ class TokenForm(UserTokenForm):
|
||||
}
|
||||
|
||||
|
||||
class UserForm(BootstrapMixin, forms.ModelForm):
|
||||
class UserForm(forms.ModelForm):
|
||||
password = forms.CharField(
|
||||
label=_('Password'),
|
||||
widget=forms.PasswordInput(),
|
||||
@@ -199,7 +198,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
fields = [
|
||||
'username', 'first_name', 'last_name', 'email', 'groups', 'object_permissions',
|
||||
'is_active', 'is_staff', 'is_superuser',
|
||||
@@ -214,9 +213,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
||||
|
||||
# Password fields are optional for existing Users
|
||||
self.fields['password'].required = False
|
||||
self.fields['password'].widget.attrs.pop('required')
|
||||
self.fields['confirm_password'].required = False
|
||||
self.fields['confirm_password'].widget.attrs.pop('required')
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
instance = super().save(*args, **kwargs)
|
||||
@@ -238,7 +235,7 @@ class UserForm(BootstrapMixin, forms.ModelForm):
|
||||
raise forms.ValidationError(_("Passwords do not match! Please check your input and try again."))
|
||||
|
||||
|
||||
class GroupForm(BootstrapMixin, forms.ModelForm):
|
||||
class GroupForm(forms.ModelForm):
|
||||
users = DynamicModelMultipleChoiceField(
|
||||
label=_('Users'),
|
||||
required=False,
|
||||
@@ -281,7 +278,7 @@ class GroupForm(BootstrapMixin, forms.ModelForm):
|
||||
return instance
|
||||
|
||||
|
||||
class ObjectPermissionForm(BootstrapMixin, forms.ModelForm):
|
||||
class ObjectPermissionForm(forms.ModelForm):
|
||||
object_types = ContentTypeMultipleChoiceField(
|
||||
label=_('Object types'),
|
||||
queryset=ContentType.objects.all(),
|
||||
|
||||
@@ -4,6 +4,7 @@ import django.contrib.postgres.fields
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import users.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
@@ -31,6 +32,33 @@ class Migration(migrations.Migration):
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='User',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('password', models.CharField(max_length=128)),
|
||||
('last_login', models.DateTimeField(blank=True, null=True)),
|
||||
('is_superuser', models.BooleanField(default=False)),
|
||||
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()])),
|
||||
('first_name', models.CharField(blank=True, max_length=150)),
|
||||
('last_name', models.CharField(blank=True, max_length=150)),
|
||||
('email', models.EmailField(blank=True, max_length=254)),
|
||||
('is_staff', models.BooleanField(default=False)),
|
||||
('is_active', models.BooleanField(default=True)),
|
||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now)),
|
||||
('groups', models.ManyToManyField(blank=True, related_name='user_set', related_query_name='user', to='auth.group')),
|
||||
('user_permissions', models.ManyToManyField(blank=True, related_name='user_set', related_query_name='user', to='auth.permission')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'user',
|
||||
'verbose_name_plural': 'users',
|
||||
'db_table': 'auth_user',
|
||||
'ordering': ('username',),
|
||||
},
|
||||
managers=[
|
||||
('objects', users.models.UserManager()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='UserConfig',
|
||||
fields=[
|
||||
|
||||
62
netbox/users/migrations/0002_squashed_0004.py
Normal file
62
netbox/users/migrations/0002_squashed_0004.py
Normal file
@@ -0,0 +1,62 @@
|
||||
import django.contrib.auth.models
|
||||
import django.contrib.postgres.fields
|
||||
from django.db import migrations, models
|
||||
import ipam.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
replaces = [
|
||||
('users', '0002_standardize_id_fields'),
|
||||
('users', '0003_token_allowed_ips_last_used'),
|
||||
('users', '0004_netboxgroup_netboxuser')
|
||||
]
|
||||
|
||||
dependencies = [
|
||||
('users', '0001_squashed_0011'),
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='objectpermission',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='token',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userconfig',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='token',
|
||||
name='allowed_ips',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=ipam.fields.IPNetworkField(), blank=True, null=True, size=None),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='token',
|
||||
name='last_used',
|
||||
field=models.DateTimeField(blank=True, null=True),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='NetBoxGroup',
|
||||
fields=[
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Group',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
'ordering': ('name',),
|
||||
},
|
||||
bases=('auth.group',),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.GroupManager()),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -1,27 +0,0 @@
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dcim', '0145_site_remove_deprecated_fields'),
|
||||
('users', '0001_squashed_0011'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='objectpermission',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='token',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='userconfig',
|
||||
name='id',
|
||||
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
|
||||
),
|
||||
]
|
||||
@@ -1,23 +0,0 @@
|
||||
import django.contrib.postgres.fields
|
||||
from django.db import migrations, models
|
||||
import ipam.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0002_standardize_id_fields'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='token',
|
||||
name='allowed_ips',
|
||||
field=django.contrib.postgres.fields.ArrayField(base_field=ipam.fields.IPNetworkField(), blank=True, null=True, size=None),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='token',
|
||||
name='last_used',
|
||||
field=models.DateTimeField(blank=True, null=True),
|
||||
),
|
||||
]
|
||||
@@ -1,50 +0,0 @@
|
||||
# Generated by Django 4.1.9 on 2023-06-06 18:15
|
||||
|
||||
import django.contrib.auth.models
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
('users', '0003_token_allowed_ips_last_used'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='NetBoxGroup',
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Group',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
},
|
||||
bases=('auth.group',),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.GroupManager()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='NetBoxUser',
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'User',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
},
|
||||
bases=('auth.user',),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.UserManager()),
|
||||
],
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='netboxgroup',
|
||||
options={'ordering': ('name',), 'verbose_name': 'Group'},
|
||||
),
|
||||
migrations.AlterModelOptions(
|
||||
name='netboxuser',
|
||||
options={'ordering': ('username',), 'verbose_name': 'User'},
|
||||
),
|
||||
]
|
||||
40
netbox/users/migrations/0005_alter_user_table.py
Normal file
40
netbox/users/migrations/0005_alter_user_table.py
Normal file
@@ -0,0 +1,40 @@
|
||||
# Generated by Django 5.0.1 on 2024-01-31 23:18
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def update_content_types(apps, schema_editor):
|
||||
ContentType = apps.get_model('contenttypes', 'ContentType')
|
||||
# Delete the new ContentTypes effected by the new models in the users app
|
||||
ContentType.objects.filter(app_label='users', model='user').delete()
|
||||
|
||||
# Update the app labels of the original ContentTypes for auth.User to ensure
|
||||
# that any foreign key references are preserved
|
||||
ContentType.objects.filter(app_label='auth', model='user').update(app_label='users')
|
||||
|
||||
netboxuser_ct = ContentType.objects.filter(app_label='users', model='netboxuser').first()
|
||||
if netboxuser_ct:
|
||||
user_ct = ContentType.objects.filter(app_label='users', model='user').first()
|
||||
CustomField = apps.get_model('extras', 'CustomField')
|
||||
CustomField.objects.filter(object_type_id=netboxuser_ct.id).update(object_type_id=user_ct.id)
|
||||
netboxuser_ct.delete()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0002_squashed_0004'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
# 0001_squashed had model with db_table=auth_user - now we switch it
|
||||
# to None to use the default Django resolution (users.user)
|
||||
migrations.AlterModelTable(
|
||||
name='user',
|
||||
table=None,
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=update_content_types,
|
||||
reverse_code=migrations.RunPython.noop
|
||||
),
|
||||
]
|
||||
@@ -2,7 +2,10 @@ import binascii
|
||||
import os
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import Group, GroupManager, User, UserManager
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import (
|
||||
AbstractUser, Group, GroupManager, User as DjangoUser, UserManager as DjangoUserManager
|
||||
)
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import MinLengthValidator
|
||||
@@ -23,9 +26,9 @@ from .constants import *
|
||||
|
||||
__all__ = (
|
||||
'NetBoxGroup',
|
||||
'NetBoxUser',
|
||||
'ObjectPermission',
|
||||
'Token',
|
||||
'User',
|
||||
'UserConfig',
|
||||
)
|
||||
|
||||
@@ -34,7 +37,7 @@ __all__ = (
|
||||
# Proxies for Django's User and Group models
|
||||
#
|
||||
|
||||
class NetBoxUserManager(UserManager.from_queryset(RestrictedQuerySet)):
|
||||
class UserManager(DjangoUserManager.from_queryset(RestrictedQuerySet)):
|
||||
pass
|
||||
|
||||
|
||||
@@ -42,20 +45,19 @@ class NetBoxGroupManager(GroupManager.from_queryset(RestrictedQuerySet)):
|
||||
pass
|
||||
|
||||
|
||||
class NetBoxUser(User):
|
||||
class User(AbstractUser):
|
||||
"""
|
||||
Proxy contrib.auth.models.User for the UI
|
||||
"""
|
||||
objects = NetBoxUserManager()
|
||||
objects = UserManager()
|
||||
|
||||
class Meta:
|
||||
proxy = True
|
||||
ordering = ('username',)
|
||||
verbose_name = _('user')
|
||||
verbose_name_plural = _('users')
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse('users:netboxuser', args=[self.pk])
|
||||
return reverse('users:user', args=[self.pk])
|
||||
|
||||
def clean(self):
|
||||
super().clean()
|
||||
@@ -91,7 +93,7 @@ class UserConfig(models.Model):
|
||||
This model stores arbitrary user-specific preferences in a JSON data structure.
|
||||
"""
|
||||
user = models.OneToOneField(
|
||||
to=User,
|
||||
to=get_user_model(),
|
||||
on_delete=models.CASCADE,
|
||||
related_name='config'
|
||||
)
|
||||
@@ -220,7 +222,6 @@ class UserConfig(models.Model):
|
||||
|
||||
|
||||
@receiver(post_save, sender=User)
|
||||
@receiver(post_save, sender=NetBoxUser)
|
||||
def create_userconfig(instance, created, raw=False, **kwargs):
|
||||
"""
|
||||
Automatically create a new UserConfig when a new User is created. Skip this if importing a user from a fixture.
|
||||
@@ -240,7 +241,7 @@ class Token(models.Model):
|
||||
It also supports setting an expiration time and toggling write ability.
|
||||
"""
|
||||
user = models.ForeignKey(
|
||||
to=User,
|
||||
to=get_user_model(),
|
||||
on_delete=models.CASCADE,
|
||||
related_name='tokens'
|
||||
)
|
||||
@@ -364,7 +365,7 @@ class ObjectPermission(models.Model):
|
||||
related_name='object_permissions'
|
||||
)
|
||||
users = models.ManyToManyField(
|
||||
to=User,
|
||||
to=get_user_model(),
|
||||
blank=True,
|
||||
related_name='object_permissions'
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ from django.utils.translation import gettext as _
|
||||
|
||||
from account.tables import UserTokenTable
|
||||
from netbox.tables import NetBoxTable, columns
|
||||
from users.models import NetBoxGroup, NetBoxUser, ObjectPermission, Token
|
||||
from users.models import NetBoxGroup, User, ObjectPermission, Token
|
||||
|
||||
__all__ = (
|
||||
'GroupTable',
|
||||
@@ -49,7 +49,7 @@ class UserTable(NetBoxTable):
|
||||
)
|
||||
|
||||
class Meta(NetBoxTable.Meta):
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
fields = (
|
||||
'pk', 'id', 'username', 'first_name', 'last_name', 'email', 'groups', 'is_active', 'is_staff',
|
||||
'is_superuser', 'last_login',
|
||||
@@ -103,7 +103,7 @@ class ObjectPermissionTable(NetBoxTable):
|
||||
)
|
||||
users = columns.ManyToManyColumn(
|
||||
verbose_name=_('Users'),
|
||||
linkify_item=('users:netboxuser', {'pk': tables.A('pk')})
|
||||
linkify_item=('users:user', {'pk': tables.A('pk')})
|
||||
)
|
||||
groups = columns.ManyToManyColumn(
|
||||
verbose_name=_('Groups'),
|
||||
|
||||
@@ -264,9 +264,9 @@ class ObjectPermissionTest(
|
||||
|
||||
for i in range(3):
|
||||
objectpermission = ObjectPermission(
|
||||
name=f'Permission {i+1}',
|
||||
name=f'Permission {i + 1}',
|
||||
actions=['view', 'add', 'change', 'delete'],
|
||||
constraints={'name': f'TEST{i+1}'}
|
||||
constraints={'name': f'TEST{i + 1}'}
|
||||
)
|
||||
objectpermission.save()
|
||||
objectpermission.object_types.add(object_type)
|
||||
|
||||
@@ -15,7 +15,7 @@ class UserTestCase(
|
||||
ViewTestCases.BulkEditObjectsViewTestCase,
|
||||
ViewTestCases.BulkDeleteObjectsViewTestCase,
|
||||
):
|
||||
model = NetBoxUser
|
||||
model = User
|
||||
maxDiff = None
|
||||
validation_excluded_fields = ['password']
|
||||
|
||||
@@ -27,11 +27,11 @@ class UserTestCase(
|
||||
def setUpTestData(cls):
|
||||
|
||||
users = (
|
||||
NetBoxUser(username='username1', first_name='first1', last_name='last1', email='user1@foo.com', password='pass1xxx'),
|
||||
NetBoxUser(username='username2', first_name='first2', last_name='last2', email='user2@foo.com', password='pass2xxx'),
|
||||
NetBoxUser(username='username3', first_name='first3', last_name='last3', email='user3@foo.com', password='pass3xxx'),
|
||||
User(username='username1', first_name='first1', last_name='last1', email='user1@foo.com', password='pass1xxx'),
|
||||
User(username='username2', first_name='first2', last_name='last2', email='user2@foo.com', password='pass2xxx'),
|
||||
User(username='username3', first_name='first3', last_name='last3', email='user3@foo.com', password='pass3xxx'),
|
||||
)
|
||||
NetBoxUser.objects.bulk_create(users)
|
||||
User.objects.bulk_create(users)
|
||||
|
||||
cls.form_data = {
|
||||
'username': 'usernamex',
|
||||
|
||||
@@ -15,12 +15,12 @@ urlpatterns = [
|
||||
path('tokens/<int:pk>/', include(get_model_urls('users', 'token'))),
|
||||
|
||||
# Users
|
||||
path('users/', views.UserListView.as_view(), name='netboxuser_list'),
|
||||
path('users/add/', views.UserEditView.as_view(), name='netboxuser_add'),
|
||||
path('users/edit/', views.UserBulkEditView.as_view(), name='netboxuser_bulk_edit'),
|
||||
path('users/import/', views.UserBulkImportView.as_view(), name='netboxuser_import'),
|
||||
path('users/delete/', views.UserBulkDeleteView.as_view(), name='netboxuser_bulk_delete'),
|
||||
path('users/<int:pk>/', include(get_model_urls('users', 'netboxuser'))),
|
||||
path('users/', views.UserListView.as_view(), name='user_list'),
|
||||
path('users/add/', views.UserEditView.as_view(), name='user_add'),
|
||||
path('users/edit/', views.UserBulkEditView.as_view(), name='user_bulk_edit'),
|
||||
path('users/import/', views.UserBulkImportView.as_view(), name='user_import'),
|
||||
path('users/delete/', views.UserBulkDeleteView.as_view(), name='user_bulk_delete'),
|
||||
path('users/<int:pk>/', include(get_model_urls('users', 'user'))),
|
||||
|
||||
# Groups
|
||||
path('groups/', views.GroupListView.as_view(), name='netboxgroup_list'),
|
||||
|
||||
@@ -5,7 +5,7 @@ from extras.tables import ObjectChangeTable
|
||||
from netbox.views import generic
|
||||
from utilities.views import register_model_view
|
||||
from . import filtersets, forms, tables
|
||||
from .models import NetBoxGroup, NetBoxUser, ObjectPermission, Token
|
||||
from .models import NetBoxGroup, User, ObjectPermission, Token
|
||||
|
||||
|
||||
#
|
||||
@@ -56,15 +56,15 @@ class TokenBulkDeleteView(generic.BulkDeleteView):
|
||||
#
|
||||
|
||||
class UserListView(generic.ObjectListView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
filterset = filtersets.UserFilterSet
|
||||
filterset_form = forms.UserFilterForm
|
||||
table = tables.UserTable
|
||||
|
||||
|
||||
@register_model_view(NetBoxUser)
|
||||
@register_model_view(User)
|
||||
class UserView(generic.ObjectView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
template_name = 'users/user.html'
|
||||
|
||||
def get_extra_context(self, request, instance):
|
||||
@@ -76,31 +76,31 @@ class UserView(generic.ObjectView):
|
||||
}
|
||||
|
||||
|
||||
@register_model_view(NetBoxUser, 'edit')
|
||||
@register_model_view(User, 'edit')
|
||||
class UserEditView(generic.ObjectEditView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
form = forms.UserForm
|
||||
|
||||
|
||||
@register_model_view(NetBoxUser, 'delete')
|
||||
@register_model_view(User, 'delete')
|
||||
class UserDeleteView(generic.ObjectDeleteView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
|
||||
|
||||
class UserBulkEditView(generic.BulkEditView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
filterset = filtersets.UserFilterSet
|
||||
table = tables.UserTable
|
||||
form = forms.UserBulkEditForm
|
||||
|
||||
|
||||
class UserBulkImportView(generic.BulkImportView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
model_form = forms.UserImportForm
|
||||
|
||||
|
||||
class UserBulkDeleteView(generic.BulkDeleteView):
|
||||
queryset = NetBoxUser.objects.all()
|
||||
queryset = User.objects.all()
|
||||
filterset = filtersets.UserFilterSet
|
||||
table = tables.UserTable
|
||||
|
||||
|
||||
Reference in New Issue
Block a user