diff --git a/netbox_access_lists/api/serializers.py b/netbox_access_lists/api/serializers.py index e47ef76..a5b92db 100644 --- a/netbox_access_lists/api/serializers.py +++ b/netbox_access_lists/api/serializers.py @@ -1,6 +1,7 @@ from rest_framework import serializers from ipam.api.serializers import NestedPrefixSerializer +from dcim.api.serializers import NestedDeviceSerializer from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer from ..models import AccessList, AccessListRule @@ -16,7 +17,7 @@ class NestedAccessListSerializer(WritableNestedSerializer): class Meta: model = AccessList - fields = ('id', 'url', 'display', 'name') + fields = ('id', 'url', 'display', 'name', 'device') class NestedAccessListRuleSerializer(WritableNestedSerializer): @@ -38,11 +39,12 @@ class AccessListSerializer(NetBoxModelSerializer): view_name='plugins-api:netbox_access_lists-api:accesslist-detail' ) rule_count = serializers.IntegerField(read_only=True) + device = NestedDeviceSerializer() class Meta: model = AccessList fields = ( - 'id', 'url', 'display', 'name', 'type', 'default_action', 'comments', 'tags', 'custom_fields', 'created', + 'id', 'url', 'display', 'name', 'device', 'type', 'default_action', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'rule_count', ) diff --git a/netbox_access_lists/api/views.py b/netbox_access_lists/api/views.py index 8773eb3..fa477dc 100644 --- a/netbox_access_lists/api/views.py +++ b/netbox_access_lists/api/views.py @@ -7,7 +7,9 @@ from .serializers import AccessListSerializer, AccessListRuleSerializer class AccessListViewSet(NetBoxModelViewSet): - queryset = models.AccessList.objects.prefetch_related('tags').annotate( + queryset = models.AccessList.objects.prefetch_related( + 'device', 'tags' + ).annotate( rule_count=Count('rules') ) serializer_class = AccessListSerializer diff --git a/netbox_access_lists/filtersets.py b/netbox_access_lists/filtersets.py index b5bbdbd..a588dbf 100644 --- a/netbox_access_lists/filtersets.py +++ b/netbox_access_lists/filtersets.py @@ -5,7 +5,7 @@ from .models import AccessList, AccessListRule class AccessListFilterSet(NetBoxModelFilterSet): class Meta: model = AccessList - fields = ('id', 'name', 'type', 'default_action', 'comments') + fields = ('id', 'name', 'device', 'type', 'default_action', 'comments') def search(self, queryset, name, value): return queryset.filter(description__icontains=value) diff --git a/netbox_access_lists/forms.py b/netbox_access_lists/forms.py index 30625dd..8c43f75 100644 --- a/netbox_access_lists/forms.py +++ b/netbox_access_lists/forms.py @@ -16,7 +16,7 @@ class AccessListForm(NetBoxModelForm): class Meta: model = AccessList - fields = ('name', 'type', 'default_action', 'comments', 'tags') + fields = ('name', 'device', 'type', 'default_action', 'comments', 'tags') class AccessListFilterForm(NetBoxModelFilterSetForm): diff --git a/netbox_access_lists/migrations/0001_initial.py b/netbox_access_lists/migrations/0001_initial.py index c744eca..e1f7f4d 100644 --- a/netbox_access_lists/migrations/0001_initial.py +++ b/netbox_access_lists/migrations/0001_initial.py @@ -23,13 +23,15 @@ class Migration(migrations.Migration): ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)), ('name', models.CharField(max_length=100)), + ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='access_lists', to='dcim.device')), ('type', models.CharField(max_length=100)), ('default_action', models.CharField(max_length=30)), ('comments', models.TextField(blank=True)), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), ], options={ - 'ordering': ('name',), + 'ordering': ('name', 'device'), + 'unique_together': {('name', 'device')}, }, ), migrations.CreateModel( diff --git a/netbox_access_lists/models.py b/netbox_access_lists/models.py index 36b9fcb..2b28748 100644 --- a/netbox_access_lists/models.py +++ b/netbox_access_lists/models.py @@ -40,6 +40,11 @@ class AccessList(NetBoxModel): name = models.CharField( max_length=100 ) + device = models.ForeignKey( + to='dcim.Device', + on_delete=models.CASCADE, + related_name='access_lists' + ) type = models.CharField( max_length=30, choices=AccessListTypeChoices @@ -54,7 +59,7 @@ class AccessList(NetBoxModel): ) class Meta: - ordering = ('name',) + ordering = ('name', 'device') def __str__(self): return self.name diff --git a/netbox_access_lists/tables.py b/netbox_access_lists/tables.py index d7e5f61..1f5ba54 100644 --- a/netbox_access_lists/tables.py +++ b/netbox_access_lists/tables.py @@ -8,6 +8,9 @@ class AccessListTable(NetBoxTable): name = tables.Column( linkify=True ) + device = tables.Column( + linkify=True + ) type = ChoiceFieldColumn() default_action = ChoiceFieldColumn() rule_count = tables.Column() @@ -17,8 +20,8 @@ class AccessListTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = AccessList - fields = ('pk', 'id', 'name', 'type', 'rule_count', 'default_action', 'comments', 'actions', 'tags') - default_columns = ('name', 'type', 'rule_count', 'default_action', 'tags') + fields = ('pk', 'id', 'name', 'device', 'type', 'rule_count', 'default_action', 'comments', 'actions', 'tags') + default_columns = ('name', 'device', 'type', 'rule_count', 'default_action', 'tags') class AccessListRuleTable(NetBoxTable):