From d5316de9c84daf258b43af002e1f156ac41c18cb Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Tue, 18 Feb 2025 23:02:57 +0100 Subject: [PATCH] Move contact queryset into model --- netbox/netbox/models/features.py | 21 +++++++++++++++++++++ netbox/tenancy/views.py | 16 ++-------------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index a97227770..70027a9fc 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -5,6 +5,7 @@ from functools import cached_property from django.contrib.contenttypes.fields import GenericRelation from django.core.validators import ValidationError from django.db import models +from django.db.models import Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ from taggit.managers import TaggableManager @@ -363,6 +364,26 @@ class ContactsMixin(models.Model): class Meta: abstract = True + def get_contacts(self): + """ + Return a `QuerySet` matching all contacts assigned to this object. + """ + from tenancy.models import ContactAssignment + from . import NestedGroupModel + + filter = Q() + for obj in [self]: + filter |= Q( + object_type=ObjectType.objects.get_for_model(obj), + object_id__in=( + obj.get_ancestors(include_self=True).values_list('pk', flat=True) + if isinstance(obj, NestedGroupModel) + else [obj.pk] + ), + ) + + return ContactAssignment.objects.filter(filter) + class BookmarksMixin(models.Model): """ diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 9bb542f82..3b5029bd7 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -2,7 +2,6 @@ from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ -from netbox.models import NestedGroupModel from netbox.views import generic from utilities.query import count_related from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view @@ -18,24 +17,13 @@ class ObjectContactsView(generic.ObjectChildrenView): template_name = 'tenancy/object_contacts.html' tab = ViewTab( label=_('Contacts'), - badge=lambda obj: obj.contacts.count(), + badge=lambda obj: obj.get_contacts().count(), permission='tenancy.view_contactassignment', weight=5000 ) def get_children(self, request, parent): - qs = ContactAssignment.objects.restrict(request.user, 'view') - for obj in [parent]: - qs = qs.filter( - object_type=ContentType.objects.get_for_model(obj), - object_id__in=( - obj.get_ancestors(include_self=True).values_list('pk', flat=True) - if isinstance(obj, NestedGroupModel) - else [obj.pk] - ), - ) - - return qs.order_by('priority', 'contact', 'role') + return parent.get_contacts().restrict(request.user, 'view').order_by('priority', 'contact', 'role') #