7025 CircuitRedundancyGroups

This commit is contained in:
Arthur Hanson 2024-07-16 16:20:11 +07:00
parent b0e7294bc1
commit a4f84d6206
10 changed files with 152 additions and 0 deletions

View File

@ -76,3 +76,17 @@ class CircuitTerminationPortSpeedChoices(ChoiceSet):
(1544, 'T1 (1.544 Mbps)'), (1544, 'T1 (1.544 Mbps)'),
(2048, 'E1 (2.048 Mbps)'), (2048, 'E1 (2.048 Mbps)'),
] ]
class CircuitPriorityChoices(ChoiceSet):
PRIORITY_PRIMARY = 'primary'
PRIORITY_SECONDARY = 'secondary'
PRIORITY_TERTIARY = 'tertiary'
PRIORITY_INACTIVE = 'inactive'
CHOICES = (
(PRIORITY_PRIMARY, _('Primary')),
(PRIORITY_SECONDARY, _('Secondary')),
(PRIORITY_TERTIARY, _('Tertiary')),
(PRIORITY_INACTIVE, _('Inactive')),
)

View File

@ -13,6 +13,7 @@ from .models import *
__all__ = ( __all__ = (
'CircuitFilterSet', 'CircuitFilterSet',
'CircuitRedundancyGroupFilterSet',
'CircuitTerminationFilterSet', 'CircuitTerminationFilterSet',
'CircuitTypeFilterSet', 'CircuitTypeFilterSet',
'ProviderNetworkFilterSet', 'ProviderNetworkFilterSet',
@ -303,3 +304,18 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet):
Q(pp_info__icontains=value) | Q(pp_info__icontains=value) |
Q(description__icontains=value) Q(description__icontains=value)
).distinct() ).distinct()
class CircuitRedundancyGroupFilterSet(NetBoxModelFilterSet):
class Meta:
model = CircuitRedundancyGroup
fields = ('id', 'name',)
def search(self, queryset, name, value):
if not value.strip():
return queryset
return queryset.filter(
Q(name__icontains=value) |
Q(comments__icontains=value)
).distinct()

View File

@ -11,6 +11,7 @@ from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugFiel
__all__ = ( __all__ = (
'CircuitImportForm', 'CircuitImportForm',
'CircuitRedundancyGroupImportForm',
'CircuitTerminationImportForm', 'CircuitTerminationImportForm',
'CircuitTerminationImportRelatedForm', 'CircuitTerminationImportRelatedForm',
'CircuitTypeImportForm', 'CircuitTypeImportForm',
@ -150,3 +151,10 @@ class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTermination
'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id',
'pp_info', 'description', 'tags' 'pp_info', 'description', 'tags'
] ]
class CircuitRedundancyGroupImportForm(NetBoxModelImportForm):
class Meta:
model = CircuitRedundancyGroup
fields = ('name', 'tags')

View File

@ -13,6 +13,7 @@ from utilities.forms.widgets import DatePicker, NumberWithOptions
__all__ = ( __all__ = (
'CircuitFilterForm', 'CircuitFilterForm',
'CircuitRedundancyGroupFilterForm',
'CircuitTerminationFilterForm', 'CircuitTerminationFilterForm',
'CircuitTypeFilterForm', 'CircuitTypeFilterForm',
'ProviderFilterForm', 'ProviderFilterForm',
@ -230,3 +231,12 @@ class CircuitTerminationFilterForm(NetBoxModelFilterSetForm):
label=_('Provider') label=_('Provider')
) )
tag = TagFilterField(model) tag = TagFilterField(model)
class CircuitRedundancyGroupFilterForm(NetBoxModelFilterSetForm):
model = CircuitRedundancyGroup
fieldsets = (
FieldSet('q', 'filter_id', 'tag'),
)
selector_fields = ('filter_id', 'q', )
tag = TagFilterField(model)

View File

@ -12,6 +12,7 @@ from utilities.forms.widgets import DatePicker, NumberWithOptions
__all__ = ( __all__ = (
'CircuitForm', 'CircuitForm',
'CircuitRedundancyGroupForm',
'CircuitTerminationForm', 'CircuitTerminationForm',
'CircuitTypeForm', 'CircuitTypeForm',
'ProviderForm', 'ProviderForm',
@ -171,3 +172,14 @@ class CircuitTerminationForm(NetBoxModelForm):
options=CircuitTerminationPortSpeedChoices options=CircuitTerminationPortSpeedChoices
), ),
} }
class CircuitRedundancyGroupForm(TenancyForm, NetBoxModelForm):
comments = CommentField()
class Meta:
model = CircuitRedundancyGroup
fields = [
'name', 'tenant_group', 'tenant',
'comments', 'tags',
]

View File

