Refactor register_model() to accept multiple models

This commit is contained in:
Jeremy Stretch 2024-02-21 12:07:20 -05:00
parent 62a0b52237
commit 3b10cf153c
12 changed files with 58 additions and 68 deletions

View File

@ -6,9 +6,8 @@ class CircuitsConfig(AppConfig):
verbose_name = "Circuits" verbose_name = "Circuits"
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import signals, search from . import signals, search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -17,9 +17,8 @@ class CoreConfig(AppConfig):
def ready(self): def ready(self):
from core.api import schema # noqa from core.api import schema # noqa
from netbox.models.features import register_model from netbox.models.features import register_models
from . import data_backends, search from . import data_backends, search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -8,14 +8,13 @@ class DCIMConfig(AppConfig):
verbose_name = "DCIM" verbose_name = "DCIM"
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from utilities.counters import connect_counters from utilities.counters import connect_counters
from . import signals, search from . import signals, search
from .models import CableTermination, Device, DeviceType, VirtualChassis from .models import CableTermination, Device, DeviceType, VirtualChassis
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)
# Register denormalized fields # Register denormalized fields
denormalized.register(CableTermination, '_device', { denormalized.register(CableTermination, '_device', {

View File

@ -5,9 +5,8 @@ class ExtrasConfig(AppConfig):
name = "extras" name = "extras"
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import dashboard, lookups, search, signals from . import dashboard, lookups, search, signals
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -6,9 +6,8 @@ class IPAMConfig(AppConfig):
verbose_name = "IPAM" verbose_name = "IPAM"
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import signals, search from . import signals, search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -35,7 +35,7 @@ __all__ = (
'JournalingMixin', 'JournalingMixin',
'SyncedDataMixin', 'SyncedDataMixin',
'TagsMixin', 'TagsMixin',
'register_model', 'register_models',
) )
@ -575,9 +575,9 @@ registry['model_features'].update({
}) })
def register_model(model, **kwargs): def register_models(*models):
""" """
Register a model in NetBox. This entails: Register one or more models in NetBox. This entails:
- Determining whether the model is considered "public" (available for reference by other models) - Determining whether the model is considered "public" (available for reference by other models)
- Registering which features the model supports (e.g. bookmarks, custom fields, etc.) - Registering which features the model supports (e.g. bookmarks, custom fields, etc.)
@ -585,38 +585,39 @@ def register_model(model, **kwargs):
register_model() should be called for each relevant model under the ready() of an app's AppConfig class. register_model() should be called for each relevant model under the ready() of an app's AppConfig class.
""" """
app_label, model_name = model._meta.label_lower.split('.') for model in models:
app_label, model_name = model._meta.label_lower.split('.')
# Register public models # Register public models
if not getattr(model, '_netbox_private', False): if not getattr(model, '_netbox_private', False):
registry['models'][app_label].add(model_name) registry['models'][app_label].add(model_name)
# Record each applicable feature for the model in the registry # Record each applicable feature for the model in the registry
features = { features = {
feature for feature, cls in FEATURES_MAP.items() if issubclass(model, cls) feature for feature, cls in FEATURES_MAP.items() if issubclass(model, cls)
} }
for feature in features: for feature in features:
try: try:
registry['model_features'][feature][app_label].add(model_name) registry['model_features'][feature][app_label].add(model_name)
except KeyError: except KeyError:
raise KeyError( raise KeyError(
f"{feature} is not a valid model feature! Valid keys are: {registry['model_features'].keys()}" f"{feature} is not a valid model feature! Valid keys are: {registry['model_features'].keys()}"
)
# Register applicable feature views for the model
if issubclass(model, JournalingMixin):
register_model_view(model, 'journal', kwargs={'model': model})(
'netbox.views.generic.ObjectJournalView'
)
if issubclass(model, ChangeLoggingMixin):
register_model_view(model, 'changelog', kwargs={'model': model})(
'netbox.views.generic.ObjectChangeLogView'
)
if issubclass(model, JobsMixin):
register_model_view(model, 'jobs', kwargs={'model': model})(
'netbox.views.generic.ObjectJobsView'
)
if issubclass(model, SyncedDataMixin):
register_model_view(model, 'sync', kwargs={'model': model})(
'netbox.views.generic.ObjectSyncDataView'
) )
# Register applicable feature views for the model
if issubclass(model, JournalingMixin):
register_model_view(model, 'journal', kwargs={'model': model})(
'netbox.views.generic.ObjectJournalView'
)
if issubclass(model, ChangeLoggingMixin):
register_model_view(model, 'changelog', kwargs={'model': model})(
'netbox.views.generic.ObjectChangeLogView'
)
if issubclass(model, JobsMixin):
register_model_view(model, 'jobs', kwargs={'model': model})(
'netbox.views.generic.ObjectJobsView'
)
if issubclass(model, SyncedDataMixin):
register_model_view(model, 'sync', kwargs={'model': model})(
'netbox.views.generic.ObjectSyncDataView'
)

View File

@ -94,11 +94,10 @@ class PluginConfig(AppConfig):
pass pass
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)
plugin_name = self.name.rsplit('.', 1)[-1] plugin_name = self.name.rsplit('.', 1)[-1]

View File

@ -5,9 +5,8 @@ class TenancyConfig(AppConfig):
name = 'tenancy' name = 'tenancy'
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import search from . import search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -5,9 +5,8 @@ class UsersConfig(AppConfig):
name = 'users' name = 'users'
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import signals from . import signals
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -7,14 +7,13 @@ class VirtualizationConfig(AppConfig):
name = 'virtualization' name = 'virtualization'
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from utilities.counters import connect_counters from utilities.counters import connect_counters
from . import search, signals from . import search, signals
from .models import VirtualMachine from .models import VirtualMachine
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)
# Register denormalized fields # Register denormalized fields
denormalized.register(VirtualMachine, 'cluster', { denormalized.register(VirtualMachine, 'cluster', {

View File

@ -6,9 +6,8 @@ class VPNConfig(AppConfig):
verbose_name = 'VPN' verbose_name = 'VPN'
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import search from . import search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)

View File

@ -5,9 +5,8 @@ class WirelessConfig(AppConfig):
name = 'wireless' name = 'wireless'
def ready(self): def ready(self):
from netbox.models.features import register_model from netbox.models.features import register_models
from . import signals, search from . import signals, search
# Register models # Register models
for model in self.get_models(): register_models(*self.get_models())
register_model(model)