Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issues identified by tests #40

Merged
merged 4 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions netbox_routing/api/_serializers/ospf.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class OSPFInstanceSerializer(NetBoxModelSerializer):

class Meta:
model = OSPFInstance
fields = ('url', 'id', 'display', 'name', 'router_id', 'process_id', 'device', 'description', 'comments',)
brief_fields = ('url', 'id', 'display', 'name', 'router_id', 'process_id', 'device')
fields = ('url', 'id', 'display', 'name', 'router_id', 'process_id', 'device', 'description', 'comments', )
brief_fields = ('url', 'id', 'display', 'name', 'router_id', 'process_id', 'device', )


class OSPFAreaSerializer(NetBoxModelSerializer):
Expand All @@ -29,7 +29,7 @@ class OSPFAreaSerializer(NetBoxModelSerializer):
class Meta:
model = OSPFArea
fields = ('url', 'id', 'display', 'area_id', 'description', 'comments',)
brief_fields = ('url', 'id', 'display', 'area_id')
brief_fields = ('url', 'id', 'display', 'area_id',)


class OSPFInterfaceSerializer(NetBoxModelSerializer):
Expand Down
2 changes: 0 additions & 2 deletions netbox_routing/fields/ip.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ def to_python(self, value):
raise ValidationError(e)

def get_prep_value(self, value):
if not value:
return None
if isinstance(value, list):
return [str(self.to_python(v)) for v in value]
return str(self.to_python(value))
Expand Down
46 changes: 45 additions & 1 deletion netbox_routing/filtersets/ospf.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from django.db.models import Q
from django.utils.translation import gettext as _

from dcim.models import Device
from dcim.models import Device, Interface
from utilities.filters import MultiValueCharFilter

from netbox.filtersets import NetBoxModelFilterSet
Expand Down Expand Up @@ -83,6 +83,50 @@ def filter_aid(self, queryset, name, value):


class OSPFInterfaceFilterSet(NetBoxModelFilterSet):
instance_id = django_filters.ModelMultipleChoiceFilter(
field_name='instance',
queryset=OSPFInstance.objects.all(),
label='Instance (ID)',
)
instance = django_filters.ModelMultipleChoiceFilter(
field_name='instance__name',
queryset=OSPFInstance.objects.all(),
to_field_name='name',
label='Instance',
)
area_id = django_filters.ModelMultipleChoiceFilter(
field_name='area',
queryset=OSPFArea.objects.all(),
label='Area (ID)',
)
area = django_filters.ModelMultipleChoiceFilter(
field_name='area__area_id',
queryset=OSPFArea.objects.all(),
to_field_name='area_id',
label='Area',
)
device_id = django_filters.ModelMultipleChoiceFilter(
field_name='interface__device',
queryset=Device.objects.all(),
label='Device (ID)',
)
device = django_filters.ModelMultipleChoiceFilter(
field_name='interface__device__name',
queryset=Device.objects.all(),
to_field_name='name',
label='Device',
)
interface_id = django_filters.ModelMultipleChoiceFilter(
field_name='interface',
queryset=Interface.objects.all(),
label='Area (ID)',
)
interface = django_filters.ModelMultipleChoiceFilter(
field_name='interface__name',
queryset=Interface.objects.all(),
to_field_name='name',
label='Area',
)

class Meta:
model = OSPFInterface
Expand Down
5 changes: 5 additions & 0 deletions netbox_routing/forms/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,19 @@

# OSPF
'OSPFAreaForm',
'OSPFAreaBulkEditForm',
'OSPFAreaImportForm',
'OSPFAreaFilterForm',

'OSPFInstanceForm',
'OSPFInstanceBulkEditForm',
'OSPFInstanceFilterForm',
'OSPFInstanceImportForm',

'OSPFInterfaceForm',
'OSPFInterfaceFilterForm',
'OSPFInterfaceBulkEditForm',
'OSPFInterfaceImportForm',

