Closes #9896: Discontinue arbitrary use of OrderedDict

This commit is contained in:
jeremystretch 2022-08-01 16:51:44 -04:00
parent 562769fb89
commit 29a611c729
9 changed files with 65 additions and 78 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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,
]) }
# #

View File

@ -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 == '':

View File

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

View File

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