From e80428e5a19ef2d97b94ee03abec2bd9ce537407 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 23 Feb 2023 15:19:33 -0500 Subject: [PATCH] ObjectCountsWidget: Identify models by app_label & name --- netbox/extras/constants.py | 12 ++++++------ netbox/extras/dashboard/widgets.py | 20 ++++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/netbox/extras/constants.py b/netbox/extras/constants.py index 0474582ee..12ff21b31 100644 --- a/netbox/extras/constants.py +++ b/netbox/extras/constants.py @@ -12,9 +12,9 @@ DEFAULT_DASHBOARD = [ 'title': 'IPAM', 'config': { 'models': [ - ContentType.objects.get_by_natural_key('ipam', 'aggregate').pk, - ContentType.objects.get_by_natural_key('ipam', 'prefix').pk, - ContentType.objects.get_by_natural_key('ipam', 'ipaddress').pk, + 'ipam.aggregate', + 'ipam.prefix', + 'ipam.ipaddress', ] } }, @@ -25,9 +25,9 @@ DEFAULT_DASHBOARD = [ 'title': 'DCIM', 'config': { 'models': [ - ContentType.objects.get_by_natural_key('dcim', 'site').pk, - ContentType.objects.get_by_natural_key('dcim', 'rack').pk, - ContentType.objects.get_by_natural_key('dcim', 'device').pk, + 'dcim.site', + 'dcim.rack', + 'dcim.device', ] } }, diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index 74e8390c9..8987f4d06 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -7,8 +7,8 @@ from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ from utilities.forms import BootstrapMixin -from utilities.forms.fields import ContentTypeMultipleChoiceField from utilities.templatetags.builtins.filters import render_markdown +from utilities.utils import content_type_identifier, content_type_name from .utils import register_widget __all__ = ( @@ -19,6 +19,13 @@ __all__ = ( ) +def get_content_type_labels(): + return [ + (content_type_identifier(ct), content_type_name(ct)) + for ct in ContentType.objects.order_by('app_label', 'model') + ] + + class DashboardWidget: title = None description = None @@ -83,18 +90,15 @@ class ObjectCountsWidget(DashboardWidget): template_name = 'extras/dashboard/widgets/objectcounts.html' class ConfigForm(BootstrapMixin, forms.Form): - # TODO: Track models by app label & name rather than ContentType ID - models = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all() + models = forms.MultipleChoiceField( + choices=get_content_type_labels ) - def clean_models(self): - return [obj.pk for obj in self.cleaned_data['models']] - def render(self, request): counts = [] for content_type_id in self.config['models']: - model = ContentType.objects.get(pk=content_type_id).model_class() + app_label, model_name = content_type_id.split('.') + model = ContentType.objects.get_by_natural_key(app_label, model_name).model_class() object_count = model.objects.restrict(request.user, 'view').count counts.append((model, object_count))