From 02e8979178783d562cc8a47cd6df097403b5fb6b Mon Sep 17 00:00:00 2001 From: Chris Mills Date: Fri, 22 Jan 2021 16:45:08 +0000 Subject: [PATCH 01/25] Changes to template, view and CablePath class to indicate to users whether the cable length is accurate or not. --- netbox/dcim/models/cables.py | 8 ++++++-- netbox/dcim/views.py | 6 +++++- netbox/templates/dcim/cable_trace.html | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 6a530bb49..898e73b4c 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -480,13 +480,17 @@ class CablePath(models.Model): def get_total_length(self): """ - Return the sum of the length of each cable in the path. + Return a tuple containing the sum of the length of each cable in the path + and a flag indicating whether the length is definitive. """ cable_ids = [ # Starting from the first element, every third element in the path should be a Cable decompile_path_node(self.path[i])[1] for i in range(0, len(self.path), 3) ] - return Cable.objects.filter(id__in=cable_ids).aggregate(total=Sum('_abs_length'))['total'] + cables = Cable.objects.filter(id__in=cable_ids, _abs_length__isnull=False) + total_length = cables.aggregate(total=Sum('_abs_length'))['total'] + is_definitive = len(cables) == len(cable_ids) + return (total_length, is_definitive) def get_split_nodes(self): """ diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index b092be612..faec98cb7 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2134,10 +2134,14 @@ class PathTraceView(generic.ObjectView): else: path = related_paths.first() + # Get the total length of the cable and whether the length is definitive (fully defined) + total_length, is_definitive = path.get_total_length if path else (None, False) + return { 'path': path, 'related_paths': related_paths, - 'total_length': path.get_total_length() if path else None, + 'total_length': total_length, + 'is_definitive': is_definitive } diff --git a/netbox/templates/dcim/cable_trace.html b/netbox/templates/dcim/cable_trace.html index a39ada1ce..060fe2076 100644 --- a/netbox/templates/dcim/cable_trace.html +++ b/netbox/templates/dcim/cable_trace.html @@ -69,7 +69,7 @@
Total segments: {{ traced_path|length }}
Total length: {% if total_length %} - {{ total_length|floatformat:"-2" }} Meters / + {% if not is_definitive %}>{% endif %}{{ total_length|floatformat:"-2" }} Meters / {{ total_length|meters_to_feet|floatformat:"-2" }} Feet {% else %} N/A From 04964cc52b90a567a2b8a26e966d24bdc9ca4e07 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Mar 2021 17:00:35 -0500 Subject: [PATCH 02/25] Fixes #5595: Restore ability to delete an uploaded device type image --- docs/release-notes/version-2.10.md | 10 ++++++++++ netbox/dcim/forms.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md index 2b3792204..1ed8cf288 100644 --- a/docs/release-notes/version-2.10.md +++ b/docs/release-notes/version-2.10.md @@ -1,5 +1,13 @@ # NetBox v2.10 +## v2.10.7 (FUTURE) + +### Bug Fixes + +* [#5595](https://github.com/netbox-community/netbox/issues/5595) - Restore ability to delete an uploaded device type image + +--- + ## v2.10.6 (2021-03-09) ### Enhancements @@ -19,6 +27,8 @@ * [#5935](https://github.com/netbox-community/netbox/issues/5935) - Fix filtering prefixes list by multiple prefix values * [#5948](https://github.com/netbox-community/netbox/issues/5948) - Invalidate cached queries when running `renaturalize` +--- + ## v2.10.5 (2021-02-24) ### Bug Fixes diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 40c16d59f..e06b2ae8a 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -944,10 +944,10 @@ class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm): widgets = { 'subdevice_role': StaticSelect2(), # Exclude SVG images (unsupported by PIL) - 'front_image': forms.FileInput(attrs={ + 'front_image': forms.ClearableFileInput(attrs={ 'accept': 'image/bmp,image/gif,image/jpeg,image/png,image/tiff' }), - 'rear_image': forms.FileInput(attrs={ + 'rear_image': forms.ClearableFileInput(attrs={ 'accept': 'image/bmp,image/gif,image/jpeg,image/png,image/tiff' }) } From cb9478e0eaa5853e73718ef6bc52c1f1171678e5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Mar 2021 17:08:11 -0500 Subject: [PATCH 03/25] Closes #5950: Use TimeZoneSerializerField from django-timezone-field --- netbox/dcim/api/serializers.py | 6 +++--- netbox/netbox/api/__init__.py | 3 +-- netbox/netbox/api/fields.py | 15 --------------- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 6f497bfa6..dc730488c 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from drf_yasg.utils import swagger_serializer_method from rest_framework import serializers from rest_framework.validators import UniqueTogetherValidator +from timezone_field.rest_framework import TimeZoneSerializerField from dcim.choices import * from dcim.constants import * @@ -13,13 +14,12 @@ from dcim.models import ( PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis, ) -from dcim.utils import decompile_path_node from extras.api.customfields import CustomFieldModelSerializer from extras.api.serializers import TaggedObjectSerializer from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer from ipam.models import VLAN from netbox.api import ( - ChoiceField, ContentTypeField, SerializedPKRelatedField, TimeZoneField, ValidatedModelSerializer, + ChoiceField, ContentTypeField, SerializedPKRelatedField, ValidatedModelSerializer, WritableNestedSerializer, ) from tenancy.api.nested_serializers import NestedTenantSerializer @@ -98,7 +98,7 @@ class SiteSerializer(TaggedObjectSerializer, CustomFieldModelSerializer): status = ChoiceField(choices=SiteStatusChoices, required=False) region = NestedRegionSerializer(required=False, allow_null=True) tenant = NestedTenantSerializer(required=False, allow_null=True) - time_zone = TimeZoneField(required=False) + time_zone = TimeZoneSerializerField(required=False) circuit_count = serializers.IntegerField(read_only=True) device_count = serializers.IntegerField(read_only=True) prefix_count = serializers.IntegerField(read_only=True) diff --git a/netbox/netbox/api/__init__.py b/netbox/netbox/api/__init__.py index 78ab7431d..334ee09f7 100644 --- a/netbox/netbox/api/__init__.py +++ b/netbox/netbox/api/__init__.py @@ -1,4 +1,4 @@ -from .fields import ChoiceField, ContentTypeField, SerializedPKRelatedField, TimeZoneField +from .fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from .routers import OrderedDefaultRouter from .serializers import BulkOperationSerializer, ValidatedModelSerializer, WritableNestedSerializer @@ -9,7 +9,6 @@ __all__ = ( 'ContentTypeField', 'OrderedDefaultRouter', 'SerializedPKRelatedField', - 'TimeZoneField', 'ValidatedModelSerializer', 'WritableNestedSerializer', ) diff --git a/netbox/netbox/api/fields.py b/netbox/netbox/api/fields.py index fb3eef76f..d73cbcac2 100644 --- a/netbox/netbox/api/fields.py +++ b/netbox/netbox/api/fields.py @@ -104,21 +104,6 @@ class ContentTypeField(RelatedField): return f"{obj.app_label}.{obj.model}" -class TimeZoneField(serializers.Field): - """ - Represent a pytz time zone. - """ - def to_representation(self, obj): - return obj.zone if obj else None - - def to_internal_value(self, data): - if not data: - return "" - if data not in pytz.common_timezones: - raise ValidationError('Unknown time zone "{}" (see pytz.common_timezones for all options)'.format(data)) - return pytz.timezone(data) - - class SerializedPKRelatedField(PrimaryKeyRelatedField): """ Extends PrimaryKeyRelatedField to return a serialized object on read. This is useful for representing related From 132b1ff47969341d1b243223582c33f10bdd6ecf Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 11 Mar 2021 13:42:26 -0500 Subject: [PATCH 04/25] Fixes #5962: Ensure consistent display of change log action labels --- docs/release-notes/version-2.10.md | 1 + netbox/templates/home.html | 8 +------- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/release-notes/version-2.10.md b/docs/release-notes/version-2.10.md index 1ed8cf288..fee73023c 100644 --- a/docs/release-notes/version-2.10.md +++ b/docs/release-notes/version-2.10.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#5595](https://github.com/netbox-community/netbox/issues/5595) - Restore ability to delete an uploaded device type image +* [#5962](https://github.com/netbox-community/netbox/issues/5962) - Ensure consistent display of change log action labels --- diff --git a/netbox/templates/home.html b/netbox/templates/home.html index 47e0e8a1a..e9180eca3 100644 --- a/netbox/templates/home.html +++ b/netbox/templates/home.html @@ -304,13 +304,7 @@ {% for change in changelog %} {% with action=change.get_action_display|lower %}
- {% if action == 'created' %} - Created - {% elif action == 'updated' %} - Modified - {% elif action == 'deleted' %} - Deleted - {% endif %} + {{ change.get_action_display }} {{ change.changed_object_type.name|bettertitle }} {% if change.changed_object.get_absolute_url %} {{ change.changed_object }} From d58291d119cc65b248f7391a2426c95e88ce9d62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20R=C3=B8dvand?= Date: Thu, 11 Mar 2021 22:27:43 +0100 Subject: [PATCH 05/25] Closes #5953: Adds Markdown rendering of Custom Scripts' descriptions --- netbox/templates/extras/script.html | 2 +- netbox/templates/extras/script_list.html | 2 +- netbox/templates/extras/script_result.html | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/templates/extras/script.html b/netbox/templates/extras/script.html index 5808f707f..3f0839512 100644 --- a/netbox/templates/extras/script.html +++ b/netbox/templates/extras/script.html @@ -16,7 +16,7 @@

{{ script }}

-

{{ script.Meta.description }}

+

{{ script.Meta.description|render_markdown }}