Skip to content

Commit 3be3bba

Browse files
committed
Refactor ConfigDiffBase to use class methods for variable handling and update custom_field query parameters
1 parent 3765975 commit 3be3bba

File tree

1 file changed

+29
-6
lines changed
  • netbox_config_diff/compliance

1 file changed

+29
-6
lines changed

netbox_config_diff/compliance/base.py

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import asyncio
2+
import inspect
23
import re
34
import traceback
45
from typing import Iterable, Iterator
@@ -9,7 +10,7 @@
910
from dcim.models import Device, DeviceRole, Site
1011
from django.db.models import Q
1112
from extras.models import CustomField
12-
from extras.scripts import MultiObjectVar, ObjectVar, TextVar
13+
from extras.scripts import MultiObjectVar, ObjectVar, ScriptVariable, TextVar
1314
from jinja2.exceptions import TemplateError
1415
from netutils.config.compliance import diff_network_config
1516
from utilities.exceptions import AbortScript
@@ -68,13 +69,35 @@ class ConfigDiffBase(SecretsMixin):
6869
"Reference the object as <code>{{ object }}</code>.",
6970
)
7071

71-
def __init__(self, *args, **kwargs):
72-
super().__init__(*args, **kwargs)
73-
self.custom_field.query_params["object_type_id"] = self._get_device_object_type_id()
74-
75-
def _get_device_object_type_id(self) -> list[int]:
72+
@classmethod
73+
def _get_device_object_type_id(cls) -> list[int]:
7674
return list(ObjectType.objects.filter(app_label="dcim", model="device").values_list("id", flat=True))
7775

76+
@classmethod
77+
def _get_vars(cls):
78+
vars = {}
79+
device_id = cls._get_device_object_type_id()
80+
81+
# Iterate all base classes looking for ScriptVariables
82+
for base_class in inspect.getmro(cls):
83+
# When object is reached there's no reason to continue
84+
if base_class is object:
85+
break
86+
87+
for name, attr in base_class.__dict__.items():
88+
if name not in vars and issubclass(attr.__class__, ScriptVariable):
89+
if name == "custom_field":
90+
attr.field_attrs["query_params"]["object_type_id"] = device_id
91+
vars[name] = attr
92+
93+
# Order variables according to field_order
94+
if not cls.field_order:
95+
return vars
96+
ordered_vars = {field: vars.pop(field) for field in cls.field_order if field in vars}
97+
ordered_vars.update(vars)
98+
99+
return ordered_vars
100+
78101
def run_script(self, data: dict) -> None:
79102
devices = self.validate_data(data)
80103
devices = list(self.get_devices_with_rendered_configs(devices))

0 commit comments

Comments
 (0)