Closes #17048: Replace all calls to get_user_model() with direct imports of User

This commit is contained in:
Jeremy Stretch 2024-07-31 16:45:07 -04:00
parent 1a6406632a
commit c51e91dddd
37 changed files with 79 additions and 132 deletions

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -7,6 +6,7 @@ import django_filters
from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet
from netbox.utils import get_data_backend_choices from netbox.utils import get_data_backend_choices
from users.models import User
from utilities.filters import ContentTypeFilter from utilities.filters import ContentTypeFilter
from .choices import * from .choices import *
from .models import * from .models import *
@ -141,12 +141,12 @@ class ObjectChangeFilterSet(BaseFilterSet):
queryset=ContentType.objects.all() queryset=ContentType.objects.all()
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username', field_name='user__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User name'), label=_('User name'),
) )

View File

@ -1,5 +1,4 @@
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.choices import * from core.choices import *
@ -7,6 +6,7 @@ from core.models import *
from netbox.forms import NetBoxModelFilterSetForm from netbox.forms import NetBoxModelFilterSetForm
from netbox.forms.mixins import SavedFiltersMixin from netbox.forms.mixins import SavedFiltersMixin
from netbox.utils import get_data_backend_choices from netbox.utils import get_data_backend_choices
from users.models import User
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
from utilities.forms.fields import ( from utilities.forms.fields import (
ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField,
@ -121,7 +121,7 @@ class JobFilterForm(SavedFiltersMixin, FilterForm):
widget=DateTimePicker() widget=DateTimePicker()
) )
user = DynamicModelMultipleChoiceField( user = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )
@ -150,7 +150,7 @@ class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm):
required=False required=False
) )
user_id = DynamicModelMultipleChoiceField( user_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )

View File

