Nautobot v3.2¶
This document describes all new features and changes in Nautobot 3.2.
Upgrade Actions¶
Administrators¶
Migrate Job Execution and Scheduled Jobs¶
This release introduces a behavioral change to job execution APIs. The job_kwargs parameter is now required for the following functions: create_schedule, enqueue_job, execute_job and run_job_for_testing.
Previously, job arguments could be omitted or passed implicitly. This behavior is deprecated and will be removed in a future release. A temporary backward-compatible fallback remains in place but will emit warnings when used.
Action Required:
- Update all job invocations to explicitly pass
job_kwargs(e.gjob_kwargs={}) - Recreate all Scheduled jobs which has
kwargs=None, because now may fail at runtime due to stricter validation.
Tip
Treat any warnings "Using deprecated **job_kwargs pattern, please instead switch to passing job_kwargs as a single parameter" as indicators that your code should be updated to the new explicit pattern.
App Developers¶
Review Device Component Lookups¶
The behavior of the Device component device foreign key has been changed, such that components (Interface, etc.) belonging to a Module installed in a Device's Module Bay now automatically set each component's device foreign key to point to the Device, instead of leaving it as NULL/None as it was in previous Nautobot versions. As a result, queries such as Device.interfaces.all() will now return records that belong to child Modules as well as those that belong directly to the Device, whereas in previous versions this query would only return records that belong directly to the Device. In many cases the new behavior will be more desirable and more intuitive to App and Job authors, but maintainers of existing App and Job code should review their logic to identify possible impacts.
Migrate Cable Termination Queries¶
To support breakout cables, the association between a Cable and its terminations has been re-implemented. The cable ForeignKey that previously existed on each CableTermination subclass (Interface, FrontPort, RearPort, CircuitTermination, PowerPort, etc.) has been removed in favor of a new CableToCableTermination join model, exposed on each termination via the cable_termination reverse one-to-one relationship. App and Job code that queries or traverses cables may need to be updated.
The cable attribute is preserved as a read-only property on each termination instance (e.g. interface.cable), so attribute access continues to work. Assignments to Cable.termination_a / Cable.termination_b (and their *_type / *_type_id / *_id counterparts) on unsaved Cable instances also continue to work and are materialized into CableToCableTermination rows on save.
ORM queries filtering CableTermination subclasses by cable are automatically translated to the new cable_termination__cable[...] paths, emitting a DeprecationWarning for each. The following patterns are translated:
| Deprecated | Translated to |
|---|---|
Interface.objects.filter(cable=...) |
cable_termination__cable=... |
.filter(cable=None) |
cable_termination__isnull=True |
.filter(cable_id=...), .filter(cable__isnull=...), .filter(cable__<lookup>=...) |
cable_termination__cable... equivalents |
.select_related("cable"), .select_related("cable__<field>") |
cable_termination__cable... equivalents |
The following patterns are not translated and will break — rewrite them explicitly:
| Not translated | Use instead |
|---|---|
Q(cable=...) |
Q(cable_termination__cable=...) |
.order_by("cable") |
.order_by("cable_termination__cable") |
.values("cable") / .values_list("cable") |
cable_termination__cable |
Querying Cable by its terminations: in the same way, the legacy termination_a_type / termination_a_id (and b-side) fields are no longer database columns on Cable — the terminations now live on the terminations (CableToCableTermination) relation. Cable.objects translates lookups using the old *_type / *_id names into the equivalent terminations__... join paths (constrained to connector 1 to match the properties), emitting a DeprecationWarning for each, so Cable.objects.filter(...), .get(...), and .get_or_create(...) continue to work for legacy callers. The *_type ContentType may be supplied either as a ContentType instance (termination_a_type=<ct>) or as an integer ContentType PK (termination_a_type_id=<ct.pk>). The lookup half is translated by the queryset and, for get_or_create(), the same kwargs flow through Cable(...) and are materialized into CableToCableTermination rows on save.
| Deprecated | Translated to |
|---|---|
Cable.objects.get(termination_a_type=<ct>, termination_a_id=<pk>) |
terminations__<fk>_id=<pk> with terminations__cable_end="A" |
.get(termination_a_type_id=<ct.pk>, termination_a_id=<pk>) (integer ContentType PK) |
same as above |
.filter(termination_a_id=<pk>) (no _type / _type_id given) |
<pk> matched against every per-type termination FK |
Cable.objects.get_or_create(termination_a_type=..., termination_a_id=..., ...) |
lookup translated as above; creation flows through Cable(...) |
The following are not translated — rewrite them against the terminations relation explicitly:
| Not translated | Use instead |
|---|---|
Q(termination_a_id=...), .order_by("termination_a_id"), .values("termination_a_id") |
terminations__... equivalents |
transformed lookups, e.g. .filter(termination_a_id__in=[...]) |
terminations__<fk>_id__in=[...] with terminations__cable_end="A" |
.exclude(termination_a_id=..., termination_b_id=...) combining both ends |
separate .exclude() calls, or an explicit terminations__... Q. The shim applies each end independently (exclude(A) AND exclude(B)), which is not equivalent to negating the combined condition, because the A-side and B-side match different CableToCableTermination rows. Single-end exclude() is exact. |
Warning
Queries using termination_[a|b]_[id|type] only match the first connector on each side of a Cable by design. Code that needs to support any additional connectors on a breakout cable must use the new access patterns.
Cable paths: the private _path ForeignKey on PathEndpoint has been replaced with a cable_paths GenericRelation (resolving through CablePath.origin). The public path, trace(), and connected_endpoint accessors are unchanged. Rewrite any _path__... query usages as cable_paths__...; because this is now a multi-row reverse relation (one CablePath per breakout lane), distinct() is typically required on filter() / count() / exclude().
Other notes:
- The private
_cable_peer,_cable_peer_type, and_cable_peer_idcache fields have been removed fromCableTermination. The public peer accessors (get_cable_peer(), RESTcable_peer/cable_peer_type, GraphQLcable_peer_*) are unchanged;get_cable_peer()now accepts an optionalpeer_connectorargument for breakout-lane-specific lookups. - New helpers are available for working with multi-termination cables:
Cable.add_termination(termination, cable_end, connector=1), the typed many-to-many reverse accessors onCable(cable.interfaces,cable.front_ports, etc.), the singularcable_terminationreverse accessor on each termination, andPathEndpoint.get_connected_endpoints()(returning the resolved destinations of all cable paths, one per breakout lane).
Release Overview¶
Breaking Changes¶
Cable Data Model Changes¶
To support breakout cables (see below), the way a Cable associates to its terminations has changed. The cable ForeignKey previously present on each CableTermination (Interface, FrontPort, etc.) has been replaced by a new CableToCableTermination join model, allowing a cable to have more than two terminations. Similarly, the Cable.termination_a and Cable.termination_b GenericForeignKey fields have been similarly migrated to use the reverse-foreign-key-relation Cable.terminations to CableToCableTermination records.
Backward-compatibility shims are provided for the most common access patterns (including ongoing support for the REST API and UI query parameters ?termination_a_type=, ?termination_a_id=, etc.), but App and Job authors who interact with cables programmatically may need to make updates to support the updated data model. See Upgrade Actions for App Developers above for details.
Added¶
Breakout Cables¶
Nautobot now models breakout cables — multi-lane cable assemblies where a single physical cable splits into multiple individual connections (for example a 400G QSFP-DD port broken out into 4×100G SFP lanes). A new CableType model defines the physical structure of a cable (connectors per side, internal lanes, and the connector-to-lane mapping), and a Cable assigned a breakout cable type may have more than two terminations, each recorded as a CableToCableTermination. Breakout cables are fully supported across the UI (cable type and cable forms, connection tables, SVG lane-mapping and trace diagrams), the REST API, and lane-aware cable path tracing. Interface records gain an optional breakout_position field to map a subinterface to a position on its parent interface's breakout trunk connector.
Partially-Connected, Disconnected, and Repurposed Cables¶
A Cable is no longer required to have both of its endpoints defined, and its terminations are no longer fixed at creation time. A cable may now be partially-connected (a termination on only one side, or on a subset of a breakout cable's connectors) or fully-disconnected (no terminations at all), and a cable's terminations may be added, changed, or removed after the cable is created — through the UI, the REST API, or programmatically — without deleting and recreating the cable.
IP Address Ranges¶
A new IPAddressRange model represents a contiguous span of IP addresses within a parent Prefix without needing to create an individual IPAddress record for each address in the span. Views include standard (list, detail, edit, delete), "IP Address Ranges" tab on the Prefix detail view, and inline rendering of ranges within the Prefix "IP Addresses" tab.
IPAddress.clean() now rejects addresses that fall within an "exclusive" range, Prefix.clean() rejects network edits that would orphan a contained range, and Prefix.save() reparents contained ranges to the closest fully containing Prefix. Prefix utilization calculations now account for IP address ranges when "mark as utilized" is set.
Tip
Setting a range to "exclusive" may change your workflow — for example, you will no longer be able to create an IP address that falls within an exclusive IP address range. This is by design, but may be surprising if the implications of enabling exclusivity were not considered.
Job Cancel¶
Jobs that are actively running, pending a run, or abandoned, can now be cancelled from both the UI and REST API, with support for both Celery and Kubernetes jobs. You will now be able to see a Job Cancel button on the job result list and detail views (for jobs not in a terminal state.)
The "Cancel Job" action will perform slightly different actions depending on the current state of the job, all of which end up with the Job Result in a terminal state. For technical details refer to the documentation for Job cancel.
Job Cancel requires the extras.run_job permission; additionally, non-staff users with this permission may cancel only jobs they submitted, while staff users with this permission may cancel any user's jobs.
Homepage Stickiness¶
The homepage now saves the location and collapsing of each panel. You can re-arrange them to your liking, and see it the same on any browser. Additionally, when resizing your browser window, the panels will be automatically and sanely rearranged to four, three, two, or one column as appropriate.
Search Enhancements¶
The header search bar gains two distinct capabilities. First, model-name typeahead: as you type an in: phrase, matching model names are suggested (e.g. typing in:dev suggests in:devices). Second, once you begin searching, live results appear as you type, showing up to the first 10 matches.
Object Metadata UI¶
ObjectMetadata records can now be created, edited, and deleted directly through the web UI (previously read-only). Metadata is added from the parent object's Metadata tab, which opens a pre-filled create form. The value input adapts to the selected MetadataType data type, and detail/list views render values appropriately for each type — clickable links for URLs, parsed HTML for Markdown, pretty-printed JSON for JSON, etc. The primary intent is still that metadata is managed by integrations (SSoTs, REST API), but users with the appropriate permissions can now manage individual records through the UI.
Other Additions¶
- Computed Fields can now optionally be rendered as Markdown.
- A reusable
copy_buttontemplate tag renders hover copy-to-clipboard buttons. - Added opt-in support for OpenTelemetry traces, metrics, and logs, disabled by default.
Changed¶
Cable Termination REST API¶
The Cable REST API serializer adds a single terminations field keyed by side (a/b) and then by 1-indexed connector number, mirroring the physical structure of the cable. This field is writable on POST and PATCH, and uncabled connectors on breakout cables are surfaced as explicit null slots. The legacy termination_a / termination_b (and *_type / *_id) fields remain for backward compatibility and refer to connector 1 on each side. The nested terminations field is omitted from CSV exports; use the CableToCableTermination endpoint for per-connector CSV detail.
Device Component Default Ordering¶
The default sort ordering of device-component models (Interface, Front Port, Rear Port, Module Bay, etc.) has been changed to group and sort records by their associated device_id (UUID) rather than by the associated device's name, as the prior behavior (requiring a join across database tables) performed poorly at high data scale. This change affects the default behavior of the following:
/dcim/interfaces/UI list view (and/dcim/front-ports/,/dcim/rear-ports/, etc.)/api/dcim/interfaces/REST API list view (and/api/dcim/front-ports/,/api/dcim/rear-ports/, etc.)- GraphQL query responses that invole listing any of these models
For the UI and REST API list views, if ordering by device name is desired, the prior behavior may be achieved by explicitly specifying a ?sort=device query parameter when requesting these views, but users are encouraged to be aware of the performance implications of doing so.
Device Component device Foreign Key¶
When device components (Interface, Front Port, Rear Port, Module Bay, etc.) belong to a Module, and that Module is installed in a Module Bay belonging to a Device, the device foreign key on each such device component is now automatically set to point to the Device in question. This is a behavior change from previous Nautobot versions, in which the device foreign key would remain as NULL/None for device components belonging to a Module even when that Module was installed into a Device's Module Bay. This change was made to improve the performance and self-consistency of Device component lookups, such as the Device.all_interfaces() method and Device.interfaces.all() queryset manager.
Device Module Bays Tree View¶
The Device detail view "Module Bays" tab now supports a hierarchical view with asynchronous loading of each nested module level as you expand it. Optionally, you can expand or collapse all levels to show or hide the entire nested structure.
Dependencies¶
As usual for Nautobot minor-version releases, 3.2.0 includes updates to many of Nautobot's dependencies, including in some cases major-version updates to these dependencies. These updates should generally be transparent to end users, but Apps relying on these dependencies may in turn require minor updates for compatibility.
v3.2.0b2 (2026-07-23)¶
Security in v3.2.0b2¶
- #8930 - Updated npm development dependency
brace-expansionto1.1.16to mitigate CVE-2026-13149. - #8930 - Updated npm development dependency
fast-urito3.1.4to mitigate CVE-2026-16221 and CVE-2026-13676. - #8930 - Updated npm development dependency
immutableto5.1.9to mitigate CVE-2026-59879 and CVE-2026-59880. - #8930 - Updated npm development dependency
js-yamlto4.3.0to mitigate CVE-2026-59869. - #8930 - Updated npm development dependency
shell-quoteto1.10.0to mitigate CVE-2026-13311. - #9218 - Updated dependency
djangoto>=5.2.16,<5.3to mitigate CVE-2026-48588, CVE-2026-53877, and CVE-2026-53878. - #9219 - Updated dependency
Pillowto>=12.3.0,<13to mitigate multiple CVEs. - #9278 - Updated dependency
gitpythonto>=3.1.54,3.2.0to mitigate multiple security vulnerabilities.
Added in v3.2.0b2¶
- #4783 - Added opt-in support for OpenTelemetry traces, metrics, and logs, disabled by default and enabled via the
OTEL_PYTHON_DJANGO_INSTRUMENTsetting. - #4783 - Added the
NAUTOBOT_OTEL_EXTRA_INSTRUMENTORSsetting to enable additional OpenTelemetry library instrumentors at startup. - #7494 - Added
source_versionproperty to theJobmodel, exposing the version of the source code providing the job — the Nautobot version for system Jobs, the App version for App-provided Jobs, or thecurrent_headcommit hash for Jobs provided by a Git repository. - #7494 - Added the Job's source version to the "Running job" log entry recorded at the start of each Job run.
- #7494 - Added display of the Job source version to the Job detail view and as an optional column on the Jobs list view.
- #8870 - Added ability to add VirtualDeviceContext objects to a ControllerManagedDeviceGroup.
- #9045 - Added a
vm_interfacesfilter toVLANFilterSet, allowing VLANs to be filtered by the VM interface(s) they are assigned to (tagged or untagged). - #9221 - Added a link to the IP Address Range name column, falling back to the range's string representation for ranges without a name.
- #9232 - Added a "Searchable Fields by Model" documentation page and a search bar tooltip, both listing the fields matched by each model's list-view search bar. The documentation page is generated from each model's
SearchFiltervia the newgenerate_searchable_fieldsmanagement command, and the tooltip appears when hovering over the help icon in the search bar. - #9236 - Added
has_cablefilter to "basic" filter forms for all cable termination models. - #9243 - Added
kindfilter to Interface "basic" filter form. - #9245 - Added IP Address Ranges to Stats in Tenant detail view.
- #9254 - Added Cloud as an edition of Nautobot.
- #9255 - Added the ability to set Django email settings via
NAUTOBOT_EMAIL_*environment variables. - #9262 - Added
sizeProperty ToIPAddressRangeModel AndIPAddressRangeUIViewSet - #9265 - Added bulk edit to IP Address Ranges list view.
- #9265 - Added
IP Address Rangestab to Namespace detail view. - #9271 - Added
SavedViewsupport toObjectChangelist view.
Changed in v3.2.0b2¶
- #9045 - Changed the device/module component bulk-create form (
name_pattern/label_pattern) to render and validate custom fields, relationships, object notes, and dynamic group assignments by borrowing those fields onto the create form from the per-instance model form. - #9196 - Updated Device detail view "Module Bays" tab to render a tree view with interactive expanding and collapsing of child modules and module bays.
- #9223 - Renamed the feature from
Job RevocationtoJob Cancel. All user-facing terminology now usescancelinstead ofrevoke. - #9223 - The cancel API preview (
GETon the cancel endpoint) no longer returns theactionandaction_descriptionfields. - #9223 - Reworked the Cancel Job confirmation popup.
- #9223 - Renamed Job Result columns to use "cancel" terminology and Title Case.
- #9223 -
ButtonsColumnnow treatsbuttons=()as "no buttons" instead of falling back to the default set. - #9236 - Changed behavior of Cable create/edit form to entirely omit endpoints that are already connected to a different cable, instead of the previous behavior of displaying them but disabling them as options.
- #9241 - Job cancellation now requires the new
extras.cancel_jobpermission instead ofextras.run_job. The submitter of a job can still cancel their own job with onlyextras.view_jobresult(nocancel_jobneeded). Any other user needsextras.cancel_jobscoped (object-level) to the specific Job. Staff status no longer grants the ability to cancel another user's job. - #9243 - Changed Cable create/edit form to not present "embedded search" options for the individual terminations (interface, front port, etc.).
- #9245 - Changed the Add IP Address Range button to also pre-fill
end_address(first three octets of start, IPv4 only). - #9265 - Changed ProtectedError message when Prefix is deleted and IP Address or IP Address Ranges are left without a parent.
- #9277 - Changed
Prefix.get_available_ips()to exclude only exclusive IP Address Ranges, aligning availability with IPAddress validation. The/available-ips/API endpoint now lists and allocates addresses inside non-exclusive ranges. Removed the unusedexclude_child_ipsparameter. - #9286 - Updated Marketplace entries for Apps introduced in 3.2.
Removed in v3.2.0b2¶
- #9223 - Removed the delete action button from running or pending Job Results. A running or pending job now offers only Cancel Job.
Fixed in v3.2.0b2¶
- #8677 - Fixed Provider
noc_contactandadmin_contactfields no longer being rendered as Markdown on the Provider detail view. - #9062 - Fixed duplicated parent form dropdowns when an embedded "Add a new ..." modal was submitted with a validation error and then dismissed.
- #9120 - Fixed negation (
__n) filtering of multi-select custom fields, which previously matched all records instead of excluding records containing the specified value. - #9194 - Fixed UI horizontal "wiggle" when opening/closing various modal dialogs.
- #9208 - Fixed the Worker and Traceback sections on the Job Result "Advanced" tab not updating without a manual page refresh while a job runs or after it completes.
- #9229 - Fixed a race condition in the cable type creation form where submitting immediately after changing the connector counts or total lanes could fail validation because the lane mapping table had not finished regenerating.
- #9236 - Fixed inability to swap or reassign a saved cable's terminations in the cable edit form by filtering termination dropdowns server-side to endpoints that are uncabled or already on the cable being edited.
- #9245 - Fixed IP Address Ranges from descendant Prefixes not displaying correctly on a parent Prefix.
- #9245 - Fixed incorrect
start_addresspre-fill on the Add IP Address Range button. - #9246 - Fixed bulk IP address creation silently doing nothing (raising an uncaught
IntegrityError) when a pattern collided with an existing address. The collision is now reported as a validation error on the form. - #9249 - Extended the
Cable.objectsbackward-compatibility shims to also accepttermination_[a|b]_type_id(integerContentTypePK) in lookups such asfilter(),get(), andget_or_create(), as well as inCable(...)construction, matching the existingtermination_[a|b]_type/termination_[a|b]_idsupport. - #9253 - Fixed job cancel revoked jobs recovery on Redis Sentinel/cluster by using Celery's broker connection instead of parsing the broker URL.
- #9263 - Improved performance of "live search" feature.
- #9264 - Fixed bulk "Select All" delete and edit operations ignoring a view's implicit
alter_queryset()scoping. - #9266 - Fixed
ComputedFieldColumnrendering its fallback value on non-matching row types in interleaved tables (e.g. Prefix > IP Addresses). Such cells now render a placeholder. - #9273 - Fixed the worker liveness probe file to be updated based on the consumer's connection.
- #9276 - Fixed an N+1 query problem on the Interfaces REST API.
- #9277 - Improved performance of "ip address ranges" feature.
- #9283 - Fixed docs link pointing to an authenticated link when on an unauthenticated page.
Dependencies in v3.2.0b2¶
- #8000 - Updated dependency
cryptographyto>=49.0.0,<50. - #8000 - Updated dependency
django-redisto>=7.0.0,<7.1. - #8000 - Updated dependency
django-tables2to>=3.0.0,<3.1. Note that this is a new major version of this dependency and includes a small number of breaking changes which may impact Nautobot Apps. Review the change log for details. - #8264 - Updated dependency
django-celery-beatto==2.9.0. - #8264 - Updated dependency
django-prometheusto>=2.5.0,<2.6. - #8264 - Updated dependency
django-structlogto>=10.1.0,<10.2. - #8264 - Updated dependency
django-tree-queriesto>=0.24.0,<0.25. - #8264 - Updated dependency
drf-spectacularto>=0.29.0,<0.30. - #8264 - Updated dependency
kubernetesto>=36.0.2,<37. - #8264 - Updated dependency
prometheus-clientto>=0.25.0,<0.26. - #8930 - Updated NPM dependency
echartsto^6.1.0. - #9219 - Updated dependency
regexto>=2026.6.28.
Documentation in v3.2.0b2¶
- #7319 - Added documentation clarifying that the
extras.view_fileproxypermission is required to download a job's output files. - #7475 - Added documentation noting that app-provided
DatasourceContentcallbacks are always called when a Git repository is synced and should always checkrepository_record.provided_contentsbefore taking action. - #9223 - Clarified that canceling a job is not a rollback. It does not add atomic transactions and does not undo work already completed.
- #9239 - Updated HA documentation with recommendations for virtual chassis and device redundancy group models.
- #9275 - Added workflows diagram to job cancel documention.
- #9284 - Update release note docs for 3.2 to include OpenTelemetry and Module Bay view.
Housekeeping in v3.2.0b2¶
- #8000 - Updated development dependency
django-debug-toolbarto~7.0.0. - #8000 - Updated development dependency
invoketo~3.0.3. - #8000 - Updated development dependency
richto~15.0.0. - #8000 - Updated development dependency
requeststo~2.34.2. - #8264 - Updated development dependency
djlintto~1.40.4. - #8264 - Updated development dependency
coverageto~7.15.0. - #8264 - Updated development dependency
openapi-spec-validatorto~0.9.0. - #8930 - Updated development NPM dependency
autoprefixerto^10.5.2. - #8930 - Updated development NPM dependency
postcssto^8.5.16. - #8930 - Updated development NPM dependency
sass-loaderto^16.0.8. - #9045 - Refactored VMInterfaceUIViewSet model related UI views to use
NautobotUIViewSetandUI Component Framework. - #9084 - Refactored Interface model related UI views to use
NautobotUIViewSet. - #9143 - Refactored ScheduleJob model related UI views to use
UI component framework. - #9170 - Refactored Interface model related UI views to use
UI component framework. - #9219 - Updated development dependency
fakerto^40.28.1. - #9219 - Updated development dependency
mkdocstringsto~1.0.5. - #9219 - Updated development dependency
ruffto~0.15.21. - #9258 - Updated the CableTerminations migration to be bulk friendly.
- #9265 - Refactored NamespaceUIViewSet - changed DistinctViewTab to use UI framework instead of as a separate HTML template.
- #9287 - Fixed the development observability stack to work on a fresh clone.
v3.2.0b1 (2026-07-09)¶
Added in v3.2.0b1¶
- #5743 - Added feature to optionally render Computed-Fields as Markdown
- #8610 - Added UI views for creating, editing, and deleting
ObjectMetadatarecords directly in the web UI. - #8610 - Added "Add metadata" entry point from a model's Metadata tab that opens a pre-filled create form, with the value input adapting to the selected
MetadataTypedata type. - #8610 - Added type-aware value rendering in the
ObjectMetadatalist and detail views (linkified URLs, parsed Markdown, pretty-printed JSON, etc.). - #8902 - Added
CableBreakoutTypedata model, initial UI, and tests. - #8910 - Added typeahead functionality to header search bar. Results for best matching models show when "in:{model}" search phrase is entered.
- #8913 - Added
revoked_by,revoked_by_user_nameandterminated_atfields toJobResult. - #8913 - Added support for terminating running and pending jobs with backend-agnostic strategies for Celery and Kubernetes.
- #8924 - Added
manufacturer,part_number, andhas_embedded_transceiverstoCableTypemodel. - #8927 - Implemented search bar live search per model.
- #8935 - Added
RevocationObjectFieldsPanel to Advanced Tab in detail JobResult view. - #8935 - Added
revoke-jobendpoint to terminate a running or pending Job, or reap it if its worker is gone. - #8935 - Added column
Revocation Typeto JobResult list view to see what kind of revoke type was executed. - #8935 - Added filter
Revocation Typeto JobResult list view to permit filtering by revocation type Terminated or Reaped. - #8935 - Added
Revoke Jobbutton to JobResult detail view to execute revoke action. - #8946 - Added
GETandPOST /api/extras/job-results/{id}/revoke/API endpoints for revoking a running or pending job. - #8946 - Added
celery_kwargstoJobResultFactory. - #8946 - Added
UnknownStrategyforRevokeFactory. Jobs whosequeue_typeis not registered inRevokeFactory.strategiesnow fall back to a reap-only strategy that marks theJobResultas revoked without sending a backend signal. - #8946 - Added
Revoke JobtoJOB_RESULT_BUTTONS. - #8974 - Added the
CableToCableTerminationmodel (exposed vianautobot.dcim.models), a join table betweenCableandCableTerminationinstances that allows a cable to have more than two terminations (breakout-cable support). The model is exposed at REST API endpoint/api/dcim/cables-to-cable-terminations/. - #8974 - Added an
is_disconnectedboolean filter toCableFilterSetfor selecting cables with no termination on one or both sides. - #8974 - Added a "Cables" detail tab on
CableType(/dcim/cable-types/<pk>/cables/) listing all cables of that type, and acable_countcolumn toCableTypeTable. - #8974 - Added
qsearch filter support toConsoleConnectionFilterSet,InterfaceConnectionFilterSet, andPowerConnectionFilterSet. - #8974 - Added
Cable.add_termination(termination, cable_end, connector=None)for attaching aCableTerminationto a savedCableafter creation (e.g. for additional breakout connectors that the single A/BCable.__init__kwargs can't express). - #8974 - Added typed
ManyToManyFieldreverse accessors toCable(cable.interfaces,cable.front_ports,cable.power_ports, etc.), and a singularcable_terminationreverse accessor on eachCableTerminationinstance (e.g.interface.cable_termination) returning the connected join row. - #8974 - Added
PathEndpoint.get_connected_endpoints(), returning the resolved destinations of allCablePathrows originating from the endpoint (one per breakout lane). - #8974 - Added a "Cable Status" row to the "Connection" panel on device-component detail views, and extended the "Edit cable / Detach / Delete cable / Mark connected/planned" dropdown (previously only on
Interface) to theConsolePort,ConsoleServerPort,PowerPort,PowerOutlet,FrontPort, andRearPortdetail views. - #8974 - Added row-action dropdowns to the standalone list views for
ConsolePort,ConsoleServerPort,PowerPort,PowerOutlet,Interface,FrontPort,RearPort,DeviceBay, andModuleBay(previously only the per-device/per-module embedded tables exposed these actions). - #8991 - Added abstract
perform_reapmethod toJobRevokeStrategyclass. - #8991 - Added implementation for K8s revoke job.
- #8991 - Added
revocation_typetoJobResultmodel to track which type of revocation was done. - #8991 - Added
TYPE_ABANDONEDtoJobRevocationTypeChoices. - #9019 - Added a
select_relatedon every per-type FK column to theCableViewSet,CableToCableTerminationViewSet, andCableUIViewSetquerysets and switchedCable._get_termination_attr/terminations_a/terminations_bto iterate the prefetchedterminationscache so listing cables (both REST API and UI) no longer runs an N+1 of queries per join row. - #9019 - Added a
Meta.default_m2m_fieldsextension tonautobot.core.api.serializers.OptInFieldsMixin. Subclasses can list ListSerializer / ManyRelatedField source names that should be included in API responses by default (alongside the globalDEFAULT_M2M_FIELDSoftags/content_types/object_types) without requiring callers to pass?exclude_m2m=False. - #9019 - Added writability to the
terminationsfield on theCableREST API serializer. POST and PATCH on/api/dcim/cables/now accept aterminationsobject keyed by side (a/b) then 1-indexed connector number; each slot value is either{"object_type": "<app.model>", "id": "<uuid>"}to plug in (or replace) that connector's termination, ornullto delete the existing row at that connector. Sides and connectors omitted from the payload are left untouched (PATCH-style merge semantics, with explicitnullas the delete sentinel). The entire payload is applied in a single transaction; per-row validation is delegated toCableToCableTerminationSerializerso model-level errors come back as 400. - #9051 - Added
nautobot-server create_breakout_demo_datacommand. - #9065 - Added the
IPAddressRangemodel to represent a contiguous span of IP addresses within a parent Prefix, without creating individual IPAddress records for each address. - #9078 - Reworked the "Connection" panel on
Interface,ConsolePort,ConsoleServerPort,PowerPort,PowerOutlet,FrontPort,RearPort,CircuitTermination, andPowerFeeddetail views to show all cable peers and all connected endpoints of a multi-termination ("breakout") cable rather than only the first. Each line shows a type icon and the resolved-path reachability where applicable. - #9078 - Added per-type
<Type> Endpointspanels to theInterface,ConsolePort,ConsoleServerPort,PowerPort, andPowerOutletdetail views, listing the details of every connected endpoint grouped by type. - #9078 - Added a reusable
nautobot.apps.ui.ConnectionPanelUI component that renders aCableTermination's cable, cable peers, and connected endpoints as a detail panel. - #9078 - Added a reusable
nautobot.apps.ui.ConnectedEndpointsPanelUI component, and used it to add per-type connected-endpoint tables to theCircuitTerminationdetail view. - #9093 - Added "Cable Peer" and "Connection" columns to
CircuitTerminationTable. - #9095 - Added standard CRUD UI views (list, detail, add/edit, delete, bulk edit/delete) for the IPAddressRange model.
- #9095 - Added an "IP Address Ranges" tab to the Prefix detail view listing the ranges contained within a Prefix.
- #9095 - Added an IP Address Ranges panel to the Role detail view for roles associated with the IPAddressRange content type.
- #9095 - Added REST API for the IPAddressRange model.
- #9095 - Added IPAddressRange filtering by name, namespace, parent Prefix, start/end address, and by an address contained within a range.
- #9105 - Added graphql type object
IPAddressRangeType. - #9108 - Added a
breakout_positionfield toInterfaceto map a child (sub-)interface to a specific position on its parent interface's breakout-cable trunk connector. - #9108 - Added indication of breakout child-interface position mapping in the cable-peer and connection table columns, the parent and child interface detail views, and the cable trace SVG renderer.
- #9108 - Added support for path tracing from a trunk interface's subinterface.
- #9110 - Added utilization reporting for IP Address Ranges, showing the percentage of addresses within a range occupied by IP Addresses.
- #9121 - Added a reusable
copy_buttontemplate tag for rendering hover copy-to-clipboard buttons. - #9126 - Added a
NAUTOBOT_EDITIONsetting reflecting the installed edition (Community, Professional, or Enterprise). - #9126 - Added a
navbar_iconbranding key toBRANDING_FILEPATHSfor customizing the navbar icon independently of the favicon. - #9147 - Added rendering of IP Ranges inline within the IP Addresses tab of the Prefix detail view, including nested available-IP blocks and subtree indentation for contained addresses.
- #9158 - Added a utilization bar to the IP Address Range detail view, showing the percentage of addresses in the range that are assigned to IPAddress objects.
- #9158 - Added a table of contained IP Addresses to the IP Address Range detail view, with an "Add IP Address" button pre-filled with the first available address in the range; the table is hidden for exclusive ranges and button "Add IP Address" is hidden when no addresses remain available.
- #9171 - Added "More..." button to the live search results list if there are more entries to be displayed.
- #9177 - Updated the login page appearance and added the Nautobot edition to the About page.
Changed in v3.2.0b1¶
- #8610 - Changed
ObjectMetadata.assigned_object_typetoon_delete=CASCADE; deleting aContentTypenow cascades to itsObjectMetadatarecords instead of nulling them out. - #8911 - Moved
nautobot.dcim.elevationsmodule tonautobot.dcim.svg.rack_elevation. - #8911 - Moved
nautobot.dcim.breakout_diagrammodule tonautobot.dcim.svg.cable_breakout. - #8911 - Changed
/dcim/cable-breakout-types/mapping-editor/HTMX endpoint from GET to POST to avoid problems with complex mappingst. - #8921 -
job_kwargsis now a required parameter forcreate_schedule,enqueue_job,execute_jobandrun_job_for_testing. Previously optional, this argument is now mandatory to ensure consistent job configuration and avoid implicit defaults. Calls that rely on**extra_kwargsto provide job inputs will still work, but will emit a warning. This fallback will be removed in a future release. - #8921 - Updated
runjobcommand data behavior. The default value is now{}instead of allowingNone. - #8921 - Added stricter validation for job inputs in
validate_job_and_job_data. Now raises ValueError ifdata=None. - #8921 - Added stricter validation for job inputs in
apply_sync. Now raises ValueError ifentry.kwargs=None. - #8924 - Renamed
CableBreakoutTypemodel toCableTypeto reflect a broader scope; renamed associated classes, URL paths, and permissions accordingly. - #8935 - Recreated migrations file due to change filed
terminated_attodate_terminatedin JobResult model. - #8935 - Changed job result log level to FAILURE from INFO in revoke flow.
- #8935 - Changed
job_label.html. Added handling for all other current JobResultStatusChoices values. - #8935 - Changed
render_jobresult_status. Added handling for all other current JobResultStatusChoices values. - #8935 -
Result DatainSummary of Resultpanel on JobResult detail view is only rendered when job result status is SUCCESS. - #8935 -
DurationinSummary of Resultpanel on JobResult detail view is only rendered whendate_doneanddate_startedare set. - #8946 - Job revocation (both UI and API) now requires the
extras.run_jobpermission. - #8946 - All users must have the
extras.run_jobpermission to revoke a job. Non-staff users can only revoke jobs they themselves submitted. Staff users can additionally revoke jobs submitted by other users. - #8946 -
RevokeFactory.get_strategy()no longer raisesValueErrorfor unknown queue types. It returns anUnknownStrategyinstance instead. - #8963 - Changed homepage layout from CSS
columnsto Bootstrap grid. - #8974 - Replaced the
cableForeignKeyon theCableTerminationabstract model with a newCableToCableTerminationjoin table, allowing more than two terminations per cable for breakout-cable support. Thecableattribute is preserved as a read-only property; backward-compatibility query translation forInterface.objects.filter(cable=...),select_related("cable"), etc. is provided with aDeprecationWarningpointing at the newcable_termination__cable[...]paths. Note:Q(cable=...),order_by("cable"), andvalues("cable")are not translated. Assignments toCable.termination_a/Cable.termination_b(and their*_type/*_idcounterparts) on unsaved instances continue to work and are materialized intoCableToCableTerminationrows on save. - #8974 - Removed the private
_cable_peer,_cable_peer_type, and_cable_peer_idcache fields from theCableTerminationabstract model; cable peers are now resolved on demand via theCableToCableTerminationjoin table. Public APIs (get_cable_peer(), RESTcable_peer/cable_peer_type, GraphQLcable_peer_*fields) are unchanged. - #8974 - Replaced the private
_pathForeignKeyon thePathEndpointabstract model with acable_pathsGenericRelationresolving throughCablePath.origin. The publicpath,trace(), andconnected_endpointaccessors are unchanged. Query usages of_path__...should be rewritten ascable_paths__...(a multi-row reverse relation, sodistinct()is typically required forfilter()/count()/exclude()). - #8974 - Extended
CablePathto support breakout cables. Each row now records apeer_connectorinteger identifying which lane it represents, andCablePath.from_origin()/get_cable_peer()accept apeer_connector=<int>kwarg for lane-specific peer lookup.disconnect_termination()andrebuild_paths()are lane-aware. TheCableType.mapping-driven fan-out was reworked to iterate distinct peer-side connectors, eliminating redundantCablePathrows for cable shapes like 1×N → M×K where multiple lanes land on the same peer-side connector. - #8974 - With the addition of breakout-cable support,
Cable.termination_a/termination_b(andconnected_lanes,get_lanes()) now specifically refer to connector 1 on each side rather than "the" termination on that side; for non-breakout cables this is the same termination as before.Cable.total_lanesreturns1for non-breakout cables. Callers that need to enumerate every termination on a breakout cable should iteratecable.terminations(or the typed M2M fields likecable.interfaces) instead. - #8974 - Changed
CableTypeto reject edits toa_connectors,b_connectors, ortotal_lanes(and related breakout attributes) once anyCableof that type exists, since changing the connector layout would invalidate existing terminations and paths. The fields remain editable while no cables reference theCableType. - #8974 - Reworked
InterfaceConnectionsListView(UI),InterfaceConnectionViewSet(REST API),InterfaceConnectionTable,InterfaceConnectionFilterSet, and the homepage "Interfaces" connection counter to operate overCablePathrows rather thanInterfacerows. Each breakout-cable lane now surfaces as its own connection row (previously only the primary lane was shown), and filter parameters (device_id,device,location) now match either endpoint of a connection rather than only the canonical "A" side. The REST API JSON response shape (interface_a,interface_b,connected_endpoint_reachable) is unchanged. - #8974 - Replaced the per-component
ConnectCableTo*Formclasses (one per termination type) and thedcim/cable_connect.htmltemplate with a single unifiedcable_addform. The per-port<port>_connectURLs still exist but now redirect intocable_addwith A-side identity and an optional B-side type pre-selection. The unified form is HTMX-driven (previously jQuery-based) and selects a B-side termination type compatible with the A-side as the default (e.g.PowerPort→PowerOutlet) rather than always defaulting toInterface. - #8974 - Consolidated the per-termination-type "Connect to …" entries in device-component row-action dropdowns and in the "Connection" panel of device-component, power-feed, and circuit-termination detail views into a single "Add Cable" action linking into the unified
cable_addform. The cable-actions dropdown renamesDisconnecttoDetach cable from <termination>and refreshes icons to avoid clashes with the surroundingEdit/Delete <component>entries. - #8974 - Reworked the
Cablelist view'sCableTable: added acable_typecolumn, added multi-terminationterminations_a/terminations_bcolumns that render every termination on each side of the cable, and added anactionscolumn. The single-termination columnstermination_a(etc.) remain available for backwards compatibility as opt-in column choices. - #8974 - Changed the UI-framework
components/panel/footer_content_table.htmlpartial to default thereturn_urlon footer-button bulk actions to the current page (preserving query string), so submitting a bulk action from a detail-view panel returns to that panel rather than the model's generic list view. Existingaction-urlvalues that already specifyreturn_urlare left untouched. - #8974 - Changed the seeded default "AOC Fanout"
CableTyperecords (1x2, 1x4, 1x8, 2x4) to sethas_embedded_transceivers=True. - #8991 - Updated extras migration 0143 so that all changes related to the “revoke” action would be included in a single file.
- #8991 - Changed
is_alivetolivenesswith 3 state:JobLiveness.RUNNING,JobLiveness.NOT_RUNNINGandJobLiveness.UNKNOWN. - #9019 - Replaced the per-type many-to-many fields (
interfaces,front_ports,rear_ports,circuit_terminations,console_ports,console_server_ports,power_feeds,power_outlets,power_ports) on theCableREST API serializer with a singleterminationsfield keyed by side (a/b) then 1-indexed connector number, mirroring the physical structure of the cable. Each slot value is the brief representation (default depth) or the full nested serializer (?depth>=1) of the termination at that connector — polymorphic across Interface / CircuitTermination / ConsolePort / FrontPort / RearPort / PowerPort / PowerOutlet / PowerFeed — and uncabled connectors on breakout cables are surfaced as explicitnullslots.terminationsis suppressed in CSV exports (the format can't meaningfully flatten the nested per-slot structure); use/api/dcim/cables-to-cable-terminations/?cable=<pk>for per-row CSV detail. ExtendedBaseModelSerializer.get_field_namesto drop reverse-FK (one-to-many) model accessors alongside many-to-many accessors when a serializer is rendered as nested or for CSV — previously only forwardManyToManyDescriptorfields were filtered. - #9051 - The cable path trace view now renders the trace as a single server-side SVG diagram, replacing the previous per-object-type HTML templates.
- #9051 - Cable path trace diagrams now depict breakout cable fan-outs, rendering each downstream lane as its own branch, including unconnected lanes.
- #9060 - Module Bays and Modular Components (Interfaces, FrontPorts, etc) set root device at every level in the hierarchy.
- #9065 - Changed
IPAddress.clean()to reject creating an IP address that falls within an exclusive IPAddressRange. - #9065 - Changed
Prefix.clean()to reject network/prefix-length edits that would leave a contained IPAddressRange no longer fully within the Prefix. - #9093 - Improved rendering of
terminations_aandterminations_bcolumns inCableTable. - #9093 - Adjusted rendering of
cable_peerandconnectioncolumns in cable termination tables. - #9093 - Standardized device component icons across various tables and menus.
- #9093 - Updated styling of populated rows in device DeviceBay and ModuleBay tables.
- #9095 - Changed
related_nameon Tenant and Prefix models fromip_rangestoip_address_ranges. - #9110 - Changed Prefix utilization to include IP Address Ranges marked as fully utilized, without double-counting IP Addresses that fall within such a range.
- #9110 - Changed the Prefix available-IP calculation to exclude addresses covered by exclusive IP Address Ranges.
- #9110 - Changed Prefix saves to reparent contained IP Address Ranges when a Prefix's network is created or modified, keeping each range attached to the closest Prefix that fully contains it.
- #9126 - Changed the navbar icon and favicon to reflect the installed Nautobot edition when no custom branding is configured.
- #9147 - Changed
add_available_ipaddressesto interleave IP Range rows and to account for exclusive ranges when computing available IP blocks. - #9158 - Changed text in
ButtonsColumnto include model verbose name in "details" and "change log" actions. - #9159 - Changed default sorting of ModularComponentModels to
device_id,module_id,_nameto avoid full table scan ofdcim_device. - #9160 - Changed
Cable.get_lanes()andInterface.get_breakout_lane()to returnCableLaneandBreakoutLanedataclasses instead of dicts. - #9160 - Removed redundant tooltip from Cable breakout diagram.
- #9160 - Made the termination labels in the Cable breakout diagram clickable, linking each connector to its connected termination and its parent.
- #9160 - Refined rendering of breakout cables in trace SVG.
- #9167 - Updated homepage panels wrapping order in two-column layout, for screens between 1008px and 1440px.
- #9169 - Improved performance of
IPAddressandIPAddressRangevalidation by memoizing closest-parent Prefix lookups per namespace and host, avoiding redundant database queries betweenclean()andsave(). - #9174 - Change
CableSerializerget_terminationsand_parse_terminations_payloadStructure. New json structure pushes nested connectors up a level and combine with the side key. - #9180 - Updated the default breakout cable types to the most basic set.
- #9187 - Changed how the active Nautobot edition is determined.
- #9193 - Re-organized
resultfield in JobResult UI to ensure consistency with the API. - #9197 - Changed the Interface Connections list view and REST API (
/dcim/interface-connections/) to group a breakout cable's lanes together: the trunk interface is canonicalized onto the A side (shown once in the UI) and its fan-out endpoints are returned as consecutive rows on the B side, instead of being scattered. Addedorigin_fans_outanddestination_fans_outfields toCablePathto support this without per-row queries, and standardized the shared queryset/ordering viaCablePath.interface_connections().
Deprecated in v3.2.0b1¶
- #8921 - Deprecated passing job parameters as loose
**extra_kwargstoJobResult.enqueue_job(),JobResult.execute_job(), andnautobot.apps.testing.run_job_for_testing(). Job parameters must now be passed as a singlejob_kwargsdict argument. The legacy calling style still works for backward compatibility but logs a warning, and will be removed in a future release.
Removed in v3.2.0b1¶
- #8991 - Removed
should_reapmethod fromJobRevokeStrategyclass. - #9199 - Removed
CableToCableTermination._termination_device, not needed any more.
Fixed in v3.2.0b1¶
- #8454 - Fixed "Too many tables" exception when exporting certain models to CSV from MySQL.
- #8911 - Fixed
BreakoutDiagramSVGto render multiple lanes between a pair of connectors when appropriate. - #8911 - Fixed
BreakoutDiagramSVGto better render wide lane labels. - #8913 - Fixed
store_resultwriting null instead of empty collections fortask_args,task_kwargs, andcelery_kwargswhen no arguments were provided. - #8982 - Fixed a case where the Revoke Job button on the Job Result detail view wouldn't correctly refresh once status is ready.
- #9001 - Fixed the
GETrevoke API behavior for JobResult objects already in a terminal state. The endpoint now returns200 OKwith aNonepreview instead of presenting aREAPorTERMINATEaction.POSTrequests against completed jobs continue to return409 Conflict. - #9036 - Fixed missing
form-controlstyling on theValueandAssigned objectfields in the ObjectMetadata create/edit form. - #9051 - Fixed cable path tracing through a mid-path breakout cable so that a lane returning to a single trunk peer is followed through, rather than always reporting the path as split.
- #9051 - Fixed the list of selectable next hops shown for a split cable path when the split originates at a front port; previously only splits at a rear port were handled.
- #9093 - Fixed incorrect logic for selecting variant icons for Interfaces in
DeviceModuleInterfaceTable. - #9130 - Fixed an error when trying to serialize a many-to-many relationship to a model that supports cable terminations.
- #9160 - Fixed errors when creating extremely long cables.
- #9160 - Fixed the
trace_pathsmanagement command (run bynautobot-server post_upgrade) not regenerating missing breakout cable fan-out lane paths. - #9160 - Fixed the
trace_pathsmanagement command aborting partway through when it encountered inconsistent existing cable data (such as a cabling loop); it now skips the affected origin and continues. - #9160 - Fixed layout of connection tables (in both the cable detail view and the HTMX connection-edit form) for breakout cables with a meshed connector mapping, such as a polarity-shuffled 2x2.
- #9160 - Fixed missing validation that allowed a multi-connector (breakout) cable type to be attached to termination types that don't support breakout (such as console or power terminations).
- #9160 - Fixed the cable edit form disallowing all cable types for cables with non-breakout-eligible terminations; single-connector cable types are now permitted.
- #9160 - Fixed the per-row cable actions (mark cable connected/planned, detach cable) not working in the device-component list views (interfaces, console/power ports, front/rear ports).
- #9160 - Fixed cable-status row coloring not being applied in the device-component list views.
- #9160 - Fixed an exception when attempting to improperly create an Interface with a
breakout_positionbut noparent_interface. - #9160 - Fixed missing
breakout_positionform field when editing an existing Interface. - #9160 - Fixed an exception when tracing a path including a partially-disconnected cable.
- #9178 - Added backward-compatibility translation of legacy
termination_[a|b]_type/termination_[a|b]_id) lookups onCable.objectsqueries such asfilter(),get(), andget_or_create(). - #9178 - Corrected incorrect
stacklevelvalue for DeprecationWarnings emitted by cable-query backwards-compatibility logic. - #9185 - Fixed job revocation incorrectly overwriting an already-completed job's status (e.g. SUCCESS to REVOKED); the revoke write is now guarded against the job's terminal state under a row lock.
- #9195 - Fixed an exception when rendering IP Address detail view "Interfaces" tab.
- #9195 - Fixed missing interface-type icons in IP Address detail view "Interfaces" tab table.
- #9195 - Fixed missing "actions" column in IP Address detail view "Interfaces" tab table.
- #9195 - Fixed inability to scroll horizontally in IP Address detail view "Interfaces" and "VM Interfaces" tabs tables.
- #9202 - Fixed
AttributeErrorincable_status_color_css()when rendering a virtual sub-interface whose parent has a cable but which is not a breakout child.
Dependencies in v3.2.0b1¶
- #8910 - Added Fuse.js as a UI dependency.
- #8963 - Added
htmx-ext-json-encas a UI dependency. - #8991 - Updated dependency
kubernetesto>=36.0.1,<37.
Documentation in v3.2.0b1¶
- #8991 - Replaced core development guide
Minikube Dev Environment for K8s JobsbyRunning a Nautobot Job on a Local Kubernetes Clusterthat walks through running a Nautobot Job inside a Kubernetes job pod while the rest of the dev stack (Django, Postgres, Redis) runs locally in Docker Compose. - #9065 - Added documentation about new
IPAddressRangemodel. - #9065 - Updated
PrefixandIPAddressdocumentation. - #9164 - Added documentation and release-note content about the enhancements and changes to the cable data model.
- #9167 - Added Homepage Panels documentation under User Guide → Getting Started.
- #9200 - Update the 3.2 release documentation with the new features.
Housekeeping in v3.2.0b1¶
- #8610 - Refactored ObjectMetadataUIViewSet model related UI views to use
NautobotUIViewSetandUI Component Framework. - #8789 - Refactored ConsolePortTemplate model related UI views to use
NautobotUIViewSet. - #8936 - Refactored ConsolePort model related UI views to use
NautobotUIViewSet. - #8974 - Added
get_display_verbose_name_plural(),get_instance_display_text_content(instance), andget_instance_display_strings(instance)override hooks toViewTestCases.ListObjectsViewTestCasefor test cases whose list view's underlying queryset is over a different model thanself.model. All three default to the previous hard-coded behavior, so existing test cases need no changes. - #8991 - Added helper method
build_kubernetes_api_clienttoextras.utilsto avoid duplication. - #8991 - Added
--env/-eoption toinvoke start,invoke debugandinvoke restartto pass environment variables to docker compose (e.g.-e KEY=VALUE, can be repeated). - #8991 - Added internal
NAUTOBOT_KUBERNETES_VERIFY_SSL_INTERNALenvironment variable to opt out of TLS verification on the Kubernetes API connection during local development. - #8992 - Refactored ConsoleServerPortTemplate model related UI views to use
NautobotUIViewSet. - #9023 - Refactored PowerPortTemplate model related UI views to use
NautobotUIViewSet. - #9033 - Refactored InventoryItem model related UI views to use
NautobotUIViewSetandUI Component Framework. - #9034 - Refactored DeviceBay and DeviceBayTemplate model related UI views to use
NautobotUIViewSet, and migrated the DeviceBay detail view to theUI component framework. - #9051 - Enhanced
invoke clitask to support an optional--command 'command'parameter. - #9053 - Moved the ObjectMetadata value-widget to a detail action on
MetadataTypeUIViewSet. - #9064 - Refactored InterfaceTemplate model related UI views to use
NautobotUIViewSet. - #9073 - Refactored PowerPort model related UI views to use
NautobotUIViewSet. - #9074 - Refactored FrontPortTemplate model related UI views to use
NautobotUIViewSet. - #9075 - Refactored ConsolePort model related UI views to use
UI component framework. - #9076 - Refactored RearPortTemplate model related UI views to use
NautobotUIViewSet - #9083 - Refactored PowerOutletTemplate model related UI views to use
NautobotUIViewSet. - #9085 - Refactored ConsoleServerPort model related UI views to use
NautobotUIViewSet. - #9087 - Refactored FrontPort model related UI views to use
NautobotUIViewSet. - #9092 - Refactored PowerOutlet model related UI views to use
NautobotUIViewSet. - #9093 - Consolidated most icon-selection logic for device component rendering in tables and menus.
- #9093 - Changed
termination_type_icontemplate-tag method from a tag to a filter for simpler usage. - #9104 - Refactored PowerPort model related UI views to use
UI component framework. - #9106 - Refactored RearPort model related UI views to use
NautobotUIViewSet. - #9109 - Refactored PowerOutlet model related UI views to use
UI component framework. - #9112 - Updated
testing/views.pylogic to account for nullable name field. - #9137 - Fixed various causes of inconsistent factory data being produced by the
generate_test_datamanagement command. - #9163 - Fixed some incorrect logic in the generic bulk delete view test.
- #9168 - Refactored ConsoleServerPort model related UI views to use
UI component framework. - #9169 - Extracted shared namespace and parent-Prefix resolution logic from
IPAddressandIPAddressRangeinto a reusableNamespaceParentedModelMixin. - #9169 - Improved performance of the prefix IP Addresses view for prefixes with many IP Address Ranges.
- #9175 - Refactored RearPort model related UI views to use
UI component framework. - #9184 - Refactored FrontPort model related UI views to use
UI component framework.