diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index 0e30487e3..5fdac54b9 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -1,8 +1,10 @@ # NetBox v3.0 ## v3.0.2 (FUTURE) + * [#7131](https://github.com/netbox-community/netbox/issues/7131) - Fix issue where Site fields were hidden when editing a VLAN group * [#7148](https://github.com/netbox-community/netbox/issues/7148) - Fix issue where static query parameters with multiple values were not queried properly +* [#7153](https://github.com/netbox-community/netbox/issues/7153) - Allow clearing of assigned device type images --- diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 367980ac4..c1f8eccf8 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -23,10 +23,10 @@ from tenancy.forms import TenancyFilterForm, TenancyForm from tenancy.models import Tenant from utilities.forms import ( APISelect, APISelectMultiple, add_blank_choice, BootstrapMixin, BulkEditForm, BulkEditNullBooleanSelect, - ColorField, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, CSVTypedChoiceField, - DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, JSONField, - NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect, StaticSelectMultiple, TagFilterField, - BOOLEAN_WITH_BLANK_CHOICES, + ClearableFileInput, ColorField, CommentField, CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, + CSVTypedChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, ExpandableNameField, form_from_model, + JSONField, NumericArrayField, SelectWithPK, SmallTextarea, SlugField, StaticSelect, StaticSelectMultiple, + TagFilterField, BOOLEAN_WITH_BLANK_CHOICES, ) from virtualization.models import Cluster, ClusterGroup from .choices import * @@ -1271,10 +1271,10 @@ class DeviceTypeForm(BootstrapMixin, CustomFieldModelForm): ) widgets = { 'subdevice_role': StaticSelect(), - 'front_image': forms.ClearableFileInput(attrs={ + 'front_image': ClearableFileInput(attrs={ 'accept': DEVICETYPE_IMAGE_FORMATS }), - 'rear_image': forms.ClearableFileInput(attrs={ + 'rear_image': ClearableFileInput(attrs={ 'accept': DEVICETYPE_IMAGE_FORMATS }) } diff --git a/netbox/templates/utilities/render_field.html b/netbox/templates/utilities/render_field.html index a8ea9c25f..c32ca4e4a 100644 --- a/netbox/templates/utilities/render_field.html +++ b/netbox/templates/utilities/render_field.html @@ -86,18 +86,28 @@ -{% elif field|widget_type == 'fileinput' or field|widget_type == 'clearablefileinput' %} -
- - +{% elif field|widget_type == 'fileinput' %} +
+ + +
+ +{% elif field|widget_type == 'clearablefileinput' %} +
+ +
+ {{ field }} +
{% elif field|widget_type == 'selectmultiple' %} diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index 2073d6a94..8bc113218 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -4,7 +4,7 @@ import re import yaml from django import forms -from .widgets import APISelect, APISelectMultiple, StaticSelect +from .widgets import APISelect, APISelectMultiple, ClearableFileInput, StaticSelect __all__ = ( @@ -29,12 +29,12 @@ class BootstrapMixin(forms.BaseForm): exempt_widgets = [ forms.CheckboxInput, - forms.ClearableFileInput, forms.FileInput, forms.RadioSelect, forms.Select, APISelect, APISelectMultiple, + ClearableFileInput, StaticSelect, ] diff --git a/netbox/utilities/forms/widgets.py b/netbox/utilities/forms/widgets.py index 1625da623..084f296c9 100644 --- a/netbox/utilities/forms/widgets.py +++ b/netbox/utilities/forms/widgets.py @@ -12,6 +12,7 @@ __all__ = ( 'APISelect', 'APISelectMultiple', 'BulkEditNullBooleanSelect', + 'ClearableFileInput', 'ColorSelect', 'ContentTypeSelect', 'DatePicker', @@ -135,6 +136,13 @@ class NumericArrayField(SimpleArrayField): return super().to_python(value) +class ClearableFileInput(forms.ClearableFileInput): + """ + Override Django's stock ClearableFileInput with a custom template. + """ + template_name = 'widgets/clearable_file_input.html' + + class APISelect(SelectWithDisabled): """ A select widget populated via an API call diff --git a/netbox/utilities/templates/widgets/clearable_file_input.html b/netbox/utilities/templates/widgets/clearable_file_input.html new file mode 100644 index 000000000..9b7f980d4 --- /dev/null +++ b/netbox/utilities/templates/widgets/clearable_file_input.html @@ -0,0 +1,24 @@ +
+
+ {% if widget.is_initial %} + {{ widget.value }} + {% if not widget.required %} +
+ + + {% endif %} + {% else %} + None assigned + {% endif %} +
+
+ +
+