From 4afebd3565145fffd6bee41b3679e99be88441d8 Mon Sep 17 00:00:00 2001 From: Anders Harrisson Date: Tue, 6 Feb 2024 12:32:03 +0100 Subject: [PATCH 01/56] Fix custom script documentation example script The example script still uses the old "role" field when creating a Device object. Fixes #15052 --- docs/customization/custom-scripts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index e2bc53cfc..c68bc21f1 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -390,7 +390,7 @@ class NewBranchScript(Script): name=f'{site.slug}-switch{i}', site=site, status=DeviceStatusChoices.STATUS_PLANNED, - role=switch_role + device_role=switch_role ) switch.full_clean() switch.save() From 64b2ebdc794f80af8f021eb2a0d425f1a1f32bfd Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 8 Feb 2024 08:47:16 -0500 Subject: [PATCH 02/56] Fixes #15084: Fix "add export template" link --- docs/release-notes/version-3.7.md | 4 ++++ netbox/utilities/templates/buttons/export.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 103b0664c..531678f2d 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -2,6 +2,10 @@ ## v3.7.3 (FUTURE) +### Bug Fixes + +* [#15084](https://github.com/netbox-community/netbox/issues/15084) - Fix "add export template" link under "export" button on object list views + --- ## v3.7.2 (2024-02-05) diff --git a/netbox/utilities/templates/buttons/export.html b/netbox/utilities/templates/buttons/export.html index 879fc02c5..baa1253eb 100644 --- a/netbox/utilities/templates/buttons/export.html +++ b/netbox/utilities/templates/buttons/export.html @@ -25,7 +25,7 @@
  • - {% trans "Add export template" %}... + {% trans "Add export template" %}...
  • {% endif %} From 040dbcc8751f51aaf650ba07ec7861c20b7aeb35 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 8 Feb 2024 09:10:24 -0500 Subject: [PATCH 03/56] Fixes #15070: Fix inclusion of config_template field on REST API serializer for virtual machines --- docs/release-notes/version-3.7.md | 1 + netbox/virtualization/api/serializers.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 531678f2d..e3c2f8e48 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -4,6 +4,7 @@ ### Bug Fixes +* [#15070](https://github.com/netbox-community/netbox/issues/15070) - Fix inclusion of `config_template` field on REST API serializer for virtual machines * [#15084](https://github.com/netbox-community/netbox/issues/15084) - Fix "add export template" link under "export" button on object list views --- diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 7ed36388b..1dcb413ec 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -103,8 +103,8 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): fields = [ 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', - 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', - 'interface_count', 'virtual_disk_count', + 'config_template', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', + 'last_updated', 'interface_count', 'virtual_disk_count', ] @extend_schema_field(serializers.JSONField(allow_null=True)) From d8c6dad9d9cf81e089bab70b662dd474d003e91b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 9 Feb 2024 15:55:03 -0500 Subject: [PATCH 04/56] Closes #15099: Remove legacy device_role & device_role_id filters for devices --- docs/release-notes/version-4.0.md | 5 +++++ netbox/dcim/filtersets.py | 12 ------------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/release-notes/version-4.0.md b/docs/release-notes/version-4.0.md index e2502df8c..21e442205 100644 --- a/docs/release-notes/version-4.0.md +++ b/docs/release-notes/version-4.0.md @@ -2,6 +2,10 @@ ## v4.0.0 (FUTURE) +### Breaking Changes + +* The deprecated `device_role` & `device_role_id` filters for devices have been removed. (Use `role` and `role_id` instead.) + ### New Features #### Complete UI Refresh ([#12128](https://github.com/netbox-community/netbox/issues/12128)) @@ -26,3 +30,4 @@ The NetBox user interface has been completely refreshed and updated. * [#14657](https://github.com/netbox-community/netbox/issues/14657) - Remove backward compatibility for old permissions mapping under `ActionsMixin` * [#14658](https://github.com/netbox-community/netbox/issues/14658) - Remove backward compatibility for importing `process_webhook()` (now `extras.webhooks.send_webhook()`) * [#14740](https://github.com/netbox-community/netbox/issues/14740) - Remove the obsolete `BootstrapMixin` form mixin class +* [#15099](https://github.com/netbox-community/netbox/issues/15099) - Remove obsolete `device_role` and `device_role_id` filters for devices diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 68edc93f6..4810e9cab 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1288,18 +1288,6 @@ class DeviceComponentFilterSet(django_filters.FilterSet): to_field_name='name', label=_('Virtual Chassis'), ) - # TODO: Remove in v4.0 - device_role_id = django_filters.ModelMultipleChoiceFilter( - field_name='device__role', - queryset=DeviceRole.objects.all(), - label=_('Device role (ID)'), - ) - device_role = django_filters.ModelMultipleChoiceFilter( - field_name='device__role__slug', - queryset=DeviceRole.objects.all(), - to_field_name='slug', - label=_('Device role (slug)'), - ) def search(self, queryset, name, value): if not value.strip(): From 25723aebe0d1470e1dec43fec174ba9b3503ceeb Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 9 Feb 2024 15:57:42 -0500 Subject: [PATCH 05/56] Closes #15100: Remove obsolete NullableCharField class --- docs/release-notes/version-4.0.md | 1 + netbox/utilities/fields.py | 16 ---------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/docs/release-notes/version-4.0.md b/docs/release-notes/version-4.0.md index 21e442205..507b8dcdd 100644 --- a/docs/release-notes/version-4.0.md +++ b/docs/release-notes/version-4.0.md @@ -31,3 +31,4 @@ The NetBox user interface has been completely refreshed and updated. * [#14658](https://github.com/netbox-community/netbox/issues/14658) - Remove backward compatibility for importing `process_webhook()` (now `extras.webhooks.send_webhook()`) * [#14740](https://github.com/netbox-community/netbox/issues/14740) - Remove the obsolete `BootstrapMixin` form mixin class * [#15099](https://github.com/netbox-community/netbox/issues/15099) - Remove obsolete `device_role` and `device_role_id` filters for devices +* [#15100](https://github.com/netbox-community/netbox/issues/15100) - Remove obsolete `NullableCharField` class diff --git a/netbox/utilities/fields.py b/netbox/utilities/fields.py index 65e01db81..d2c14c2c7 100644 --- a/netbox/utilities/fields.py +++ b/netbox/utilities/fields.py @@ -12,26 +12,10 @@ __all__ = ( 'ColorField', 'CounterCacheField', 'NaturalOrderingField', - 'NullableCharField', 'RestrictedGenericForeignKey', ) -# Deprecated: Retained only to ensure successful migration from early releases -# Use models.CharField(null=True) instead -# TODO: Remove in v4.0 -class NullableCharField(models.CharField): - description = "Stores empty values as NULL rather than ''" - - def to_python(self, value): - if isinstance(value, models.CharField): - return value - return value or '' - - def get_prep_value(self, value): - return value or None - - class ColorField(models.CharField): default_validators = [ColorValidator] description = "A hexadecimal RGB color code" From f41105d5e329b92975132167e1e121bdbee5cd8f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 9 Feb 2024 16:30:14 -0500 Subject: [PATCH 06/56] Remove unused Javascript --- netbox/project-static/dist/netbox.js | Bin 374506 -> 374348 bytes netbox/project-static/dist/netbox.js.map | Bin 339797 -> 339643 bytes netbox/project-static/src/links.ts | 15 --------------- netbox/project-static/src/netbox.ts | 2 -- 4 files changed, 17 deletions(-) delete mode 100644 netbox/project-static/src/links.ts diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 50b9ca7054e7d3316028126ef12929878ed19e63..71b1fc77422eb9353a08b8fb782da9debf10974a 100644 GIT binary patch delta 9291 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 cAJXaZ^#+K34*>pdtN;K2 delta 9348 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 diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 431f5e6260e73e327562a37c41ee7aa5c39ad6de..8f4dde4e2c7bcf6a7e0f4ca418cd71c0070a82a5 100644 GIT binary patch delta 56 zcmcb5Ph|I9kqyDB&1tIbX{wAs%ml>DK+Li|O_kM^m8rmOyS_GSFcV|M^k!Yw)a`F| HSu+>`Hc%1y delta 163 zcmdmeSLEtFkqyDB%sH8P&CaUr&Z>++%ml>DK+Lk;S(P=El_krq!fCp!3X8bCr=w$} zPP&t$W2Tdiv!k=6vyQu?qpuE7*dN65)=6}9Oav0n`c68Ij*gxn!C)P4N9PEz^z?(8 uETW=$&N}`e4Z$EeFw5ULX!|TJ)?g;au<7q~SW~AP=(4hI57uSPU<3dQJS|xO diff --git a/netbox/project-static/src/links.ts b/netbox/project-static/src/links.ts deleted file mode 100644 index d39f3605b..000000000 --- a/netbox/project-static/src/links.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { isTruthy, getElements } from './util'; - -/** - * Allow any element to be made "clickable" with the use of the `data-href` attribute. - */ -export function initLinks(): void { - for (const link of getElements('*[data-href]')) { - const href = link.getAttribute('data-href'); - if (isTruthy(href)) { - link.addEventListener('click', () => { - window.location.assign(href); - }); - } - } -} diff --git a/netbox/project-static/src/netbox.ts b/netbox/project-static/src/netbox.ts index 8c274c64b..59faab222 100644 --- a/netbox/project-static/src/netbox.ts +++ b/netbox/project-static/src/netbox.ts @@ -12,7 +12,6 @@ import { initInterfaceTable } from './tables'; import { initSideNav } from './sidenav'; import { initDashboard } from './dashboard'; import { initRackElevation } from './racks'; -import { initLinks } from './links'; import { initHtmx } from './htmx'; function initDocument(): void { @@ -31,7 +30,6 @@ function initDocument(): void { initSideNav, initDashboard, initRackElevation, - initLinks, initHtmx, ]) { init(); From ae7d6ffd925ecdd9f921a594f2e1858b4da3c8e5 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Mon, 12 Feb 2024 17:31:59 +0900 Subject: [PATCH 07/56] Update remote-authentication.md Seperator -> Separator --- docs/configuration/remote-authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/remote-authentication.md b/docs/configuration/remote-authentication.md index fb789bd98..e7fe56a09 100644 --- a/docs/configuration/remote-authentication.md +++ b/docs/configuration/remote-authentication.md @@ -67,7 +67,7 @@ When remote user authentication is in use, this is the name of the HTTP header w Default: `|` (Pipe) -The Seperator upon which `REMOTE_AUTH_GROUP_HEADER` gets split into individual Groups. This needs to be coordinated with your authentication Proxy. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` ) +The Separator upon which `REMOTE_AUTH_GROUP_HEADER` gets split into individual Groups. This needs to be coordinated with your authentication Proxy. (Requires `REMOTE_AUTH_ENABLED` and `REMOTE_AUTH_GROUP_SYNC_ENABLED` ) --- From c7ae2db8e31960ee1b38d11c15108b3e07ffbbf9 Mon Sep 17 00:00:00 2001 From: teapot Date: Sun, 11 Feb 2024 14:50:24 +0900 Subject: [PATCH 08/56] Fixes #15111: Correct typo in error message --- netbox/dcim/models/devices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 4b9689a22..f9e8ba213 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -875,7 +875,7 @@ class Device( if self.position and self.device_type.u_height == 0: raise ValidationError({ 'position': _( - "A U0 device type ({device_type}) cannot be assigned to a rack position." + "A 0U device type ({device_type}) cannot be assigned to a rack position." ).format(device_type=self.device_type) }) From 1f800a975fe2549903a41a3c5da64f437e1bc8f8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 09:34:59 -0500 Subject: [PATCH 09/56] Fixes #15115: Fix unhandled exception with invalid permission constraints --- netbox/users/forms/model_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 99320fa25..aa5811cd1 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -385,7 +385,7 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm): CONSTRAINT_TOKEN_USER: 0, # Replace token with a null user ID } model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists() - except FieldError as e: + except (FieldError, ValueError) as e: raise forms.ValidationError({ 'constraints': _('Invalid filter for {model}: {error}').format(model=model, error=e) }) From df910928f2f3cc429ffe50f9f8a40cc1664cbdc7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 09:26:45 -0500 Subject: [PATCH 10/56] Fixes #15126: group field should be optional when creating VPN tunnel via REST API --- netbox/vpn/api/serializers.py | 5 ++++- netbox/vpn/tests/test_api.py | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index dedcbfbf5..5f6fcd5f7 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -46,7 +46,10 @@ class TunnelSerializer(NetBoxModelSerializer): status = ChoiceField( choices=TunnelStatusChoices ) - group = NestedTunnelGroupSerializer() + group = NestedTunnelGroupSerializer( + required=False, + allow_null=True + ) encapsulation = ChoiceField( choices=TunnelEncapsulationChoices ) diff --git a/netbox/vpn/tests/test_api.py b/netbox/vpn/tests/test_api.py index eb0520c8b..64c175fe5 100644 --- a/netbox/vpn/tests/test_api.py +++ b/netbox/vpn/tests/test_api.py @@ -105,7 +105,6 @@ class TunnelTest(APIViewTestCases.APIViewTestCase): { 'name': 'Tunnel 6', 'status': TunnelStatusChoices.STATUS_DISABLED, - 'group': tunnel_groups[1].pk, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, }, ] From c37dfdc15028170863cb37379ea164ecf9129303 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 09:42:10 -0500 Subject: [PATCH 11/56] Fixes #15091: Fix initial active tab when editing an L2VPN termination --- netbox/templates/vpn/l2vpntermination_edit.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/templates/vpn/l2vpntermination_edit.html b/netbox/templates/vpn/l2vpntermination_edit.html index 0df2c883e..cbce78dbc 100644 --- a/netbox/templates/vpn/l2vpntermination_edit.html +++ b/netbox/templates/vpn/l2vpntermination_edit.html @@ -13,7 +13,7 @@
    -
    +
    {% render_field form.vlan %}
    From 12d830bcf2a552adcf423fc13f857a5f2f473aee Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 11:29:53 -0500 Subject: [PATCH 12/56] Fixes #15133: Fix FHRP group representation on assignments endpoint under brief mode (#15134) * Fixes #15133: Fix FHRP group representation on assignments endpoint under brief mode * Update API test --- netbox/ipam/api/nested_serializers.py | 3 ++- netbox/ipam/tests/test_api.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 17d8d74a7..c012eca6d 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -116,10 +116,11 @@ class NestedFHRPGroupSerializer(WritableNestedSerializer): class NestedFHRPGroupAssignmentSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='ipam-api:fhrpgroupassignment-detail') + group = NestedFHRPGroupSerializer() class Meta: model = models.FHRPGroupAssignment - fields = ['id', 'url', 'display', 'interface_type', 'interface_id', 'group_id', 'priority'] + fields = ['id', 'url', 'display', 'group', 'interface_type', 'interface_id', 'priority'] # diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index cb633e162..447415a69 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -760,7 +760,7 @@ class FHRPGroupTest(APIViewTestCases.APIViewTestCase): class FHRPGroupAssignmentTest(APIViewTestCases.APIViewTestCase): model = FHRPGroupAssignment - brief_fields = ['display', 'group_id', 'id', 'interface_id', 'interface_type', 'priority', 'url'] + brief_fields = ['display', 'group', 'id', 'interface_id', 'interface_type', 'priority', 'url'] bulk_update_data = { 'priority': 100, } From 01fa2710eba125dbc49e5378198fc10f178e58bd Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 10:20:26 -0500 Subject: [PATCH 13/56] Fixes #15067: Fix uncaught exception when attempting invalid device bay import --- netbox/dcim/forms/bulk_import.py | 2 +- netbox/dcim/models/device_components.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index f30ff91fa..732bb87ae 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -996,7 +996,7 @@ class DeviceBayImportForm(NetBoxModelImportForm): device_type__subdevice_role=SubdeviceRoleChoices.ROLE_CHILD ).exclude(pk=device.pk) else: - self.fields['installed_device'].queryset = Interface.objects.none() + self.fields['installed_device'].queryset = Device.objects.none() class InventoryItemImportForm(NetBoxModelImportForm): diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 88dddb312..5b2564b32 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1133,13 +1133,13 @@ class DeviceBay(ComponentModel, TrackingModelMixin): super().clean() # Validate that the parent Device can have DeviceBays - if not self.device.device_type.is_parent_device: + if hasattr(self, 'device') and not self.device.device_type.is_parent_device: raise ValidationError(_("This type of device ({device_type}) does not support device bays.").format( device_type=self.device.device_type )) # Cannot install a device into itself, obviously - if self.device == self.installed_device: + if self.installed_device and getattr(self, 'device', None) == self.installed_device: raise ValidationError(_("Cannot install a device into itself.")) # Check that the installed device is not already installed elsewhere From 2d70b502868d1fd5f4e01b12621c19966b92168a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 10:36:23 -0500 Subject: [PATCH 14/56] Fixes #15059: Correct IP address count link in VM interfaces table --- netbox/dcim/tables/template_code.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 3f8b63688..de27d67ad 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -37,7 +37,7 @@ DEVICEBAY_STATUS = """ INTERFACE_IPADDRESSES = """
    {% if value.count >= 3 %} - {{ value.count }} + {{ value.count }} {% else %} {% for ip in value.all %} {% if ip.status != 'active' %} From 20824ceb25bf47ab7e399d2c5c83bbc260e13649 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 13 Feb 2024 16:31:17 -0500 Subject: [PATCH 15/56] Closes #13283: Add context to dropdown options (#15104) * Initial work on #13283 * Enable passing TomSelect HTML template attibutes on DynamicModelChoiceField * Merge disabled_indicator into option_attrs * Add support for annotating a numeric count on dropdown options * Annotate parent object on relevant fields * Improve rendering of color options * Improve rendering of color options * Rename option_attrs to context * Expose option context on ObjectVar for custom scripts * Document dropdown context variables --- docs/customization/custom-scripts.md | 17 +++++++ netbox/dcim/forms/bulk_edit.py | 6 +++ netbox/dcim/forms/connections.py | 12 +++-- netbox/dcim/forms/model_forms.py | 26 ++++++++-- netbox/extras/scripts.py | 5 +- netbox/ipam/forms/model_forms.py | 8 ++- netbox/project-static/dist/netbox.js | Bin 374348 -> 375736 bytes netbox/project-static/dist/netbox.js.map | Bin 339643 -> 340629 bytes .../src/select/classes/dynamicTomSelect.ts | 46 ++++++++++++++++-- netbox/project-static/src/select/dynamic.ts | 35 ++++++++++--- netbox/project-static/src/select/static.ts | 11 +++-- netbox/utilities/forms/fields/dynamic.py | 26 ++++++++-- netbox/wireless/forms/model_forms.py | 8 ++- 13 files changed, 171 insertions(+), 29 deletions(-) diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index 96423a94b..bdc3f9104 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -304,6 +304,7 @@ A particular object within NetBox. Each ObjectVar must specify a particular mode * `model` - The model class * `query_params` - A dictionary of query parameters to use when retrieving available options (optional) +* `context` - A custom dictionary mapping template context variables to fields, used when rendering `