diff --git a/netbox/netbox/object_actions.py b/netbox/netbox/object_actions.py index 7a21739b9..51687eee1 100644 --- a/netbox/netbox/object_actions.py +++ b/netbox/netbox/object_actions.py @@ -6,6 +6,7 @@ from django.utils.translation import gettext as _ from core.models import ObjectType from extras.models import ExportTemplate from utilities.querydict import prepare_cloned_fields +from utilities.views import get_viewname __all__ = ( 'AddObject', @@ -42,7 +43,7 @@ class ObjectAction: @classmethod def get_url(cls, obj): - viewname = f'{obj._meta.app_label}:{obj._meta.model_name}_{cls.name}' + viewname = get_viewname(obj, action=cls.name) kwargs = { kwarg: getattr(obj, kwarg) for kwarg in cls.url_kwargs } diff --git a/netbox/netbox/tests/test_object_actions.py b/netbox/netbox/tests/test_object_actions.py new file mode 100644 index 000000000..7e3b16bf1 --- /dev/null +++ b/netbox/netbox/tests/test_object_actions.py @@ -0,0 +1,32 @@ +from unittest import skipIf + +from django.conf import settings +from django.test import TestCase + +from dcim.models import Device +from netbox.object_actions import AddObject, BulkImport +from netbox.tests.dummy_plugin.models import DummyNetBoxModel + + +class ObjectActionTest(TestCase): + + def test_get_url_core_model(self): + """Test URL generation for core NetBox models""" + obj = Device() + + url = AddObject.get_url(obj) + self.assertEqual(url, '/dcim/devices/add/') + + url = BulkImport.get_url(obj) + self.assertEqual(url, '/dcim/devices/import/') + + @skipIf('netbox.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") + def test_get_url_plugin_model(self): + """Test URL generation for plugin models includes plugins: namespace""" + obj = DummyNetBoxModel() + + url = AddObject.get_url(obj) + self.assertEqual(url, '/plugins/dummy-plugin/netboxmodel/add/') + + url = BulkImport.get_url(obj) + self.assertEqual(url, '/plugins/dummy-plugin/netboxmodel/import/')