mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-08 16:48:16 -06:00
7025 CircuitRedundancyGroups
This commit is contained in:
parent
b0e7294bc1
commit
a4f84d6206
@ -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')),
|
||||||
|
)
|
||||||
|
@ -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()
|
||||||
|
@ -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')
|
||||||
|
@ -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)
|
||||||
|
@ -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',
|
||||||
|
]
|
||||||
|
@ -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,
|
||||||
|
@ -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',)
|
||||||
|
@ -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'))),
|
||||||
]
|
]
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
Loading…
Reference in New Issue
Block a user