'BGPRouterForm',
'BGPScopeForm',
Expand Down
4 changes: 3 additions & 1 deletion netbox_routing/forms/bulk_edit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
from .static import *
from .objects import *
from .ospf import OSPFInterfaceBulkEditForm
from .ospf import *


__all__ = (
# Staticroute
'StaticRouteBulkEditForm',

# OSPF
'OSPFInstanceBulkEditForm',
'OSPFInterfaceBulkEditForm',
'OSPFAreaBulkEditForm',

# Route Objects
'PrefixListEntryBulkEditForm',
Expand Down
52 changes: 51 additions & 1 deletion netbox_routing/forms/bulk_edit/ospf.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,62 @@
from django import forms
from django.utils.translation import gettext as _

from dcim.models import Device
from netbox.forms import NetBoxModelBulkEditForm
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice
from utilities.forms.fields import DynamicModelChoiceField
from utilities.forms.fields import DynamicModelChoiceField, CommentField

from netbox_routing import choices
from netbox_routing.models import OSPFArea, OSPFInstance, OSPFInterface

__all__ = (
'OSPFInterfaceBulkEditForm',
'OSPFInstanceBulkEditForm',
'OSPFAreaBulkEditForm',
)

from utilities.forms.rendering import FieldSet


class OSPFInstanceBulkEditForm(NetBoxModelBulkEditForm):
device = DynamicModelChoiceField(
queryset=Device.objects.all(),
label=_('Device'),
required=False,
selector=True
)

description = forms.CharField(
label=_('Description'),
max_length=200,
required=False
)
comments = CommentField()

model = OSPFInstance
fieldsets = (
FieldSet('device', name='OSPF'),
FieldSet('description', ),
)
nullable_fields = ()


class OSPFAreaBulkEditForm(NetBoxModelBulkEditForm):

description = forms.CharField(
label=_('Description'),
max_length=200,
required=False
)
comments = CommentField()

model = OSPFArea
fieldsets = (
FieldSet('description'),
)
nullable_fields = ()


class OSPFInterfaceBulkEditForm(NetBoxModelBulkEditForm):
instance = DynamicModelChoiceField(
queryset=OSPFInstance.objects.all(),
Expand All @@ -37,9 +79,17 @@ class OSPFInterfaceBulkEditForm(NetBoxModelBulkEditForm):
)
passphrase = forms.CharField(label=_('Passphrase'), required=False)

description = forms.CharField(
label=_('Description'),
max_length=200,
required=False
)
comments = CommentField()

model = OSPFInterface
fieldsets = (
FieldSet('instance', 'area', name='OSPF'),
FieldSet('priority', 'bfd', 'authentication', 'passphrase', name='Attributes'),
FieldSet('description'),
)
nullable_fields = ()
11 changes: 9 additions & 2 deletions netbox_routing/forms/bulk_edit/static.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from ipam.models import VRF
from netbox.forms import NetBoxModelBulkEditForm
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, CommentField
from utilities.forms.rendering import FieldSet

from netbox_routing.models import StaticRoute
Expand All @@ -32,10 +32,17 @@ class StaticRouteBulkEditForm(NetBoxModelBulkEditForm):
metric = forms.IntegerField(label=_('Metric'), required=False)
permanent = forms.ChoiceField(label=_('Permanent'), choices=BOOLEAN_WITH_BLANK_CHOICES, required=False)

description = forms.CharField(
label=_('Description'),
max_length=200,
required=False
)
comments = CommentField()

model = StaticRoute
fieldsets = (
FieldSet('devices', 'vrf', 'prefix', 'next_hop', name='Route'),
FieldSet('metric', 'permanent', name='Attributes'),
FieldSet('description', 'comments')
FieldSet('description', )
)
nullable_fields = ('devices', 'vrf', 'metric', 'permanent', 'description', 'comments')
4 changes: 3 additions & 1 deletion netbox_routing/forms/bulk_import/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from .ospf import OSPFInterfaceImportForm
from .ospf import *


__all__ = (
# OSPF
'OSPFInstanceImportForm',
'OSPFAreaImportForm',
'OSPFInterfaceImportForm',
)

21 changes: 18 additions & 3 deletions netbox_routing/forms/ospf.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _

from dcim.models import Interface, Device
from netbox.forms import NetBoxModelForm
from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, CommentField

from netbox_routing.models import OSPFArea, OSPFInstance, OSPFInterface

Expand All @@ -23,23 +24,25 @@ class OSPFInstanceForm(NetBoxModelForm):
selector=True,
label=_('Device'),
)
comments = CommentField()

