Skip to content

Commit e651d16

Browse files
committed
fix: Update plugin for NetBox 4.4 compatibility
- Remove deprecated FEATURES_MAP import (replaced with dynamic registration) - Update _register_missing_plugin_models method signature to remove feature_mixins_map parameter - Simplify _is_model_registered to use registry['models'] structure instead of feature-based checking - Bump version to 4.4.0.1 to reflect NetBox 4.4 compatibility Fixes ImportError: cannot import name 'FEATURES_MAP' from 'netbox.models.features' Related to NetBox issue #20129 - dynamic model feature registration system
1 parent e2d53dd commit e651d16

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

netbox_plugin_reloader/__init__.py

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class NetboxPluginReloaderConfig(PluginConfig):
2626
def ready(self):
2727
"""
2828
Initializes the plugin when the Django application loads.
29-
29+
3030
Registers any plugin models missed during startup and refreshes form fields to include newly registered models for custom fields and tags.
3131
"""
3232
super().ready()
@@ -36,23 +36,21 @@ def ready(self):
3636
from django.conf import settings
3737
from django.utils.translation import gettext_lazy as _
3838
from extras.forms.model_forms import CustomFieldForm, TagForm
39-
from netbox.models.features import FEATURES_MAP, register_models
39+
from netbox.models.features import register_models
4040
from netbox.registry import registry
4141
from utilities.forms.fields import ContentTypeMultipleChoiceField
4242

4343
# Register missing plugin models
44-
self._register_missing_plugin_models(settings.PLUGINS, apps, registry, FEATURES_MAP, register_models)
44+
self._register_missing_plugin_models(settings.PLUGINS, apps, registry, register_models)
4545

4646
# Refresh form fields
4747
self._refresh_form_field(CustomFieldForm, "custom_fields", ObjectType, ContentTypeMultipleChoiceField, _)
4848
self._refresh_form_field(TagForm, "tags", ObjectType, ContentTypeMultipleChoiceField, _)
4949

50-
def _register_missing_plugin_models(
51-
self, plugin_list, app_registry, netbox_registry, feature_mixins_map, model_register_function
52-
):
50+
def _register_missing_plugin_models(self, plugin_list, app_registry, netbox_registry, model_register_function):
5351
"""
5452
Registers plugin models that were not registered during initial application startup.
55-
53+
5654
Iterates through the provided list of plugin names, identifies models that are missing from the NetBox feature registry, and registers them using the supplied registration function. Prints errors encountered during processing and reports the number of models registered if any were missed.
5755
"""
5856
unregistered_models = []
@@ -64,7 +62,7 @@ def _register_missing_plugin_models(
6462

6563
for model_class in plugin_app_config.get_models():
6664
model_name = model_class._meta.model_name
67-
if not self._is_model_registered(app_label, model_name, netbox_registry, feature_mixins_map):
65+
if not self._is_model_registered(app_label, model_name, netbox_registry):
6866
unregistered_models.append(model_class)
6967

7068
except Exception as e:
@@ -74,23 +72,21 @@ def _register_missing_plugin_models(
7472
model_register_function(*unregistered_models)
7573
print(f"Plugin Reloader: Registered {len(unregistered_models)} previously missed models")
7674

77-
def _is_model_registered(self, app_label, model_name, registry, feature_mixins_map):
75+
def _is_model_registered(self, app_label, model_name, registry):
7876
"""
79-
Determines whether a model is registered under any NetBox feature.
80-
77+
Determines whether a model is registered in the NetBox registry.
78+
79+
In NetBox 4.4+, we check if the model is in the registry['models'] structure.
80+
8181
Returns:
82-
True if the specified model is present in any feature registry; otherwise, False.
82+
True if the specified model is present in the registry; otherwise, False.
8383
"""
84-
return any(
85-
app_label in registry["model_features"][feature_name]
86-
and model_name in registry["model_features"][feature_name][app_label]
87-
for feature_name in feature_mixins_map.keys()
88-
)
84+
return app_label in registry["models"] and model_name in registry["models"][app_label]
8985

9086
def _refresh_form_field(self, form_class, feature_name, object_type_class, field_class, translation_function):
9187
"""
9288
Updates a form class's object_types field to reflect models supporting a specific NetBox feature.
93-
89+
9490
Args:
9591
form_class: The form class to update.
9692
feature_name: The NetBox feature name (e.g., "custom_fields", "tags").

netbox_plugin_reloader/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Version information."""
22

3-
__version__ = "4.4.0"
3+
__version__ = "4.4.0.1"

0 commit comments

Comments
 (0)