Просмотр исходного кода

Move contact queryset into model

Alexander Haase 1 год назад
Родитель
Сommit
d5316de9c8
2 измененных файлов с 23 добавлено и 14 удалено
  1. 21 0
      netbox/netbox/models/features.py
  2. 2 14
      netbox/tenancy/views.py

+ 21 - 0
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):
     """

+ 2 - 14
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')
 
 
 #