Add GraphQL and fix primary_ip missing

This commit is contained in:
Daniel Sheppard 2022-10-28 13:34:28 -05:00
parent f366edc3a1
commit 9aef6fe87a
5 changed files with 30 additions and 1 deletions

View File

@ -2,6 +2,7 @@ import graphene
from netbox.graphql.fields import ObjectField, ObjectListField from netbox.graphql.fields import ObjectField, ObjectListField
from .types import * from .types import *
from .types import VirtualDeviceContextType
class DCIMQuery(graphene.ObjectType): class DCIMQuery(graphene.ObjectType):
@ -121,3 +122,6 @@ class DCIMQuery(graphene.ObjectType):
virtual_chassis = ObjectField(VirtualChassisType) virtual_chassis = ObjectField(VirtualChassisType)
virtual_chassis_list = ObjectListField(VirtualChassisType) virtual_chassis_list = ObjectListField(VirtualChassisType)
virtual_device_context = ObjectField(VirtualDeviceContextType)
virtual_device_context_list = ObjectListField(VirtualDeviceContextType)

View File

@ -500,3 +500,12 @@ class VirtualChassisType(NetBoxObjectType):
model = models.VirtualChassis model = models.VirtualChassis
fields = '__all__' fields = '__all__'
filterset_class = filtersets.VirtualChassisFilterSet filterset_class = filtersets.VirtualChassisFilterSet
class VirtualDeviceContextType(NetBoxObjectType):
class Meta:
model = models.VirtualDeviceContext
fields = '__all__'
filterset_class = filtersets.VirtualDeviceContextFilterSet

View File

@ -1206,3 +1206,14 @@ class VirtualDeviceContext(NetBoxModel):
def get_absolute_url(self): def get_absolute_url(self):
return reverse('dcim:virtualdevicecontext', kwargs={'pk': self.pk}) return reverse('dcim:virtualdevicecontext', kwargs={'pk': self.pk})
@property
def primary_ip(self):
if ConfigItem('PREFER_IPV4')() and self.primary_ip4:
return self.primary_ip4
elif self.primary_ip6:
return self.primary_ip6
elif self.primary_ip4:
return self.primary_ip4
else:
return None

View File

@ -61,6 +61,10 @@
<h2><a href="{% url 'dcim:device_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.device_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.device_count }}</a></h2> <h2><a href="{% url 'dcim:device_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.device_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.device_count }}</a></h2>
<p>Devices</p> <p>Devices</p>
</div> </div>
<div class="col col-md-4 text-center">
<h2><a href="{% url 'dcim:virtualdevicecontext_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.vdc_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.vdc_count }}</a></h2>
<p>Virtual Device Contexts</p>
</div>
<div class="col col-md-4 text-center"> <div class="col col-md-4 text-center">
<h2><a href="{% url 'dcim:cable_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.cable_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.cable_count }}</a></h2> <h2><a href="{% url 'dcim:cable_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.cable_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.cable_count }}</a></h2>
<p>Cables</p> <p>Cables</p>

View File

@ -2,7 +2,7 @@ from django.contrib.contenttypes.models import ContentType
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from circuits.models import Circuit from circuits.models import Circuit
from dcim.models import Cable, Device, Location, Rack, RackReservation, Site from dcim.models import Cable, Device, Location, Rack, RackReservation, Site, VirtualDeviceContext
from ipam.models import Aggregate, IPAddress, IPRange, Prefix, VLAN, VRF, ASN from ipam.models import Aggregate, IPAddress, IPRange, Prefix, VLAN, VRF, ASN
from netbox.views import generic from netbox.views import generic
from utilities.utils import count_related from utilities.utils import count_related
@ -109,6 +109,7 @@ class TenantView(generic.ObjectView):
'rackreservation_count': RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'rackreservation_count': RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'location_count': Location.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'location_count': Location.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'device_count': Device.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'device_count': Device.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'vdc_count': VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'vrf_count': VRF.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'vrf_count': VRF.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'aggregate_count': Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance).count(),
'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'prefix_count': Prefix.objects.restrict(request.user, 'view').filter(tenant=instance).count(),