mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-24 04:22:41 -06:00
Additional work for FR #20788 (#20973)
Some checks are pending
CI / build (20.x, 3.12) (push) Waiting to run
CI / build (20.x, 3.13) (push) Waiting to run
CI / build (20.x, 3.14) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, actions) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
Some checks are pending
CI / build (20.x, 3.12) (push) Waiting to run
CI / build (20.x, 3.13) (push) Waiting to run
CI / build (20.x, 3.14) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, actions) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from functools import cached_property
|
||||
|
||||
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
||||
from django.db import models
|
||||
@@ -177,15 +178,24 @@ class CabledObjectModel(models.Model):
|
||||
blank=True,
|
||||
null=True
|
||||
)
|
||||
cable_position = models.PositiveIntegerField(
|
||||
verbose_name=_('cable position'),
|
||||
cable_connector = models.PositiveSmallIntegerField(
|
||||
blank=True,
|
||||
null=True,
|
||||
validators=(
|
||||
MinValueValidator(CABLE_POSITION_MIN),
|
||||
MaxValueValidator(CABLE_POSITION_MAX)
|
||||
MinValueValidator(CABLE_CONNECTOR_MIN),
|
||||
MaxValueValidator(CABLE_CONNECTOR_MAX)
|
||||
),
|
||||
)
|
||||
cable_positions = ArrayField(
|
||||
base_field=models.PositiveSmallIntegerField(
|
||||
validators=(
|
||||
MinValueValidator(CABLE_POSITION_MIN),
|
||||
MaxValueValidator(CABLE_POSITION_MAX)
|
||||
)
|
||||
),
|
||||
blank=True,
|
||||
null=True,
|
||||
)
|
||||
mark_connected = models.BooleanField(
|
||||
verbose_name=_('mark connected'),
|
||||
default=False,
|
||||
@@ -210,18 +220,31 @@ class CabledObjectModel(models.Model):
|
||||
raise ValidationError({
|
||||
"cable_end": _("Must specify cable end (A or B) when attaching a cable.")
|
||||
})
|
||||
if self.cable_end and not self.cable:
|
||||
raise ValidationError({
|
||||
"cable_end": _("Cable end must not be set without a cable.")
|
||||
})
|
||||
if self.cable_position and not self.cable:
|
||||
raise ValidationError({
|
||||
"cable_position": _("Cable termination position must not be set without a cable.")
|
||||
})
|
||||
if self.mark_connected and self.cable:
|
||||
raise ValidationError({
|
||||
"mark_connected": _("Cannot mark as connected with a cable attached.")
|
||||
})
|
||||
if self.cable_connector and not self.cable_positions:
|
||||
raise ValidationError({
|
||||
"cable_positions": _("Must specify position(s) when specifying a cable connector.")
|
||||
})
|
||||
if self.cable_positions and not self.cable_connector:
|
||||
raise ValidationError({
|
||||
"cable_positions": _("Cable positions cannot be set without a cable connector.")
|
||||
})
|
||||
if self.mark_connected:
|
||||
raise ValidationError({
|
||||
"mark_connected": _("Cannot mark as connected with a cable attached.")
|
||||
})
|
||||
else:
|
||||
if self.cable_end:
|
||||
raise ValidationError({
|
||||
"cable_end": _("Cable end must not be set without a cable.")
|
||||
})
|
||||
if self.cable_connector:
|
||||
raise ValidationError({
|
||||
"cable_connector": _("Cable connector must not be set without a cable.")
|
||||
})
|
||||
if self.cable_positions:
|
||||
raise ValidationError({
|
||||
"cable_positions": _("Cable termination positions must not be set without a cable.")
|
||||
})
|
||||
|
||||
@property
|
||||
def link(self):
|
||||
@@ -256,6 +279,22 @@ class CabledObjectModel(models.Model):
|
||||
return None
|
||||
return CableEndChoices.SIDE_A if self.cable_end == CableEndChoices.SIDE_B else CableEndChoices.SIDE_B
|
||||
|
||||
def set_cable_termination(self, termination):
|
||||
"""Save attributes from the given CableTermination on the terminating object."""
|
||||
self.cable = termination.cable
|
||||
self.cable_end = termination.cable_end
|
||||
self.cable_connector = termination.connector
|
||||
self.cable_positions = termination.positions
|
||||
set_cable_termination.alters_data = True
|
||||
|
||||
def clear_cable_termination(self, termination):
|
||||
"""Clear all cable termination attributes from the terminating object."""
|
||||
self.cable = None
|
||||
self.cable_end = None
|
||||
self.cable_connector = None
|
||||
self.cable_positions = None
|
||||
clear_cable_termination.alters_data = True
|
||||
|
||||
|
||||
class PathEndpoint(models.Model):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user