diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index cf914e665..03d8508af 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1118,6 +1118,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'devicerole', 'devicetype', 'dummymodel', # From dummy_plugin + 'dummynetboxmodel', # From dummy_plugin 'eventrule', 'fhrpgroup', 'frontport', diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index b1f7cfd48..ca79d5e7e 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -10,6 +10,7 @@ from mptt.models import MPTTModel, TreeForeignKey from netbox.models.features import * from utilities.mptt import TreeManager from utilities.querysets import RestrictedQuerySet +from utilities.views import get_viewname __all__ = ( @@ -42,7 +43,7 @@ class NetBoxFeatureSet( return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/' def get_absolute_url(self): - return reverse(f'{self._meta.app_label}:{self._meta.model_name}', args=[self.pk]) + return reverse(get_viewname(self), args=[self.pk]) # diff --git a/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py new file mode 100644 index 000000000..517178bd9 --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/migrations/0002_dummynetboxmodel.py @@ -0,0 +1,30 @@ +import taggit.managers +import utilities.json +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dummy_plugin', '0001_initial'), + ('extras', '0122_charfield_null_choices'), + ] + + operations = [ + migrations.CreateModel( + name='DummyNetBoxModel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/netbox/netbox/tests/dummy_plugin/models.py b/netbox/netbox/tests/dummy_plugin/models.py index 9bd39a46b..ed4522c65 100644 --- a/netbox/netbox/tests/dummy_plugin/models.py +++ b/netbox/netbox/tests/dummy_plugin/models.py @@ -1,5 +1,7 @@ from django.db import models +from netbox.models import NetBoxModel + class DummyModel(models.Model): name = models.CharField( @@ -11,3 +13,7 @@ class DummyModel(models.Model): class Meta: ordering = ['name'] + + +class DummyNetBoxModel(NetBoxModel): + pass diff --git a/netbox/netbox/tests/dummy_plugin/urls.py b/netbox/netbox/tests/dummy_plugin/urls.py index 9e383ffe2..6cdd48f7e 100644 --- a/netbox/netbox/tests/dummy_plugin/urls.py +++ b/netbox/netbox/tests/dummy_plugin/urls.py @@ -6,4 +6,6 @@ from . import views urlpatterns = ( path('models/', views.DummyModelsView.as_view(), name='dummy_model_list'), path('models/add/', views.DummyModelAddView.as_view(), name='dummy_model_add'), + + path('netboxmodel//', views.DummyNetBoxModelView.as_view(), name='dummynetboxmodel'), ) diff --git a/netbox/netbox/tests/dummy_plugin/views.py b/netbox/netbox/tests/dummy_plugin/views.py index 82f250fc1..3aac26cf3 100644 --- a/netbox/netbox/tests/dummy_plugin/views.py +++ b/netbox/netbox/tests/dummy_plugin/views.py @@ -5,12 +5,17 @@ from django.http import HttpResponse from django.views.generic import View from dcim.models import Site +from netbox.views import generic from utilities.views import register_model_view -from .models import DummyModel +from .models import DummyModel, DummyNetBoxModel # Trigger registration of custom column from .tables import mycol # noqa: F401 +# +# DummyModel +# + class DummyModelsView(View): def get(self, request): @@ -32,6 +37,18 @@ class DummyModelAddView(View): return HttpResponse("Instance created") +# +# DummyNetBoxModel +# + +class DummyNetBoxModelView(generic.ObjectView): + queryset = DummyNetBoxModel.objects.all() + + +# +# API +# + @register_model_view(Site, 'extra', path='other-stuff') class ExtraCoreModelView(View): diff --git a/netbox/netbox/tests/test_models.py b/netbox/netbox/tests/test_models.py new file mode 100644 index 000000000..3da4144c2 --- /dev/null +++ b/netbox/netbox/tests/test_models.py @@ -0,0 +1,23 @@ +from unittest import skipIf + +from django.conf import settings +from django.test import TestCase + +from core.models import ObjectChange +from netbox.tests.dummy_plugin.models import DummyNetBoxModel + + +class ModelTest(TestCase): + + def test_get_absolute_url(self): + m = ObjectChange() + m.pk = 123 + + self.assertEqual(m.get_absolute_url(), f'/core/changelog/{m.pk}/') + + @skipIf('netbox.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") + def test_get_absolute_url_plugin(self): + m = DummyNetBoxModel() + m.pk = 123 + + self.assertEqual(m.get_absolute_url(), f'/plugins/dummy-plugin/netboxmodel/{m.pk}/')