13230 forms, detail views

This commit is contained in:
Arthur 2023-10-20 16:05:51 -07:00
parent 3bfff2e6a0
commit 9838054085
6 changed files with 32 additions and 12 deletions

View File

@ -291,6 +291,11 @@ class RackBulkEditForm(NetBoxModelBulkEditForm):
required=False,
label=_('Height (U)')
)
exclude_from_utilization = forms.NullBooleanField(
required=False,
widget=BulkEditNullBooleanSelect,
label=_('Descending units')
)
desc_units = forms.NullBooleanField(
required=False,
widget=BulkEditNullBooleanSelect,
@ -344,7 +349,8 @@ class RackBulkEditForm(NetBoxModelBulkEditForm):
(_('Rack'), ('status', 'role', 'tenant', 'serial', 'asset_tag', 'description')),
(_('Location'), ('region', 'site_group', 'site', 'location')),
(_('Hardware'), (
'type', 'width', 'u_height', 'desc_units', 'outer_width', 'outer_depth', 'outer_unit', 'mounting_depth',
'type', 'width', 'u_height', 'exclude_from_utilization', 'desc_units', 'outer_width', 'outer_depth',
'outer_unit', 'mounting_depth',
)),
(_('Weight'), ('weight', 'max_weight', 'weight_unit')),
)
@ -420,6 +426,11 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm):
widget=BulkEditNullBooleanSelect(),
label=_('Is full depth')
)
exclude_from_utilization = forms.NullBooleanField(
required=False,
widget=BulkEditNullBooleanSelect(),
label=_('Exclude from utilization')
)
airflow = forms.ChoiceField(
label=_('Airflow'),
choices=add_blank_choice(DeviceAirflowChoices),

View File

@ -335,8 +335,8 @@ class DeviceTypeImportForm(NetBoxModelImportForm):
class Meta:
model = DeviceType
fields = [
'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth',
'subdevice_role', 'airflow', 'description', 'weight', 'weight_unit', 'comments', 'tags',
'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization',
'is_full_depth', 'subdevice_role', 'airflow', 'description', 'weight', 'weight_unit', 'comments', 'tags',
]

View File

@ -302,7 +302,8 @@ class DeviceTypeForm(NetBoxModelForm):
fieldsets = (
(_('Device Type'), ('manufacturer', 'model', 'slug', 'default_platform', 'description', 'tags')),
(_('Chassis'), (
'u_height', 'is_full_depth', 'part_number', 'subdevice_role', 'airflow', 'weight', 'weight_unit',
'u_height', 'exclude_from_utilization', 'is_full_depth', 'part_number', 'subdevice_role', 'airflow',
'weight', 'weight_unit',
)),
(_('Images'), ('front_image', 'rear_image')),
)
@ -310,9 +311,9 @@ class DeviceTypeForm(NetBoxModelForm):
class Meta:
model = DeviceType
fields = [
'manufacturer', 'model', 'slug', 'default_platform', 'part_number', 'u_height', 'is_full_depth',
'subdevice_role', 'airflow', 'weight', 'weight_unit', 'front_image', 'rear_image', 'description',
'comments', 'tags',
'manufacturer', 'model', 'slug', 'default_platform', 'part_number', 'u_height', 'exclude_from_utilization',
'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'front_image', 'rear_image',
'description', 'comments', 'tags',
]
widgets = {
'front_image': ClearableFileInput(attrs={

View File

@ -357,7 +357,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin):
return [u for u in elevation.values()]
def get_available_units(self, u_height=1, rack_face=None, exclude=None):
def get_available_units(self, u_height=1, rack_face=None, exclude=None, exclude_from_utilization=False):
"""
Return a list of units within the rack available to accommodate a device of a given U height (default 1).
Optionally exclude one or more devices when calculating empty units (needed when moving a device from one
@ -369,6 +369,9 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin):
"""
# Gather all devices which consume U space within the rack
devices = self.devices.prefetch_related('device_type').filter(position__gte=1)
if exclude_from_utilization:
devices = devices.exclude(device_type__exclude_from_utilization=True)
if exclude is not None:
devices = devices.exclude(pk__in=exclude)
@ -453,7 +456,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin):
"""
# Determine unoccupied units
total_units = len(list(self.units))
available_units = self.get_available_units(u_height=0.5)
available_units = self.get_available_units(u_height=0.5, exclude_from_utilization=True)
# Remove reserved units
for ru in self.get_reserved_units():

View File

@ -98,6 +98,7 @@ class DeviceTypeTable(NetBoxTable):
verbose_name=_('U Height'),
template_code='{{ value|floatformat }}'
)
exclude_from_utilization = columns.BooleanColumn()
weight = columns.TemplateColumn(
verbose_name=_('Weight'),
template_code=WEIGHT,
@ -142,9 +143,9 @@ class DeviceTypeTable(NetBoxTable):
class Meta(NetBoxTable.Meta):
model = models.DeviceType
fields = (
'pk', 'id', 'model', 'manufacturer', 'default_platform', 'slug', 'part_number', 'u_height', 'is_full_depth',
'subdevice_role', 'airflow', 'weight', 'description', 'comments', 'instance_count', 'tags', 'created',
'last_updated',
'pk', 'id', 'model', 'manufacturer', 'default_platform', 'slug', 'part_number', 'u_height',
'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight',
'description', 'comments', 'instance_count', 'tags', 'created', 'last_updated',
)
default_columns = (
'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count',

View File

@ -40,6 +40,10 @@
<td>{% trans "Height (U" %})</td>
<td>{{ object.u_height|floatformat }}</td>
</tr>
<tr>
<td>{% trans "Exclude From Utilization" %})</td>
<td>{% checkmark object.exclude_from_utilization %}</td>
</tr>
<tr>
<td>{% trans "Full Depth" %}</td>
<td>{% checkmark object.is_full_depth %}</td>