mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 09:28:38 -06:00
Closes #9896: Discontinue arbitrary use of OrderedDict
This commit is contained in:
parent
562769fb89
commit
29a611c729
@ -1,5 +1,4 @@
|
|||||||
import socket
|
import socket
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.http import Http404, HttpResponse, HttpResponseForbidden
|
from django.http import Http404, HttpResponse, HttpResponseForbidden
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
@ -484,7 +483,7 @@ class DeviceViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet):
|
|||||||
return HttpResponseForbidden()
|
return HttpResponseForbidden()
|
||||||
|
|
||||||
napalm_methods = request.GET.getlist('method')
|
napalm_methods = request.GET.getlist('method')
|
||||||
response = OrderedDict([(m, None) for m in napalm_methods])
|
response = {m: None for m in napalm_methods}
|
||||||
|
|
||||||
config = get_config()
|
config = get_config()
|
||||||
username = config.NAPALM_USERNAME
|
username = config.NAPALM_USERNAME
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.paginator import EmptyPage, PageNotAnInteger
|
from django.core.paginator import EmptyPage, PageNotAnInteger
|
||||||
@ -945,18 +943,18 @@ class DeviceTypeImportView(generic.ObjectImportView):
|
|||||||
]
|
]
|
||||||
queryset = DeviceType.objects.all()
|
queryset = DeviceType.objects.all()
|
||||||
model_form = forms.DeviceTypeImportForm
|
model_form = forms.DeviceTypeImportForm
|
||||||
related_object_forms = OrderedDict((
|
related_object_forms = {
|
||||||
('console-ports', forms.ConsolePortTemplateImportForm),
|
'console-ports': forms.ConsolePortTemplateImportForm,
|
||||||
('console-server-ports', forms.ConsoleServerPortTemplateImportForm),
|
'console-server-ports': forms.ConsoleServerPortTemplateImportForm,
|
||||||
('power-ports', forms.PowerPortTemplateImportForm),
|
'power-ports': forms.PowerPortTemplateImportForm,
|
||||||
('power-outlets', forms.PowerOutletTemplateImportForm),
|
'power-outlets': forms.PowerOutletTemplateImportForm,
|
||||||
('interfaces', forms.InterfaceTemplateImportForm),
|
'interfaces': forms.InterfaceTemplateImportForm,
|
||||||
('rear-ports', forms.RearPortTemplateImportForm),
|
'rear-ports': forms.RearPortTemplateImportForm,
|
||||||
('front-ports', forms.FrontPortTemplateImportForm),
|
'front-ports': forms.FrontPortTemplateImportForm,
|
||||||
('module-bays', forms.ModuleBayTemplateImportForm),
|
'module-bays': forms.ModuleBayTemplateImportForm,
|
||||||
('device-bays', forms.DeviceBayTemplateImportForm),
|
'device-bays': forms.DeviceBayTemplateImportForm,
|
||||||
('inventory-items', forms.InventoryItemTemplateImportForm),
|
'inventory-items': forms.InventoryItemTemplateImportForm,
|
||||||
))
|
}
|
||||||
|
|
||||||
def prep_related_object_data(self, parent, data):
|
def prep_related_object_data(self, parent, data):
|
||||||
data.update({'device_type': parent})
|
data.update({'device_type': parent})
|
||||||
@ -1075,15 +1073,15 @@ class ModuleTypeImportView(generic.ObjectImportView):
|
|||||||
]
|
]
|
||||||
queryset = ModuleType.objects.all()
|
queryset = ModuleType.objects.all()
|
||||||
model_form = forms.ModuleTypeImportForm
|
model_form = forms.ModuleTypeImportForm
|
||||||
related_object_forms = OrderedDict((
|
related_object_forms = {
|
||||||
('console-ports', forms.ConsolePortTemplateImportForm),
|
'console-ports': forms.ConsolePortTemplateImportForm,
|
||||||
('console-server-ports', forms.ConsoleServerPortTemplateImportForm),
|
'console-server-ports': forms.ConsoleServerPortTemplateImportForm,
|
||||||
('power-ports', forms.PowerPortTemplateImportForm),
|
'power-ports': forms.PowerPortTemplateImportForm,
|
||||||
('power-outlets', forms.PowerOutletTemplateImportForm),
|
'power-outlets': forms.PowerOutletTemplateImportForm,
|
||||||
('interfaces', forms.InterfaceTemplateImportForm),
|
'interfaces': forms.InterfaceTemplateImportForm,
|
||||||
('rear-ports', forms.RearPortTemplateImportForm),
|
'rear-ports': forms.RearPortTemplateImportForm,
|
||||||
('front-ports', forms.FrontPortTemplateImportForm),
|
'front-ports': forms.FrontPortTemplateImportForm,
|
||||||
))
|
}
|
||||||
|
|
||||||
def prep_related_object_data(self, parent, data):
|
def prep_related_object_data(self, parent, data):
|
||||||
data.update({'module_type': parent})
|
data.update({'module_type': parent})
|
||||||
|
@ -3,7 +3,6 @@ import inspect
|
|||||||
import logging
|
import logging
|
||||||
import pkgutil
|
import pkgutil
|
||||||
import traceback
|
import traceback
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
@ -114,7 +113,7 @@ class Report(object):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
self._results = OrderedDict()
|
self._results = {}
|
||||||
self.active_test = None
|
self.active_test = None
|
||||||
self.failed = False
|
self.failed = False
|
||||||
|
|
||||||
@ -125,13 +124,13 @@ class Report(object):
|
|||||||
for method in dir(self):
|
for method in dir(self):
|
||||||
if method.startswith('test_') and callable(getattr(self, method)):
|
if method.startswith('test_') and callable(getattr(self, method)):
|
||||||
test_methods.append(method)
|
test_methods.append(method)
|
||||||
self._results[method] = OrderedDict([
|
self._results[method] = {
|
||||||
('success', 0),
|
'success': 0,
|
||||||
('info', 0),
|
'info': 0,
|
||||||
('warning', 0),
|
'warning': 0,
|
||||||
('failure', 0),
|
'failure': 0,
|
||||||
('log', []),
|
'log': [],
|
||||||
])
|
}
|
||||||
if not test_methods:
|
if not test_methods:
|
||||||
raise Exception("A report must contain at least one test method.")
|
raise Exception("A report must contain at least one test method.")
|
||||||
self.test_methods = test_methods
|
self.test_methods = test_methods
|
||||||
|
@ -6,7 +6,6 @@ import pkgutil
|
|||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
import threading
|
import threading
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
import yaml
|
import yaml
|
||||||
from django import forms
|
from django import forms
|
||||||
@ -496,7 +495,7 @@ def get_scripts(use_names=False):
|
|||||||
Return a dict of dicts mapping all scripts to their modules. Set use_names to True to use each module's human-
|
Return a dict of dicts mapping all scripts to their modules. Set use_names to True to use each module's human-
|
||||||
defined name in place of the actual module name.
|
defined name in place of the actual module name.
|
||||||
"""
|
"""
|
||||||
scripts = OrderedDict()
|
scripts = {}
|
||||||
# Iterate through all modules within the scripts path. These are the user-created files in which reports are
|
# Iterate through all modules within the scripts path. These are the user-created files in which reports are
|
||||||
# defined.
|
# defined.
|
||||||
for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]):
|
for importer, module_name, _ in pkgutil.iter_modules([settings.SCRIPTS_ROOT]):
|
||||||
@ -510,7 +509,7 @@ def get_scripts(use_names=False):
|
|||||||
|
|
||||||
if use_names and hasattr(module, 'name'):
|
if use_names and hasattr(module, 'name'):
|
||||||
module_name = module.name
|
module_name = module.name
|
||||||
module_scripts = OrderedDict()
|
module_scripts = {}
|
||||||
script_order = getattr(module, "script_order", ())
|
script_order = getattr(module, "script_order", ())
|
||||||
ordered_scripts = [cls for cls in script_order if is_script(cls)]
|
ordered_scripts = [cls for cls in script_order if is_script(cls)]
|
||||||
unordered_scripts = [cls for _, cls in inspect.getmembers(module, is_script) if cls not in script_order]
|
unordered_scripts = [cls for _, cls in inspect.getmembers(module, is_script) if cls not in script_order]
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django import template
|
from django import template
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
@ -50,7 +48,7 @@ def custom_links(context, obj):
|
|||||||
'perms': context['perms'], # django.contrib.auth.context_processors.auth
|
'perms': context['perms'], # django.contrib.auth.context_processors.auth
|
||||||
}
|
}
|
||||||
template_code = ''
|
template_code = ''
|
||||||
group_names = OrderedDict()
|
group_names = {}
|
||||||
|
|
||||||
for cl in custom_links:
|
for cl in custom_links:
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from drf_yasg.utils import swagger_serializer_method
|
from drf_yasg.utils import swagger_serializer_method
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
@ -227,13 +225,13 @@ class AvailableVLANSerializer(serializers.Serializer):
|
|||||||
group = NestedVLANGroupSerializer(read_only=True)
|
group = NestedVLANGroupSerializer(read_only=True)
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
return OrderedDict([
|
return {
|
||||||
('vid', instance),
|
'vid': instance,
|
||||||
('group', NestedVLANGroupSerializer(
|
'group': NestedVLANGroupSerializer(
|
||||||
self.context['group'],
|
self.context['group'],
|
||||||
context={'request': self.context['request']}
|
context={'request': self.context['request']}
|
||||||
).data),
|
).data,
|
||||||
])
|
}
|
||||||
|
|
||||||
|
|
||||||
class CreateAvailableVLANSerializer(NetBoxModelSerializer):
|
class CreateAvailableVLANSerializer(NetBoxModelSerializer):
|
||||||
@ -318,11 +316,11 @@ class AvailablePrefixSerializer(serializers.Serializer):
|
|||||||
vrf = NestedVRFSerializer(self.context['vrf'], context={'request': self.context['request']}).data
|
vrf = NestedVRFSerializer(self.context['vrf'], context={'request': self.context['request']}).data
|
||||||
else:
|
else:
|
||||||
vrf = None
|
vrf = None
|
||||||
return OrderedDict([
|
return {
|
||||||
('family', instance.version),
|
'family': instance.version,
|
||||||
('prefix', str(instance)),
|
'prefix': str(instance),
|
||||||
('vrf', vrf),
|
'vrf': vrf,
|
||||||
])
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -397,11 +395,11 @@ class AvailableIPSerializer(serializers.Serializer):
|
|||||||
vrf = NestedVRFSerializer(self.context['vrf'], context={'request': self.context['request']}).data
|
vrf = NestedVRFSerializer(self.context['vrf'], context={'request': self.context['request']}).data
|
||||||
else:
|
else:
|
||||||
vrf = None
|
vrf = None
|
||||||
return OrderedDict([
|
return {
|
||||||
('family', self.context['parent'].family),
|
'family': self.context['parent'].family,
|
||||||
('address', f"{instance}/{self.context['parent'].mask_length}"),
|
'address': f"{instance}/{self.context['parent'].mask_length}",
|
||||||
('vrf', vrf),
|
'vrf': vrf,
|
||||||
])
|
}
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from netaddr import IPNetwork
|
from netaddr import IPNetwork
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
@ -48,10 +46,10 @@ class ChoiceField(serializers.Field):
|
|||||||
def to_representation(self, obj):
|
def to_representation(self, obj):
|
||||||
if obj == '':
|
if obj == '':
|
||||||
return None
|
return None
|
||||||
return OrderedDict([
|
return {
|
||||||
('value', obj),
|
'value': obj,
|
||||||
('label', self._choices[obj])
|
'label': self._choices[obj],
|
||||||
])
|
}
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if data == '':
|
if data == '':
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import platform
|
import platform
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
from django import __version__ as DJANGO_VERSION
|
from django import __version__ as DJANGO_VERSION
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
@ -26,18 +25,18 @@ class APIRootView(APIView):
|
|||||||
|
|
||||||
def get(self, request, format=None):
|
def get(self, request, format=None):
|
||||||
|
|
||||||
return Response(OrderedDict((
|
return Response({
|
||||||
('circuits', reverse('circuits-api:api-root', request=request, format=format)),
|
'circuits': reverse('circuits-api:api-root', request=request, format=format),
|
||||||
('dcim', reverse('dcim-api:api-root', request=request, format=format)),
|
'dcim': reverse('dcim-api:api-root', request=request, format=format),
|
||||||
('extras', reverse('extras-api:api-root', request=request, format=format)),
|
'extras': reverse('extras-api:api-root', request=request, format=format),
|
||||||
('ipam', reverse('ipam-api:api-root', request=request, format=format)),
|
'ipam': reverse('ipam-api:api-root', request=request, format=format),
|
||||||
('plugins', reverse('plugins-api:api-root', request=request, format=format)),
|
'plugins': reverse('plugins-api:api-root', request=request, format=format),
|
||||||
('status', reverse('api-status', request=request, format=format)),
|
'status': reverse('api-status', request=request, format=format),
|
||||||
('tenancy', reverse('tenancy-api:api-root', request=request, format=format)),
|
'tenancy': reverse('tenancy-api:api-root', request=request, format=format),
|
||||||
('users', reverse('users-api:api-root', request=request, format=format)),
|
'users': reverse('users-api:api-root', request=request, format=format),
|
||||||
('virtualization', reverse('virtualization-api:api-root', request=request, format=format)),
|
'virtualization': reverse('virtualization-api:api-root', request=request, format=format),
|
||||||
('wireless', reverse('wireless-api:api-root', request=request, format=format)),
|
'wireless': reverse('wireless-api:api-root', request=request, format=format),
|
||||||
)))
|
})
|
||||||
|
|
||||||
|
|
||||||
class StatusView(APIView):
|
class StatusView(APIView):
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import decimal
|
import decimal
|
||||||
import json
|
import json
|
||||||
from collections import OrderedDict
|
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from itertools import count, groupby
|
from itertools import count, groupby
|
||||||
|
|
||||||
@ -218,7 +217,7 @@ def deepmerge(original, new):
|
|||||||
"""
|
"""
|
||||||
Deep merge two dictionaries (new into original) and return a new dict
|
Deep merge two dictionaries (new into original) and return a new dict
|
||||||
"""
|
"""
|
||||||
merged = OrderedDict(original)
|
merged = dict(original)
|
||||||
for key, val in new.items():
|
for key, val in new.items():
|
||||||
if key in original and isinstance(original[key], dict) and val and isinstance(val, dict):
|
if key in original and isinstance(original[key], dict) and val and isinstance(val, dict):
|
||||||
merged[key] = deepmerge(original[key], val)
|
merged[key] = deepmerge(original[key], val)
|
||||||
|
Loading…
Reference in New Issue
Block a user