mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 17:26:10 -06:00
Clean up base modules
This commit is contained in:
parent
59a6b3e71b
commit
2dc50b6108
@ -2,7 +2,7 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
|
||||
from django.db import transaction
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django_pglocks import advisory_lock
|
||||
from drf_spectacular.utils import extend_schema, extend_schema_view
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from rest_framework import status
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.routers import APIRootView
|
||||
@ -15,7 +15,7 @@ from ipam.models import *
|
||||
from netbox.api.viewsets import NetBoxModelViewSet
|
||||
from netbox.api.viewsets.mixins import ObjectValidationMixin
|
||||
from netbox.config import get_config
|
||||
from utilities.constants import ADVISORY_LOCK_KEYS
|
||||
from netbox.constants import ADVISORY_LOCK_KEYS
|
||||
from utilities.utils import count_related
|
||||
from . import serializers
|
||||
from ipam.models import L2VPN, L2VPNTermination
|
||||
|
@ -5,3 +5,14 @@ NESTED_SERIALIZER_PREFIX = 'Nested'
|
||||
RQ_QUEUE_DEFAULT = 'default'
|
||||
RQ_QUEUE_HIGH = 'high'
|
||||
RQ_QUEUE_LOW = 'low'
|
||||
|
||||
# Keys for PostgreSQL advisory locks. These are arbitrary bigints used by the advisory_lock
|
||||
# context manager. When a lock is acquired, one of these keys will be used to identify said lock.
|
||||
# When adding a new key, pick something arbitrary and unique so that it is easily searchable in
|
||||
# query logs.
|
||||
ADVISORY_LOCK_KEYS = {
|
||||
'available-prefixes': 100100,
|
||||
'available-ips': 100200,
|
||||
'available-vlans': 100300,
|
||||
'available-asns': 100400,
|
||||
}
|
||||
|
@ -10,6 +10,13 @@ from rest_framework.utils import formatting
|
||||
from netbox.api.exceptions import GraphQLTypeNotFound, SerializerNotFound
|
||||
from .utils import dynamic_import
|
||||
|
||||
__all__ = (
|
||||
'get_graphql_type_for_model',
|
||||
'get_serializer_for_model',
|
||||
'get_view_name',
|
||||
'is_api_request',
|
||||
)
|
||||
|
||||
|
||||
def get_serializer_for_model(model, prefix=''):
|
||||
"""
|
||||
|
@ -31,21 +31,6 @@ FILTER_TREENODE_NEGATION_LOOKUP_MAP = dict(
|
||||
n='in'
|
||||
)
|
||||
|
||||
|
||||
# Keys for PostgreSQL advisory locks. These are arbitrary bigints used by
|
||||
# the advisory_lock contextmanager. When a lock is acquired,
|
||||
# one of these keys will be used to identify said lock.
|
||||
#
|
||||
# When adding a new key, pick something arbitrary and unique so
|
||||
# that it is easily searchable in query logs.
|
||||
|
||||
ADVISORY_LOCK_KEYS = {
|
||||
'available-prefixes': 100100,
|
||||
'available-ips': 100200,
|
||||
'available-vlans': 100300,
|
||||
'available-asns': 100400,
|
||||
}
|
||||
|
||||
#
|
||||
# HTTP Request META safe copy
|
||||
#
|
||||
|
@ -3,6 +3,7 @@ from rest_framework.exceptions import APIException
|
||||
|
||||
__all__ = (
|
||||
'AbortRequest',
|
||||
'AbortScript',
|
||||
'AbortTransaction',
|
||||
'PermissionsViolation',
|
||||
'RQWorkerNotRunningException',
|
||||
|
@ -1,21 +1,23 @@
|
||||
from collections import defaultdict
|
||||
|
||||
from django.contrib.contenttypes.fields import GenericForeignKey
|
||||
from django.core.validators import RegexValidator
|
||||
from django.db import models
|
||||
|
||||
from utilities.ordering import naturalize
|
||||
from .forms import ColorSelect
|
||||
from .validators import ColorValidator
|
||||
|
||||
ColorValidator = RegexValidator(
|
||||
regex='^[0-9a-f]{6}$',
|
||||
message='Enter a valid hexadecimal RGB color code.',
|
||||
code='invalid'
|
||||
__all__ = (
|
||||
'ColorField',
|
||||
'NaturalOrderingField',
|
||||
'NullableCharField',
|
||||
'RestrictedGenericForeignKey',
|
||||
)
|
||||
|
||||
|
||||
# Deprecated: Retained only to ensure successful migration from early releases
|
||||
# Use models.CharField(null=True) instead
|
||||
# TODO: Remove in v4.0
|
||||
class NullableCharField(models.CharField):
|
||||
description = "Stores empty values as NULL rather than ''"
|
||||
|
||||
|
@ -1,5 +1,9 @@
|
||||
import hashlib
|
||||
|
||||
__all__ = (
|
||||
'sha256_hash',
|
||||
)
|
||||
|
||||
|
||||
def sha256_hash(filepath):
|
||||
"""
|
||||
|
@ -6,6 +6,22 @@ from django_filters.constants import EMPTY_VALUES
|
||||
from drf_spectacular.utils import extend_schema_field
|
||||
from drf_spectacular.types import OpenApiTypes
|
||||
|
||||
__all__ = (
|
||||
'ContentTypeFilter',
|
||||
'MACAddressFilter',
|
||||
'MultiValueCharFilter',
|
||||
'MultiValueDateFilter',
|
||||
'MultiValueDateTimeFilter',
|
||||
'MultiValueDecimalFilter',
|
||||
'MultiValueMACAddressFilter',
|
||||
'MultiValueNumberFilter',
|
||||
'MultiValueTimeFilter',
|
||||
'MultiValueWWNFilter',
|
||||
'NullableCharFieldFilter',
|
||||
'NumericArrayFilter',
|
||||
'TreeNodeMultipleChoiceFilter',
|
||||
)
|
||||
|
||||
|
||||
def multivalue_field_factory(field_class):
|
||||
"""
|
||||
|
@ -1,20 +1,23 @@
|
||||
import functools
|
||||
|
||||
import graphql
|
||||
from django.core.exceptions import FieldDoesNotExist
|
||||
from django.db.models import ForeignKey, Prefetch
|
||||
from django.db.models import ForeignKey
|
||||
from django.db.models.constants import LOOKUP_SEP
|
||||
from django.db.models.fields.reverse_related import ManyToOneRel
|
||||
from graphene import InputObjectType
|
||||
from graphene.types.generic import GenericScalar
|
||||
from graphene.types.resolver import default_resolver
|
||||
from graphene_django import DjangoObjectType
|
||||
from graphql import FieldNode, GraphQLObjectType, GraphQLResolveInfo, GraphQLSchema
|
||||
from graphql import GraphQLResolveInfo, GraphQLSchema
|
||||
from graphql.execution.execute import get_field_def
|
||||
from graphql.language.ast import FragmentSpreadNode, InlineFragmentNode, VariableNode
|
||||
from graphql.pyutils import Path
|
||||
from graphql.type.definition import GraphQLInterfaceType, GraphQLUnionType
|
||||
|
||||
__all__ = (
|
||||
'gql_query_optimizer',
|
||||
)
|
||||
|
||||
|
||||
def gql_query_optimizer(queryset, info, **options):
|
||||
return QueryOptimizer(info).optimize(queryset)
|
||||
|
@ -1,5 +1,10 @@
|
||||
from urllib.parse import urlparse
|
||||
|
||||
__all__ = (
|
||||
'is_embedded',
|
||||
'is_htmx',
|
||||
)
|
||||
|
||||
|
||||
def is_htmx(request):
|
||||
"""
|
||||
|
@ -1,6 +1,10 @@
|
||||
import markdown
|
||||
from markdown.inlinepatterns import SimpleTagPattern
|
||||
|
||||
__all__ = (
|
||||
'StrikethroughExtension',
|
||||
)
|
||||
|
||||
STRIKE_RE = r'(~{2})(.+?)(~{2})'
|
||||
|
||||
|
||||
|
@ -3,6 +3,10 @@ from timezone_field import TimeZoneField
|
||||
|
||||
from netbox.config import ConfigItem
|
||||
|
||||
__all__ = (
|
||||
'custom_deconstruct',
|
||||
)
|
||||
|
||||
|
||||
SKIP_FIELDS = (
|
||||
TimeZoneField,
|
||||
|
@ -4,6 +4,11 @@ from mptt.querysets import TreeQuerySet as TreeQuerySet_
|
||||
from django.db.models import Manager
|
||||
from .querysets import RestrictedQuerySet
|
||||
|
||||
__all__ = (
|
||||
'TreeManager',
|
||||
'TreeQuerySet',
|
||||
)
|
||||
|
||||
|
||||
class TreeQuerySet(TreeQuerySet_, RestrictedQuerySet):
|
||||
"""
|
||||
|
@ -1,5 +1,10 @@
|
||||
import re
|
||||
|
||||
__all__ = (
|
||||
'naturalize',
|
||||
'naturalize_interface',
|
||||
)
|
||||
|
||||
INTERFACE_NAME_REGEX = r'(^(?P<type>[^\d\.:]+)?)' \
|
||||
r'((?P<slot>\d+)/)?' \
|
||||
r'((?P<subslot>\d+)/)?' \
|
||||
|
@ -2,6 +2,12 @@ from django.core.paginator import Paginator, Page
|
||||
|
||||
from netbox.config import get_config
|
||||
|
||||
__all__ = (
|
||||
'EnhancedPage',
|
||||
'EnhancedPaginator',
|
||||
'get_paginate_count',
|
||||
)
|
||||
|
||||
|
||||
class EnhancedPaginator(Paginator):
|
||||
default_page_lengths = (
|
||||
|
@ -1,5 +1,10 @@
|
||||
from django.contrib.postgres.aggregates import JSONBAgg
|
||||
from django.db.models import F, Func
|
||||
from django.db.models import Func
|
||||
|
||||
__all__ = (
|
||||
'CollateAsChar',
|
||||
'EmptyGroupByJSONBAgg',
|
||||
)
|
||||
|
||||
|
||||
class CollateAsChar(Func):
|
||||
|
@ -3,6 +3,11 @@ from django.db.models import Prefetch, QuerySet
|
||||
from users.constants import CONSTRAINT_TOKEN_USER
|
||||
from utilities.permissions import permission_is_exempt, qs_filter_from_constraints
|
||||
|
||||
__all__ = (
|
||||
'RestrictedPrefetch',
|
||||
'RestrictedQuerySet',
|
||||
)
|
||||
|
||||
|
||||
class RestrictedPrefetch(Prefetch):
|
||||
"""
|
||||
|
@ -1,3 +1,8 @@
|
||||
__all__ = (
|
||||
'linkify_phone',
|
||||
)
|
||||
|
||||
|
||||
def linkify_phone(value):
|
||||
"""
|
||||
Render a telephone number as a hyperlink.
|
||||
|
@ -4,6 +4,10 @@ from django.views.generic import View
|
||||
|
||||
from netbox.registry import registry
|
||||
|
||||
__all__ = (
|
||||
'get_model_urls',
|
||||
)
|
||||
|
||||
|
||||
def get_model_urls(app_label, model_name):
|
||||
"""
|
||||
|
@ -1,10 +1,24 @@
|
||||
import re
|
||||
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import _lazy_re_compile, BaseValidator, URLValidator
|
||||
from django.core.validators import BaseValidator, RegexValidator, URLValidator, _lazy_re_compile
|
||||
|
||||
from netbox.config import get_config
|
||||
|
||||
__all__ = (
|
||||
'ColorValidator',
|
||||
'EnhancedURLValidator',
|
||||
'ExclusionValidator',
|
||||
'validate_regex',
|
||||
)
|
||||
|
||||
|
||||
ColorValidator = RegexValidator(
|
||||
regex='^[0-9a-f]{6}$',
|
||||
message='Enter a valid hexadecimal RGB color code.',
|
||||
code='invalid'
|
||||
)
|
||||
|
||||
|
||||
class EnhancedURLValidator(URLValidator):
|
||||
"""
|
||||
|
Loading…
Reference in New Issue
Block a user