class Meta:
model = OSPFInstance
fields = ('name', 'router_id', 'process_id', 'device', 'description', 'comments', )


class OSPFAreaForm(NetBoxModelForm):
comments = CommentField()

class Meta:
model = OSPFArea
fields = ('area_id', 'description', 'comments', )
fields = ('area_id', 'description', 'comments', )


class OSPFInterfaceForm(NetBoxModelForm):
device = DynamicModelChoiceField(
queryset=Device.objects.all(),
required=True,
required=False,
selector=True,
label=_('Device'),
)
Expand Down Expand Up @@ -67,6 +70,7 @@ class OSPFInterfaceForm(NetBoxModelForm):
'device_id': '$device',
}
)
comments = CommentField()


class Meta:
Expand All @@ -84,3 +88,14 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.pk:
self.initial['device'] = self.instance.interface.device.pk

def clean(self):
super().clean()
if self.cleaned_data.get('instance') and self.cleaned_data.get('interface'):
if self.cleaned_data.get('instance').device != self.cleaned_data.get('interface').device:
raise ValidationError(
{
'instance': _('OSPF Instance Device and Interface Device must match'),
'interface': _('OSPF Instance Device and Interface Device must match')
}
)
3 changes: 2 additions & 1 deletion netbox_routing/forms/static.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from ipam.models import VRF
from netbox.forms import NetBoxModelForm
from netbox_routing.models import StaticRoute
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField
from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, CommentField


class StaticRouteForm(NetBoxModelForm):
Expand All @@ -14,6 +14,7 @@ class StaticRouteForm(NetBoxModelForm):
required=False,
label='VRF'
)
comments = CommentField()

class Meta:
model = StaticRoute
Expand Down
24 changes: 24 additions & 0 deletions netbox_routing/graphql/filters.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from typing import Annotated

import strawberry
import strawberry_django

from netbox_routing import filtersets, models
Expand All @@ -6,6 +9,9 @@

__all__ = (
'StaticRouteFilter',
'OSPFInstanceFilter',
'OSPFAreaFilter',
'OSPFInterfaceFilter',
)


Expand All @@ -14,3 +20,21 @@
class StaticRouteFilter(BaseFilterMixin):
prefix: str
next_hop: str


@strawberry_django.filter(models.OSPFInstance, lookups=True)
@autotype_decorator(filtersets.OSPFInstanceFilterSet)
class OSPFInstanceFilter(BaseFilterMixin):
router_id: str


@strawberry_django.filter(models.OSPFArea, lookups=True)
@autotype_decorator(filtersets.OSPFAreaFilterSet)
class OSPFAreaFilter(BaseFilterMixin):
pass


@strawberry_django.filter(models.OSPFInterface, lookups=True)
@autotype_decorator(filtersets.OSPFInterfaceFilterSet)
class OSPFInterfaceFilter(BaseFilterMixin):
pass
13 changes: 13 additions & 0 deletions netbox_routing/graphql/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,19 @@ class StaticRouteQuery:
static_route_list: List[StaticRouteType] = strawberry_django.field()


@strawberry.type(name="Query")
class OSPFQuery:
ospf_instance: OSPFInstanceType = strawberry_django.field()
ospf_instance_list: List[OSPFInstanceType] = strawberry_django.field()

ospf_area: OSPFAreaType = strawberry_django.field()
ospf_area_list: List[OSPFAreaType] = strawberry_django.field()

ospf_interface: OSPFInterfaceType = strawberry_django.field()
ospf_interface_list: List[OSPFInterfaceType] = strawberry_django.field()


schema = [
StaticRouteQuery,
OSPFQuery
]
Loading
Loading