@ -11,6 +11,8 @@ from utilities.fields import ColorField
__all__ = ( __all__ = (
'Circuit', 'Circuit',
'CircuitGroupAssignment',
'CircuitRedundancyGroup',
'CircuitTermination', 'CircuitTermination',
'CircuitType', 'CircuitType',
) )
@ -151,6 +153,39 @@ class Circuit(ContactsMixin, ImageAttachmentsMixin, PrimaryModel):
raise ValidationError({'provider_account': "The assigned account must belong to the assigned provider."}) raise ValidationError({'provider_account': "The assigned account must belong to the assigned provider."})
class CircuitRedundancyGroup(PrimaryModel):
"""
"""
name = models.CharField(
verbose_name=_('name'),
max_length=100
)
slug = models.SlugField(
verbose_name=_('slug'),
max_length=100
)
circuits = models.ManyToManyField(Circuit, through='CircuitGroupAssignment')
class Meta:
ordering = ('name', 'pk') # Name may be non-unique
verbose_name = _('Circuit redundancy group')
verbose_name_plural = _('Circuit redundancy group')
def get_absolute_url(self):
return reverse('circuits:circuitredundancygroup', args=[self.pk])
class CircuitGroupAssignment(models.Model):
circuit = models.ForeignKey(Circuit, on_delete=models.CASCADE)
group = models.ForeignKey(CircuitRedundancyGroup, on_delete=models.CASCADE)
priority = models.CharField(
verbose_name=_('priority'),
max_length=50,
choices=CircuitPriorityChoices,
blank=True
)
class CircuitTermination( class CircuitTermination(
CustomFieldsMixin, CustomFieldsMixin,
CustomLinksMixin, CustomLinksMixin,

View File

@ -9,6 +9,7 @@ from netbox.tables import NetBoxTable, columns
from .columns import CommitRateColumn from .columns import CommitRateColumn
__all__ = ( __all__ = (
'CircuitRedundancyGroupTable',
'CircuitTable', 'CircuitTable',
'CircuitTerminationTable', 'CircuitTerminationTable',
'CircuitTypeTable', 'CircuitTypeTable',
@ -119,3 +120,13 @@ class CircuitTerminationTable(NetBoxTable):
'xconnect_id', 'pp_info', 'description', 'created', 'last_updated', 'actions', 'xconnect_id', 'pp_info', 'description', 'created', 'last_updated', 'actions',
) )
default_columns = ('pk', 'id', 'circuit', 'provider', 'term_side', 'description') default_columns = ('pk', 'id', 'circuit', 'provider', 'term_side', 'description')
class CircuitRedundancyGroupTable(NetBoxTable):
class Meta(NetBoxTable.Meta):
model = CircuitRedundancyGroup
fields = (
'pk', 'name', 'created', 'last_updated', 'actions',
)
default_columns = ('pk', 'name',)

View File

@ -55,4 +55,11 @@ urlpatterns = [
path('circuit-terminations/delete/', views.CircuitTerminationBulkDeleteView.as_view(), name='circuittermination_bulk_delete'), path('circuit-terminations/delete/', views.CircuitTerminationBulkDeleteView.as_view(), name='circuittermination_bulk_delete'),
path('circuit-terminations/<int:pk>/', include(get_model_urls('circuits', 'circuittermination'))), path('circuit-terminations/<int:pk>/', include(get_model_urls('circuits', 'circuittermination'))),
# Circuit Redundacy Groups
path('circuit-redundancy-groups/', views.CircuitRedundancyGroupListView.as_view(), name='circuitredundancygroup_list'),
path('circuit-redundancy-groups/add/', views.CircuitRedundancyGroupEditView.as_view(), name='circuitredundancygroup_add'),
path('circuit-redundancy-groups/import/', views.CircuitRedundancyGroupBulkImportView.as_view(), name='circuitredundancygroup_import'),
# path('circuit-redundancy-groups/edit/', views.CircuitRedundancyGroupBulkEditView.as_view(), name='circuitredundancygroup_bulk_edit'),
path('circuit-redundancy-groups/delete/', views.CircuitRedundancyGroupBulkDeleteView.as_view(), name='circuitredundancygroup_bulk_delete'),
path('circuit-redundancy-groups/<int:pk>/', include(get_model_urls('circuits', 'circuitredundancygroup'))),
] ]

View File

@ -440,3 +440,41 @@ class CircuitTerminationBulkDeleteView(generic.BulkDeleteView):
# Trace view # Trace view
register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView) register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermination})(PathTraceView)
#
# Circuit Redundacy Groups
#
class CircuitRedundancyGroupListView(generic.ObjectListView):
queryset = CircuitRedundancyGroup.objects.all()
filterset = filtersets.CircuitRedundancyGroupFilterSet
filterset_form = forms.CircuitRedundancyGroupFilterForm
table = tables.CircuitRedundancyGroupTable
@register_model_view(CircuitRedundancyGroup)
class CircuitRedundancyGroupView(generic.ObjectView):
queryset = CircuitRedundancyGroup.objects.all()
@register_model_view(CircuitRedundancyGroup, 'edit')
class CircuitRedundancyGroupEditView(generic.ObjectEditView):
queryset = CircuitRedundancyGroup.objects.all()
form = forms.CircuitRedundancyGroupForm
@register_model_view(CircuitRedundancyGroup, 'delete')
class CircuitRedundancyGroupDeleteView(generic.ObjectDeleteView):
queryset = CircuitRedundancyGroup.objects.all()
class CircuitRedundancyGroupBulkImportView(generic.BulkImportView):
queryset = CircuitRedundancyGroup.objects.all()
model_form = forms.CircuitRedundancyGroupImportForm
class CircuitRedundancyGroupBulkDeleteView(generic.BulkDeleteView):
queryset = CircuitRedundancyGroup.objects.all()
filterset = filtersets.CircuitRedundancyGroupFilterSet
table = tables.CircuitRedundancyGroupTable

View File

@ -259,6 +259,7 @@ CIRCUITS_MENU = Menu(
get_model_item('circuits', 'circuit', _('Circuits')), get_model_item('circuits', 'circuit', _('Circuits')),
get_model_item('circuits', 'circuittype', _('Circuit Types')), get_model_item('circuits', 'circuittype', _('Circuit Types')),
get_model_item('circuits', 'circuittermination', _('Circuit Terminations')), get_model_item('circuits', 'circuittermination', _('Circuit Terminations')),
get_model_item('circuits', 'circuitredundancygroup', _('Circuit Redundancy Groups')),
), ),
), ),
MenuGroup( MenuGroup(