@ -5,10 +5,10 @@ import sys
from django import get_version from django import get_version
from django.apps import apps from django.apps import apps
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from core.models import ObjectType from core.models import ObjectType
from users.models import User
APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless') APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless')
@ -61,7 +61,7 @@ class Command(BaseCommand):
# Additional objects to include # Additional objects to include
namespace['ObjectType'] = ObjectType namespace['ObjectType'] = ObjectType
namespace['User'] = get_user_model() namespace['User'] = User
# Load convenience commands # Load convenience commands
namespace.update({ namespace.update({

View File

@ -1,5 +1,4 @@
import django_filters import django_filters
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
@ -16,6 +15,7 @@ from netbox.filtersets import (
) )
from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet
from tenancy.models import * from tenancy.models import *
from users.models import User
from utilities.filters import ( from utilities.filters import (
ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter, ContentTypeFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, MultiValueWWNFilter,
NumericArrayFilter, TreeNodeMultipleChoiceFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter,
@ -497,12 +497,12 @@ class RackReservationFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
label=_('Location (slug)'), label=_('Location (slug)'),
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username', field_name='user__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )

View File

@ -1,6 +1,5 @@
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.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from timezone_field import TimeZoneFormField from timezone_field import TimeZoneFormField
@ -11,6 +10,7 @@ from extras.models import ConfigTemplate
from ipam.models import ASN, VLAN, VLANGroup, VRF from ipam.models import ASN, VLAN, VLANGroup, VRF
from netbox.forms import NetBoxModelBulkEditForm from netbox.forms import NetBoxModelBulkEditForm
from tenancy.models import Tenant from tenancy.models import Tenant
from users.models import User
from utilities.forms import BulkEditForm, add_blank_choice, form_from_model from utilities.forms import BulkEditForm, add_blank_choice, form_from_model
from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.forms.rendering import FieldSet, InlineFields from utilities.forms.rendering import FieldSet, InlineFields
@ -459,9 +459,7 @@ class RackBulkEditForm(NetBoxModelBulkEditForm):
class RackReservationBulkEditForm(NetBoxModelBulkEditForm): class RackReservationBulkEditForm(NetBoxModelBulkEditForm):
user = forms.ModelChoiceField( user = forms.ModelChoiceField(
label=_('User'), label=_('User'),
queryset=get_user_model().objects.order_by( queryset=User.objects.order_by('username'),
'username'
),
required=False required=False
) )
tenant = DynamicModelChoiceField( tenant = DynamicModelChoiceField(

View File

@ -1,5 +1,4 @@
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from dcim.choices import * from dcim.choices import *
@ -10,6 +9,7 @@ from extras.models import ConfigTemplate
from ipam.models import ASN, VRF from ipam.models import ASN, VRF
from netbox.forms import NetBoxModelFilterSetForm from netbox.forms import NetBoxModelFilterSetForm
from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
from users.models import User
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField
from utilities.forms.rendering import FieldSet from utilities.forms.rendering import FieldSet
@ -448,7 +448,7 @@ class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
label=_('Rack') label=_('Rack')
) )
user_id = DynamicModelMultipleChoiceField( user_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )

View File

@ -1,5 +1,4 @@
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from timezone_field import TimeZoneFormField from timezone_field import TimeZoneFormField
@ -11,6 +10,7 @@ from extras.models import ConfigTemplate
from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VRF from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VRF
from netbox.forms import NetBoxModelForm from netbox.forms import NetBoxModelForm
from tenancy.forms import TenancyForm from tenancy.forms import TenancyForm
from users.models import User
from utilities.forms import add_blank_choice, get_field_value from utilities.forms import add_blank_choice, get_field_value
from utilities.forms.fields import ( from utilities.forms.fields import (
CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SlugField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, NumericArrayField, SlugField,
@ -311,9 +311,7 @@ class RackReservationForm(TenancyForm, NetBoxModelForm):
) )
user = forms.ModelChoiceField( user = forms.ModelChoiceField(
label=_('User'), label=_('User'),
queryset=get_user_model().objects.order_by( queryset=User.objects.order_by('username')
'username'
)
) )
comments = CommentField() comments = CommentField()

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.test import override_settings from django.test import override_settings
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -11,15 +10,13 @@ from extras.models import ConfigTemplate
from ipam.models import ASN, RIR, VLAN, VRF from ipam.models import ASN, RIR, VLAN, VRF
from netbox.api.serializers import GenericObjectSerializer from netbox.api.serializers import GenericObjectSerializer
from tenancy.models import Tenant from tenancy.models import Tenant
from users.models import User
from utilities.testing import APITestCase, APIViewTestCases, create_test_device from utilities.testing import APITestCase, APIViewTestCases, create_test_device
from virtualization.models import Cluster, ClusterType from virtualization.models import Cluster, ClusterType
from wireless.choices import WirelessChannelChoices from wireless.choices import WirelessChannelChoices
from wireless.models import WirelessLAN from wireless.models import WirelessLAN
User = get_user_model()
class AppTest(APITestCase): class AppTest(APITestCase):
def test_root(self): def test_root(self):

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.test import TestCase from django.test import TestCase
from circuits.models import Circuit, CircuitTermination, CircuitType, Provider from circuits.models import Circuit, CircuitTermination, CircuitType, Provider
@ -8,12 +7,11 @@ from dcim.models import *
from ipam.models import ASN, IPAddress, RIR, VRF from ipam.models import ASN, IPAddress, RIR, VRF
from netbox.choices import ColorChoices from netbox.choices import ColorChoices
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
from users.models import User
from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from utilities.testing import ChangeLoggedFilterSetTests, create_test_device
from virtualization.models import Cluster, ClusterType, ClusterGroup from virtualization.models import Cluster, ClusterType, ClusterGroup
from wireless.choices import WirelessChannelChoices, WirelessRoleChoices from wireless.choices import WirelessChannelChoices, WirelessRoleChoices
User = get_user_model()
class DeviceComponentFilterSetTests: class DeviceComponentFilterSetTests:

View File

@ -2,7 +2,6 @@ from decimal import Decimal
from zoneinfo import ZoneInfo from zoneinfo import ZoneInfo
import yaml import yaml
from django.contrib.auth import get_user_model
from django.test import override_settings from django.test import override_settings
from django.urls import reverse from django.urls import reverse
from netaddr import EUI from netaddr import EUI
@ -13,11 +12,10 @@ from dcim.models import *
from ipam.models import ASN, RIR, VLAN, VRF from ipam.models import ASN, RIR, VLAN, VRF
from netbox.choices import CSVDelimiterChoices, ImportFormatChoices from netbox.choices import CSVDelimiterChoices, ImportFormatChoices
from tenancy.models import Tenant from tenancy.models import Tenant
from users.models import User
from utilities.testing import ViewTestCases, create_tags, create_test_device, post_data from utilities.testing import ViewTestCases, create_tags, create_test_device, post_data
from wireless.models import WirelessLAN from wireless.models import WirelessLAN
User = get_user_model()
class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase): class RegionTestCase(ViewTestCases.OrganizationalObjectViewTestCase):
model = Region model = Region

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
@ -8,6 +7,7 @@ from extras.choices import *
from extras.models import JournalEntry from extras.models import JournalEntry
from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.fields import ChoiceField, ContentTypeField
from netbox.api.serializers import NetBoxModelSerializer from netbox.api.serializers import NetBoxModelSerializer
from users.models import User
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
__all__ = ( __all__ = (
@ -22,7 +22,7 @@ class JournalEntrySerializer(NetBoxModelSerializer):
assigned_object = serializers.SerializerMethodField(read_only=True) assigned_object = serializers.SerializerMethodField(read_only=True)
created_by = serializers.PrimaryKeyRelatedField( created_by = serializers.PrimaryKeyRelatedField(
allow_null=True, allow_null=True,
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
default=serializers.CurrentUserDefault() default=serializers.CurrentUserDefault()
) )

View File

@ -1,9 +1,7 @@
from collections import defaultdict
import logging import logging
from collections import defaultdict from collections import defaultdict
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils import timezone from django.utils import timezone
from django.utils.module_loading import import_string from django.utils.module_loading import import_string
@ -14,6 +12,7 @@ from core.events import *
from netbox.config import get_config from netbox.config import get_config
from netbox.constants import RQ_QUEUE_DEFAULT from netbox.constants import RQ_QUEUE_DEFAULT
from netbox.registry import registry from netbox.registry import registry
from users.models import User
from utilities.api import get_serializer_for_model from utilities.api import get_serializer_for_model
from utilities.rqworker import get_rq_retry from utilities.rqworker import get_rq_retry
from utilities.serialization import serialize_object from utilities.serialization import serialize_object
@ -83,7 +82,7 @@ def enqueue_event(queue, instance, user, request_id, event_type):
def process_event_rules(event_rules, object_type, event_type, data, username=None, snapshots=None, request_id=None): def process_event_rules(event_rules, object_type, event_type, data, username=None, snapshots=None, request_id=None):
user = get_user_model().objects.get(username=username) if username else None user = User.objects.get(username=username) if username else None
for event_rule in event_rules: for event_rule in event_rules:

View File

@ -1,5 +1,4 @@
import django_filters import django_filters
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -284,12 +283,12 @@ class SavedFilterFilterSet(ChangeLoggedModelFilterSet):
field_name='object_types' field_name='object_types'
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username', field_name='user__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )
@ -328,12 +327,12 @@ class BookmarkFilterSet(BaseFilterSet):
object_type_id = MultiValueNumberFilter() object_type_id = MultiValueNumberFilter()
object_type = ContentTypeFilter() object_type = ContentTypeFilter()
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username', field_name='user__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )
@ -410,12 +409,12 @@ class JournalEntryFilterSet(NetBoxModelFilterSet):
queryset=ContentType.objects.all() queryset=ContentType.objects.all()
) )
created_by_id = django_filters.ModelMultipleChoiceFilter( created_by_id = django_filters.ModelMultipleChoiceFilter(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
created_by = django_filters.ModelMultipleChoiceFilter( created_by = django_filters.ModelMultipleChoiceFilter(
field_name='created_by__username', field_name='created_by__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )

View File

@ -1,5 +1,4 @@
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from core.models import ObjectType, DataFile, DataSource from core.models import ObjectType, DataFile, DataSource
@ -10,7 +9,7 @@ from netbox.events import get_event_type_choices
from netbox.forms.base import NetBoxModelFilterSetForm from netbox.forms.base import NetBoxModelFilterSetForm
from netbox.forms.mixins import SavedFiltersMixin from netbox.forms.mixins import SavedFiltersMixin
from tenancy.models import Tenant, TenantGroup from tenancy.models import Tenant, TenantGroup
from users.models import Group from users.models import Group, User
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice
from utilities.forms.fields import ( from utilities.forms.fields import (
ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, TagFilterField,
@ -453,7 +452,7 @@ class JournalEntryFilterForm(NetBoxModelFilterSetForm):
widget=DateTimePicker() widget=DateTimePicker()
) )
created_by_id = DynamicModelMultipleChoiceField( created_by_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )
@ -472,7 +471,7 @@ class JournalEntryFilterForm(NetBoxModelFilterSetForm):
class NotificationGroupFilterForm(SavedFiltersMixin, FilterForm): class NotificationGroupFilterForm(SavedFiltersMixin, FilterForm):
user_id = DynamicModelMultipleChoiceField( user_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )

View File

@ -3,12 +3,11 @@ import logging
import sys import sys
import uuid import uuid
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand, CommandError from django.core.management.base import BaseCommand, CommandError
from django.utils.module_loading import import_string
from extras.jobs import ScriptJob from extras.jobs import ScriptJob
from extras.scripts import get_module_and_script from extras.scripts import get_module_and_script
from users.models import User
from utilities.request import NetBoxFakeRequest from utilities.request import NetBoxFakeRequest
@ -28,8 +27,6 @@ class Command(BaseCommand):
parser.add_argument('script', help="Script to run") parser.add_argument('script', help="Script to run")
def handle(self, *args, **options): def handle(self, *args, **options):
User = get_user_model()
# Params # Params
script = options['script'] script = options['script']
loglevel = options['loglevel'] loglevel = options['loglevel']

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -11,7 +10,7 @@ __all__ = (
class Dashboard(models.Model): class Dashboard(models.Model):
user = models.OneToOneField( user = models.OneToOneField(
to=get_user_model(), to='users.User',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='dashboard' related_name='dashboard'
) )

View File

@ -1,6 +1,5 @@
import logging import logging
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.fields import GenericForeignKey
from django.db import models, transaction from django.db import models, transaction
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -34,7 +33,7 @@ class Branch(ChangeLoggedModel):
blank=True blank=True
) )
user = models.ForeignKey( user = models.ForeignKey(
to=get_user_model(), to='users.User',
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
blank=True, blank=True,
null=True null=True

View File

@ -2,7 +2,6 @@ import logging
from collections import defaultdict from collections import defaultdict
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend, RemoteUserBackend as _RemoteUserBackend from django.contrib.auth.backends import ModelBackend, RemoteUserBackend as _RemoteUserBackend
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
@ -10,14 +9,12 @@ from django.db.models import Q
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from users.constants import CONSTRAINT_TOKEN_USER from users.constants import CONSTRAINT_TOKEN_USER
from users.models import Group, ObjectPermission from users.models import Group, ObjectPermission, User
from utilities.permissions import ( from utilities.permissions import (
permission_is_exempt, qs_filter_from_constraints, resolve_permission, resolve_permission_type, permission_is_exempt, qs_filter_from_constraints, resolve_permission, resolve_permission_type,
) )
from .misc import _mirror_groups from .misc import _mirror_groups
UserModel = get_user_model()
AUTH_BACKEND_ATTRS = { AUTH_BACKEND_ATTRS = {
# backend name: title, MDI icon name # backend name: title, MDI icon name
'amazon': ('Amazon AWS', 'aws'), 'amazon': ('Amazon AWS', 'aws'),
@ -218,15 +215,15 @@ class RemoteUserBackend(_RemoteUserBackend):
# instead we use get_or_create when creating unknown users since it has # instead we use get_or_create when creating unknown users since it has
# built-in safeguards for multiple threads. # built-in safeguards for multiple threads.
if self.create_unknown_user: if self.create_unknown_user:
user, created = UserModel._default_manager.get_or_create(**{ user, created = User._default_manager.get_or_create(**{
UserModel.USERNAME_FIELD: username User.USERNAME_FIELD: username
}) })
if created: if created:
user = self.configure_user(request, user) user = self.configure_user(request, user)
else: else:
try: try:
user = UserModel._default_manager.get_by_natural_key(username) user = User._default_manager.get_by_natural_key(username)
except UserModel.DoesNotExist: except User.DoesNotExist:
pass pass
if self.user_can_authenticate(user): if self.user_can_authenticate(user):
if settings.REMOTE_AUTH_GROUP_SYNC_ENABLED: if settings.REMOTE_AUTH_GROUP_SYNC_ENABLED:

View File

@ -1,7 +1,6 @@
import datetime import datetime
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.test import Client from django.test import Client
from django.test.utils import override_settings from django.test.utils import override_settings
from django.urls import reverse from django.urls import reverse
@ -11,14 +10,11 @@ from rest_framework.test import APIClient
from core.models import ObjectType from core.models import ObjectType
from dcim.models import Site from dcim.models import Site
from ipam.models import Prefix from ipam.models import Prefix
from users.models import Group, ObjectPermission, Token from users.models import Group, ObjectPermission, Token, User
from utilities.testing import TestCase from utilities.testing import TestCase
from utilities.testing.api import APITestCase from utilities.testing.api import APITestCase
User = get_user_model()
class TokenAuthenticationTestCase(APITestCase): class TokenAuthenticationTestCase(APITestCase):
@override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*']) @override_settings(LOGIN_REQUIRED=True, EXEMPT_VIEW_PERMISSIONS=['*'])

View File

@ -1,12 +1,11 @@
from django.contrib.auth import get_user_model
from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
from core.models import ObjectType from core.models import ObjectType
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
from netbox.api.serializers import WritableNestedSerializer from netbox.api.serializers import WritableNestedSerializer
from users.models import Group, ObjectPermission, Token from users.models import Group, ObjectPermission, Token, User
__all__ = [ __all__ = [
'NestedGroupSerializer', 'NestedGroupSerializer',
@ -26,7 +25,7 @@ class NestedGroupSerializer(WritableNestedSerializer):
class NestedUserSerializer(WritableNestedSerializer): class NestedUserSerializer(WritableNestedSerializer):
class Meta: class Meta:
model = get_user_model() model = User
fields = ['id', 'url', 'display_url', 'display', 'username'] fields = ['id', 'url', 'display_url', 'display', 'username']
@extend_schema_field(OpenApiTypes.STR) @extend_schema_field(OpenApiTypes.STR)

View File

@ -1,11 +1,11 @@
from django.contrib.auth import get_user_model, password_validation from django.contrib.auth import password_validation
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from rest_framework import serializers from rest_framework import serializers
from netbox.api.fields import SerializedPKRelatedField from netbox.api.fields import SerializedPKRelatedField
from netbox.api.serializers import ValidatedModelSerializer from netbox.api.serializers import ValidatedModelSerializer
from users.models import Group, ObjectPermission from users.models import Group, ObjectPermission, User
from .permissions import ObjectPermissionSerializer from .permissions import ObjectPermissionSerializer
__all__ = ( __all__ = (
@ -49,7 +49,7 @@ class UserSerializer(ValidatedModelSerializer):
) )
class Meta: class Meta:
model = get_user_model() model = User
fields = ( fields = (
'id', 'url', 'display_url', 'display', 'username', 'password', 'first_name', 'last_name', 'email', 'id', 'url', 'display_url', 'display', 'username', 'password', 'first_name', 'last_name', 'email',
'is_staff', 'is_active', 'date_joined', 'last_login', 'groups', 'permissions', 'is_staff', 'is_active', 'date_joined', 'last_login', 'groups', 'permissions',

View File

@ -1,6 +1,5 @@
import logging import logging
from django.contrib.auth import get_user_model
from django.db.models import Count from django.db.models import Count
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
@ -13,7 +12,7 @@ from rest_framework.viewsets import ViewSet
from netbox.api.viewsets import NetBoxModelViewSet from netbox.api.viewsets import NetBoxModelViewSet
from users import filtersets from users import filtersets
from users.models import Group, ObjectPermission, Token, UserConfig from users.models import Group, ObjectPermission, Token, User, UserConfig
from utilities.data import deepmerge from utilities.data import deepmerge
from utilities.querysets import RestrictedQuerySet from utilities.querysets import RestrictedQuerySet
from . import serializers from . import serializers
@ -32,7 +31,7 @@ class UsersRootView(APIRootView):
# #
class UserViewSet(NetBoxModelViewSet): class UserViewSet(NetBoxModelViewSet):
queryset = RestrictedQuerySet(model=get_user_model()).order_by('username') queryset = RestrictedQuerySet(model=User).order_by('username')
serializer_class = serializers.UserSerializer serializer_class = serializers.UserSerializer
filterset_class = filtersets.UserFilterSet filterset_class = filtersets.UserFilterSet

View File

@ -1,13 +1,12 @@
import django_filters import django_filters
from django.contrib.auth import get_user_model
from django.db.models import Q from django.db.models import Q
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from core.models import ObjectType from core.models import ObjectType
from extras.models import NotificationGroup from extras.models import NotificationGroup
from netbox.filtersets import BaseFilterSet from netbox.filtersets import BaseFilterSet
from users.models import Group, ObjectPermission, Token from users.models import Group, ObjectPermission, Token, User
from utilities.filters import ContentTypeFilter from utilities.filters import ContentTypeFilter
__all__ = ( __all__ = (
@ -25,7 +24,7 @@ class GroupFilterSet(BaseFilterSet):
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
field_name='user', field_name='user',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User (ID)'), label=_('User (ID)'),
) )
permission_id = django_filters.ModelMultipleChoiceFilter( permission_id = django_filters.ModelMultipleChoiceFilter(
@ -80,7 +79,7 @@ class UserFilterSet(BaseFilterSet):
) )
class Meta: class Meta:
model = get_user_model() model = User
fields = ( fields = (
'id', 'username', 'first_name', 'last_name', 'email', 'date_joined', 'last_login', 'is_staff', 'is_active', 'id', 'username', 'first_name', 'last_name', 'email', 'date_joined', 'last_login', 'is_staff', 'is_active',
'is_superuser', 'is_superuser',
@ -104,12 +103,12 @@ class TokenFilterSet(BaseFilterSet):
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
field_name='user', field_name='user',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User'), label=_('User'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='user__username', field_name='user__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )
@ -171,12 +170,12 @@ class ObjectPermissionFilterSet(BaseFilterSet):
) )
user_id = django_filters.ModelMultipleChoiceFilter( user_id = django_filters.ModelMultipleChoiceFilter(
field_name='users', field_name='users',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
label=_('User'), label=_('User'),
) )
user = django_filters.ModelMultipleChoiceFilter( user = django_filters.ModelMultipleChoiceFilter(
field_name='users__username', field_name='users__username',
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
to_field_name='username', to_field_name='username',
label=_('User (name)'), label=_('User (name)'),
) )

View File

@ -1,5 +1,4 @@
from django import forms from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from netbox.forms import NetBoxModelFilterSetForm from netbox.forms import NetBoxModelFilterSetForm
@ -80,7 +79,7 @@ class ObjectPermissionFilterForm(NetBoxModelFilterSetForm):
label=_('Group') label=_('Group')
) )
user_id = DynamicModelMultipleChoiceField( user_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )
@ -121,7 +120,7 @@ class TokenFilterForm(SavedFiltersMixin, FilterForm):
FieldSet('user_id', 'write_enabled', 'expires', 'last_used', name=_('Token')), FieldSet('user_id', 'write_enabled', 'expires', 'last_used', name=_('Token')),
) )
user_id = DynamicModelMultipleChoiceField( user_id = DynamicModelMultipleChoiceField(
queryset=get_user_model().objects.all(), queryset=User.objects.all(),
required=False, required=False,
label=_('User') label=_('User')
) )

View File

@ -1,6 +1,6 @@
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, password_validation from django.contrib.auth import password_validation
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.safestring import mark_safe from django.utils.safestring import mark_safe
@ -152,7 +152,7 @@ class UserTokenForm(forms.ModelForm):
class TokenForm(UserTokenForm): class TokenForm(UserTokenForm):
user = forms.ModelChoiceField( user = forms.ModelChoiceField(
queryset=get_user_model().objects.order_by('username'), queryset=User.objects.order_by('username'),
label=_('User') label=_('User')
) )
@ -236,7 +236,7 @@ class GroupForm(forms.ModelForm):
users = DynamicModelMultipleChoiceField( users = DynamicModelMultipleChoiceField(
label=_('Users'), label=_('Users'),
required=False, required=False,
queryset=get_user_model().objects.all() queryset=User.objects.all()
) )
object_permissions = DynamicModelMultipleChoiceField( object_permissions = DynamicModelMultipleChoiceField(
required=False, required=False,
@ -300,7 +300,7 @@ class ObjectPermissionForm(forms.ModelForm):
users = DynamicModelMultipleChoiceField( users = DynamicModelMultipleChoiceField(
label=_('Users'), label=_('Users'),
required=False, required=False,
queryset=get_user_model().objects.all() queryset=User.objects.all()
) )
groups = DynamicModelMultipleChoiceField( groups = DynamicModelMultipleChoiceField(
label=_('Groups'), label=_('Groups'),

View File

@ -1,9 +1,7 @@
import strawberry
import strawberry_django import strawberry_django
from django.contrib.auth import get_user_model
from users import filtersets, models
from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin
from users import filtersets, models
__all__ = ( __all__ = (
'GroupFilter', 'GroupFilter',
@ -17,7 +15,7 @@ class GroupFilter(BaseFilterMixin):
pass pass
@strawberry_django.filter(get_user_model(), lookups=True) @strawberry_django.filter(models.User, lookups=True)
@autotype_decorator(filtersets.UserFilterSet) @autotype_decorator(filtersets.UserFilterSet)
class UserFilter(BaseFilterMixin): class UserFilter(BaseFilterMixin):
pass pass

View File

@ -1,9 +1,8 @@
from typing import List from typing import List
import strawberry import strawberry
import strawberry_django import strawberry_django
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from users import models from users import models
from .types import * from .types import *

View File

@ -1,10 +1,9 @@
from typing import List from typing import List
import strawberry_django import strawberry_django
from django.contrib.auth import get_user_model
from netbox.graphql.types import BaseObjectType from netbox.graphql.types import BaseObjectType
from users.models import Group from users.models import Group, User
from .filters import * from .filters import *
__all__ = ( __all__ = (
@ -23,7 +22,7 @@ class GroupType(BaseObjectType):
@strawberry_django.type( @strawberry_django.type(
get_user_model(), User,
fields=[ fields=[
'id', 'username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'date_joined', 'groups', 'id', 'username', 'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'date_joined', 'groups',
], ],

View File

@ -1,4 +1,3 @@
from django.contrib.auth import get_user_model
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -15,7 +14,7 @@ class UserConfig(models.Model):
This model stores arbitrary user-specific preferences in a JSON data structure. This model stores arbitrary user-specific preferences in a JSON data structure.
""" """
user = models.OneToOneField( user = models.OneToOneField(
to=get_user_model(), to='users.User',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='config' related_name='config'
) )

View File

@ -2,7 +2,6 @@ import binascii
import os import os
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
from django.core.validators import MinLengthValidator from django.core.validators import MinLengthValidator
from django.db import models from django.db import models
@ -25,7 +24,7 @@ class Token(models.Model):
It also supports setting an expiration time and toggling write ability. It also supports setting an expiration time and toggling write ability.
""" """
user = models.ForeignKey( user = models.ForeignKey(
to=get_user_model(), to='users.User',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='tokens' related_name='tokens'
) )

View File

@ -1,16 +1,12 @@
from django.contrib.auth import get_user_model
from django.test import override_settings from django.test import override_settings
from django.urls import reverse from django.urls import reverse
from core.models import ObjectType from core.models import ObjectType
from users.models import Group, ObjectPermission, Token from users.models import Group, ObjectPermission, Token, User
from utilities.data import deepmerge from utilities.data import deepmerge
from utilities.testing import APIViewTestCases, APITestCase, create_test_user from utilities.testing import APIViewTestCases, APITestCase, create_test_user
User = get_user_model()
class AppTest(APITestCase): class AppTest(APITestCase):
def test_root(self): def test_root(self):

View File

@ -1,16 +1,13 @@
import datetime import datetime
from django.contrib.auth import get_user_model
from django.test import TestCase from django.test import TestCase
from django.utils.timezone import make_aware from django.utils.timezone import make_aware
from core.models import ObjectType from core.models import ObjectType
from users import filtersets from users import filtersets
from users.models import Group, ObjectPermission, Token from users.models import Group, ObjectPermission, Token, User
from utilities.testing import BaseFilterSetTests from utilities.testing import BaseFilterSetTests
User = get_user_model()
class UserTestCase(TestCase, BaseFilterSetTests): class UserTestCase(TestCase, BaseFilterSetTests):
queryset = User.objects.all() queryset = User.objects.all()

View File

@ -1,8 +1,6 @@
from django.contrib.auth import get_user_model
from django.test import TestCase from django.test import TestCase
from users.models import User
User = get_user_model()
class UserConfigTest(TestCase): class UserConfigTest(TestCase):

View File

@ -1,10 +1,10 @@
from django.contrib.auth import get_user_model
from django.test import override_settings from django.test import override_settings
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.urls import reverse from django.urls import reverse
from dcim.models import Site from dcim.models import Site
from dcim.tables import SiteTable from dcim.tables import SiteTable
from users.models import User
from users.preferences import UserPreference from users.preferences import UserPreference
from utilities.testing import TestCase from utilities.testing import TestCase
@ -16,9 +16,6 @@ DEFAULT_USER_PREFERENCES = {
} }
User = get_user_model()
class UserPreferencesTest(TestCase): class UserPreferencesTest(TestCase):
user_permissions = ['dcim.view_site'] user_permissions = ['dcim.view_site']

View File

@ -3,7 +3,6 @@ import json
import strawberry_django import strawberry_django
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.test import override_settings from django.test import override_settings
from django.urls import reverse from django.urls import reverse
@ -16,7 +15,7 @@ from strawberry.types.union import StrawberryUnion
from core.choices import ObjectChangeActionChoices from core.choices import ObjectChangeActionChoices
from core.models import ObjectChange, ObjectType from core.models import ObjectChange, ObjectType
from ipam.graphql.types import IPAddressFamilyType from ipam.graphql.types import IPAddressFamilyType
from users.models import ObjectPermission, Token from users.models import ObjectPermission, Token, User
from utilities.api import get_graphql_type_for_model from utilities.api import get_graphql_type_for_model
from .base import ModelTestCase from .base import ModelTestCase
from .utils import disable_warnings from .utils import disable_warnings
@ -27,9 +26,6 @@ __all__ = (
) )
User = get_user_model()
# #
# REST/GraphQL API Tests # REST/GraphQL API Tests
# #

View File

@ -1,6 +1,5 @@
import json import json
from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import ArrayField, RangeField from django.contrib.postgres.fields import ArrayField, RangeField
from django.core.exceptions import FieldDoesNotExist from django.core.exceptions import FieldDoesNotExist
@ -11,7 +10,7 @@ from netaddr import IPNetwork
from taggit.managers import TaggableManager from taggit.managers import TaggableManager
from core.models import ObjectType from core.models import ObjectType
from users.models import ObjectPermission from users.models import ObjectPermission, User
from utilities.data import ranges_to_string from utilities.data import ranges_to_string
from utilities.object_types import object_type_identifier from utilities.object_types import object_type_identifier
from utilities.permissions import resolve_permission_type from utilities.permissions import resolve_permission_type
@ -29,7 +28,7 @@ class TestCase(_TestCase):
def setUp(self): def setUp(self):
# Create the test user and assign permissions # Create the test user and assign permissions
self.user = get_user_model().objects.create_user(username='testuser') self.user = User.objects.create_user(username='testuser')
self.add_permissions(*self.user_permissions) self.add_permissions(*self.user_permissions)
# Initialize the test client # Initialize the test client

View File

@ -3,7 +3,6 @@ import logging
import re import re
from contextlib import contextmanager from contextlib import contextmanager
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.utils.text import slugify from django.utils.text import slugify
@ -11,6 +10,7 @@ from core.models import ObjectType
from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site
from extras.choices import CustomFieldTypeChoices from extras.choices import CustomFieldTypeChoices
from extras.models import CustomField, Tag from extras.models import CustomField, Tag
from users.models import User
from virtualization.models import Cluster, ClusterType, VirtualMachine from virtualization.models import Cluster, ClusterType, VirtualMachine
@ -67,7 +67,7 @@ def create_test_user(username='testuser', permissions=None):
""" """
Create a User with the given permissions. Create a User with the given permissions.
""" """
user = get_user_model().objects.create_user(username=username) user = User.objects.create_user(username=username)
if permissions is None: if permissions is None:
permissions = () permissions = ()
for perm_name in permissions: for perm_name in permissions: