Merge branch 'develop' into feature

This commit is contained in:
jeremystretch 2022-11-30 16:21:20 -05:00
commit d0e0c2ff8b
13 changed files with 28 additions and 18 deletions

View File

@ -14,7 +14,7 @@ body:
attributes: attributes:
label: NetBox version label: NetBox version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.3.8 placeholder: v3.3.9
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -14,7 +14,7 @@ body:
attributes: attributes:
label: NetBox version label: NetBox version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v3.3.8 placeholder: v3.3.9
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@ -45,7 +45,7 @@ class DeviceConnectionsReport(Report):
# Check that every console port for every active device has a connection defined. # Check that every console port for every active device has a connection defined.
active = DeviceStatusChoices.STATUS_ACTIVE active = DeviceStatusChoices.STATUS_ACTIVE
for console_port in ConsolePort.objects.prefetch_related('device').filter(device__status=active): for console_port in ConsolePort.objects.prefetch_related('device').filter(device__status=active):
if console_port.connected_endpoint is None: if not console_port.connected_endpoints:
self.log_failure( self.log_failure(
console_port.device, console_port.device,
"No console connection defined for {}".format(console_port.name) "No console connection defined for {}".format(console_port.name)
@ -64,7 +64,7 @@ class DeviceConnectionsReport(Report):
for device in Device.objects.filter(status=DeviceStatusChoices.STATUS_ACTIVE): for device in Device.objects.filter(status=DeviceStatusChoices.STATUS_ACTIVE):
connected_ports = 0 connected_ports = 0
for power_port in PowerPort.objects.filter(device=device): for power_port in PowerPort.objects.filter(device=device):
if power_port.connected_endpoint is not None: if power_port.connected_endpoints:
connected_ports += 1 connected_ports += 1
if not power_port.path.is_active: if not power_port.path.is_active:
self.log_warning( self.log_warning(

View File

@ -1,6 +1,10 @@
# NetBox v3.3 # NetBox v3.3
## v3.3.9 (FUTURE) ## v3.3.10 (FUTURE)
---
## v3.3.9 (2022-11-30)
### Enhancements ### Enhancements
@ -21,6 +25,9 @@
* [#10969](https://github.com/netbox-community/netbox/issues/10969) - Update cable paths ending at associated rear port when creating new front ports * [#10969](https://github.com/netbox-community/netbox/issues/10969) - Update cable paths ending at associated rear port when creating new front ports
* [#10996](https://github.com/netbox-community/netbox/issues/10996) - Hide checkboxes on child object lists when no bulk operations are available * [#10996](https://github.com/netbox-community/netbox/issues/10996) - Hide checkboxes on child object lists when no bulk operations are available
* [#10997](https://github.com/netbox-community/netbox/issues/10997) - Fix exception when editing NAT IP for VM with no cluster * [#10997](https://github.com/netbox-community/netbox/issues/10997) - Fix exception when editing NAT IP for VM with no cluster
* [#11014](https://github.com/netbox-community/netbox/issues/11014) - Use natural ordering when sorting rack elevations by name
* [#11028](https://github.com/netbox-community/netbox/issues/11028) - Enable bulk clearing of color attribute of pass-through ports
* [#11047](https://github.com/netbox-community/netbox/issues/11047) - Cloning a rack reservation should replicate rack & user
--- ---

View File

@ -1321,7 +1321,7 @@ class FrontPortBulkEditForm(
fieldsets = ( fieldsets = (
(None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')), (None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')),
) )
nullable_fields = ('module', 'label', 'description') nullable_fields = ('module', 'label', 'description', 'color')
class RearPortBulkEditForm( class RearPortBulkEditForm(
@ -1332,7 +1332,7 @@ class RearPortBulkEditForm(
fieldsets = ( fieldsets = (
(None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')), (None, ('module', 'type', 'label', 'color', 'description', 'mark_connected')),
) )
nullable_fields = ('module', 'label', 'description') nullable_fields = ('module', 'label', 'description', 'color')
class ModuleBayBulkEditForm( class ModuleBayBulkEditForm(

View File

@ -197,7 +197,7 @@ class PathEndpoint(models.Model):
dcim.signals in response to changes in the cable path, and complements the `origin` GenericForeignKey field on the dcim.signals in response to changes in the cable path, and complements the `origin` GenericForeignKey field on the
CablePath model. `_path` should not be accessed directly; rather, use the `path` property. CablePath model. `_path` should not be accessed directly; rather, use the `path` property.
`connected_endpoint()` is a convenience method for returning the destination of the associated CablePath, if any. `connected_endpoints()` is a convenience method for returning the destination of the associated CablePath, if any.
""" """
_path = models.ForeignKey( _path = models.ForeignKey(
to='dcim.CablePath', to='dcim.CablePath',

View File

@ -486,6 +486,7 @@ class RackReservation(PrimaryModel):
max_length=200 max_length=200
) )
clone_fields = ('rack', 'user', 'tenant')
prerequisite_models = ( prerequisite_models = (
'dcim.Rack', 'dcim.Rack',
) )

View File

@ -653,17 +653,18 @@ class RackElevationListView(generic.ObjectListView):
racks = filtersets.RackFilterSet(request.GET, self.queryset).qs racks = filtersets.RackFilterSet(request.GET, self.queryset).qs
total_count = racks.count() total_count = racks.count()
# Ordering
ORDERING_CHOICES = { ORDERING_CHOICES = {
'name': 'Name (A-Z)', 'name': 'Name (A-Z)',
'-name': 'Name (Z-A)', '-name': 'Name (Z-A)',
'facility_id': 'Facility ID (A-Z)', 'facility_id': 'Facility ID (A-Z)',
'-facility_id': 'Facility ID (Z-A)', '-facility_id': 'Facility ID (Z-A)',
} }
sort = request.GET.get('sort', "name") sort = request.GET.get('sort', 'name')
if sort not in ORDERING_CHOICES: if sort not in ORDERING_CHOICES:
sort = 'name' sort = 'name'
sort_field = sort.replace("name", "_name") # Use natural ordering
racks = racks.order_by(sort) racks = racks.order_by(sort_field)
# Pagination # Pagination
per_page = get_paginate_count(request) per_page = get_paginate_count(request)

View File

@ -265,7 +265,7 @@
<th>Utilization</th> <th>Utilization</th>
</tr> </tr>
{% for powerport in object.powerports.all %} {% for powerport in object.powerports.all %}
{% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoint %} {% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoints.0 %}
<tr> <tr>
<td>{{ powerport }}</td> <td>{{ powerport }}</td>
<td>{{ utilization.outlet_count }}</td> <td>{{ utilization.outlet_count }}</td>

View File

@ -211,7 +211,7 @@
<div class="card"> <div class="card">
<h5 class="card-header">Wireless</h5> <h5 class="card-header">Wireless</h5>
<div class="card-body"> <div class="card-body">
{% with peer=object.connected_endpoint %} {% with peer=object.connected_endpoints.0 %}
<table class="table table-hover"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>

View File

@ -202,7 +202,7 @@
<td>{{ powerfeed|linkify }}</td> <td>{{ powerfeed|linkify }}</td>
<td>{% badge powerfeed.get_status_display bg_color=powerfeed.get_status_color %}</td> <td>{% badge powerfeed.get_status_display bg_color=powerfeed.get_status_color %}</td>
<td>{% badge powerfeed.get_type_display bg_color=powerfeed.get_type_color %}</td> <td>{% badge powerfeed.get_type_display bg_color=powerfeed.get_type_color %}</td>
{% with power_port=powerfeed.connected_endpoint %} {% with power_port=powerfeed.connected_endpoints.0 %}
{% if power_port %} {% if power_port %}
<td>{% utilization_graph power_port.get_power_draw.allocated|percentage:powerfeed.available_power %}</td> <td>{% utilization_graph power_port.get_power_draw.allocated|percentage:powerfeed.available_power %}</td>
{% else %} {% else %}

View File

@ -217,6 +217,7 @@ def status_from_tag(tag: str = "info") -> str:
'warning': 'warning', 'warning': 'warning',
'success': 'success', 'success': 'success',
'error': 'danger', 'error': 'danger',
'danger': 'danger',
'debug': 'info', 'debug': 'info',
'info': 'info', 'info': 'info',
} }

View File

@ -11,7 +11,7 @@ django-redis==5.2.0
django-rich==1.4.0 django-rich==1.4.0
django-rq==2.6.0 django-rq==2.6.0
django-tables2==2.4.1 django-tables2==2.4.1
django-taggit==3.0.0 django-taggit==3.1.0
django-timezone-field==5.0 django-timezone-field==5.0
djangorestframework==3.14.0 djangorestframework==3.14.0
drf-yasg[validation]==1.21.4 drf-yasg[validation]==1.21.4
@ -19,18 +19,18 @@ graphene-django==3.0.0
gunicorn==20.1.0 gunicorn==20.1.0
Jinja2==3.1.2 Jinja2==3.1.2
Markdown==3.3.7 Markdown==3.3.7
mkdocs-material==8.5.10 mkdocs-material==8.5.11
mkdocstrings[python-legacy]==0.19.0 mkdocstrings[python-legacy]==0.19.0
netaddr==0.8.0 netaddr==0.8.0
Pillow==9.3.0 Pillow==9.3.0
psycopg2-binary==2.9.5 psycopg2-binary==2.9.5
PyYAML==6.0 PyYAML==6.0
sentry-sdk==1.11.0 sentry-sdk==1.11.1
social-auth-app-django==5.0.0 social-auth-app-django==5.0.0
social-auth-core[openidconnect]==4.3.0 social-auth-core[openidconnect]==4.3.0
svgwrite==1.4.3 svgwrite==1.4.3
tablib==3.2.1 tablib==3.2.1
tzdata==2022.6 tzdata==2022.7
# Workaround for #7401 # Workaround for #7401
jsonschema==3.2.0 jsonschema==3.2.0