Nautobot v3.1¶
This document describes all new features and changes in Nautobot 3.1.
Upgrade Actions¶
Administrators¶
Migrate From Legacy PostgreSQL Versions As Needed¶
Nautobot 3.1, as a consequence of the Django 5.2 dependency upgrade, drops support for PostgreSQL versions 12.x and 13.x and now requires a minimum of PostgreSQL 14.0. If you have an existing Nautobot deployment on these no-longer-supported versions of PostgreSQL, you will need to upgrade and migrate your database.
Tip
In general we recommend that you upgrade PostgreSQL as a separate step and change window from upgrading Nautobot in order to reduce the complexity of the upgrade and allow easier troubleshooting and recovery should anything go wrong in the process.
Migrate Configuration To STORAGES As Needed¶
As a consequence of the Django 5.2 dependency upgrade, Nautobot 3.1 drops support for the Django DEFAULT_FILE_STORAGE and STATICFILES_STORAGE settings variables in favor of a unified STORAGES setting. Additionally, support for the corresponding Nautobot-specific STORAGE_BACKEND, STORAGE_CONFIG, and JOB_FILE_IO_STORAGE settings variables has been removed and merged into the STORAGES setting.
If your deployment of Nautobot had overridden any of the above settings (for example, to use S3 storage), you will need to update your nautobot_config.py file to use the STORAGES setting instead. More details are available in the Nautobot documentation for STORAGES.
Configure New Performance Settings As Appropriate¶
If you have a large number of Location and/or Prefix records, you can configure LOCATION_LIST_DEFAULT_MAX_DEPTH and/or PREFIX_LIST_DEFAULT_MAX_DEPTH to limit the depth of data that's initially retrieved and rendered when first accessing these list views, with the potential to significantly improve the performance of these enhanced views as a result.
Enforced Permissions for Job Log Entries¶
Nautobot 3.1 introduces stricter permission enforcement for viewing job log entries in the log table view. Previously, the extras.view_joblogentry permission was not consistently required to access this data.
As a result, users who were previously able to view job logs may now be restricted unless they have been explicitly granted the appropriate extras.view_joblogentry permission. This change may have unexpected impact on existing deployments where access to job logs was implicitly available.
Administrators should review user roles and permissions to ensure that appropriate access to job logs is granted where needed.
App Authors/Maintainers¶
Changes For Django 5.2 Compatibility¶
Nautobot's dependency update to Django 5.2, as typical of Django major version updates, included a small number of breaking changes to Django's Python APIs. For a comprehensive guide, refer to the "Backwards incompatible changes" and "Features removed" sections of Django's release-notes for versions 5.0, 5.1, and 5.2. The most likely impacts we have identified to Nautobot Apps are the following:
- Support for
Model.Meta.index_together(previously deprecated in Django 4.2) is removed; App models with custom indexes usingindex_togetherwill need to migrate to useModel.Meta.indexesinstead and create a database migration accordingly. - Models using a
ManyToManyFieldwith an explicitthroughtable (as is recommended by Nautobot) may need to runnautobot-server makemigrations <app>to generate a schema migration explicitly specifying thethrough_fieldsfor each suchManyToManyField. - The test method
assertQuerysetEqual()(previously deprecated in Django 4.2) is removed; App tests using this method will need to migrate to useassertQuerySetEqual()(note capitalization) instead. - Nautobot previously maintained a Django templatetag named
querystring, which may conflict with the built-inquerystringtemplatetag introduced in Django 5.1. Additionally, Django Tables2 has a similar namespace conflict. It is recommended to use Django's built-in version where possible. If compatibility issues arise, usenautobot.app.templatetags.legacy_querystringinstead.
Changes for HTMX¶
See HTMX List View Rendering below.
Support Dependent Object Creation and Search In Forms¶
See Dependent Object Creation and Search below.
Bootstrap FileStyle Deprecation¶
The Bootstrap FileStyle library is now deprecated and will be removed in Nautobot 4.0. The ClearableFileInput widget, which previously depended on Bootstrap FileStyle, has already been migrated to the standard Bootstrap 5 file input.
If you do not directly reference the bootstrap-filestyle-1.2.3/bootstrap-filestyle.min.js script in your code, no action is required. Otherwise, we encourage you to transition to the Bootstrap 5 file input or import an external library of your choice.
django-ajax-tables Deprecation¶
The django-ajax-tables library is now deprecated and will be removed in Nautobot 4.0. The dynamic table rendering, filtering, and pagination features, which previously depended on this library, have been migrated to use standard django-tables2 combined with HTMX.
If you do not directly reference django-ajax-tables components or its associated JavaScript handlers in your code, no action is required. Otherwise, we encourage you to transition your dynamic tables to the new HTMX-based approach.
Release Overview¶
Breaking Changes¶
Dropped Support for PostgreSQL Versions Less Than 14.0¶
As a consequence of the dependency update to Django 5.2, support for PostgreSQL versions before 14.0 has been removed from Nautobot.
Dropped Support for MySQL Versions Less Than 8.0.11¶
As a consequence of the dependency update to Django 5.2, support for MySQL versions before 8.0.11 has been removed from Nautobot.
Unified Storage Backend Configuration¶
As a consequence of the dependency update to Django 5.2, Nautobot 3.1 drops support for the Django DEFAULT_FILE_STORAGE and STATICFILES_STORAGE settings variables in favor of a unified STORAGES setting. Additionally, support for the corresponding Nautobot-specific STORAGE_BACKEND, STORAGE_CONFIG, and JOB_FILE_IO_STORAGE settings variables has been removed and merged into the STORAGES setting. More details are available in the Nautobot documentation for STORAGES.
Added¶
Dependent Object Creation and Search¶
Dependent objects can now be created directly from the current page using an embedded modal, without interrupting your workflow. Additionally, dependent object search supports advanced filtering, making it easier to find related records, especially in cases like interfaces where simple string matching was not sufficient.
Both creation and search are handled within a modal, so you don't have to leave the main form.
Form migration guide for App developers is available in Embedded Actions.
Configurable Columns¶
Configurable Columns have been redesigned for improved usability. You can now easily toggle columns on and off via moveable checkboxes, while preserving the order of selected columns.
Job Console¶
When running jobs, Nautobot now optionally captures and displays all console output in the Job Console tab, including logs previously omitted due to log settings or C-program output. You can now see the complete console log as if running the job interactively, creating a clear separation between job troubleshooting (Job Console) and job reporting (Job Log Entries).
Custom Field Scoping¶
Custom Fields can now be scoped to display or edit only when specific, user-defined filtering conditions are met. Previously, all Custom Fields appeared on all objects. Common use cases include:
- Displaying SMARTnet details for
Deviceobjects only when the device is a Cisco model. - Showing local contact information for
Locationobjects only when theLocationTypeisSite. - Presenting ATT billing account information for
Circuitobjects only when the circuit is an ATT circuit.
Python 3.14 Support¶
Added official support for Python 3.14.
Bulk Rename for More Models¶
UI viewsets inheriting from NautobotUIViewSet now include a Rename bulk action alongside Bulk Edit and Bulk Delete when their model exposes an editable name field. Users can supply a find/replace pattern (literal string or regular expression) against the selected objects' names and preview the resulting names before applying the change. Previously, bulk rename was only available on a small number of legacy views. Models without a name field are automatically opted out, so Apps pick this up with no code changes required.
To ensure server responsiveness, regular-expression patterns submitted for bulk rename are validated before execution and may be rejected with a clear error message if too complex. Additionally, only objects visible to the user can be renamed in bulk, unlike other bulk operations that allow the full queryset. This ensures users can preview changes before applying them.
Changed¶
HTMX List View Rendering¶
In Nautobot 3.1, object list views (including both those derived from generic.ObjectListView and those using NautobotUIViewSet) now load in two stages (using HTMX) to improve the responsiveness of the UI. Custom implementations of these views, and/or custom test cases written for these views, may require some updates to handle this behavior correctly. Refer to the developer documentation for more specific guidance.
Async Global Search¶
Global search is now loaded asynchronously. When performing a search, results are returned incrementally, so you see matches immediately without waiting for the slowest queries to complete.
Improved Location and Prefix List Views¶
In addition to the generalized list-view performance enhancements described above, the list views for Location and Prefix records specifically have been enhanced in several ways:
- The rendering of the "tree" data hierarchy for these records has in general been improved to visualize object relationships more clearly.
- An administrator can configure
LOCATION_LIST_DEFAULT_MAX_DEPTHand/orPREFIX_LIST_DEFAULT_MAX_DEPTHto limit the depth of data that's initially retrieved and rendered when first accessing these list views, improving their responsiveness substantially at high data scale. - Users can interactively "drill down" into deeper nested data as needed with a few quick clicks, incrementally loading additional "child" records on the fly.
Deprecated¶
assertQuerysetEqualAndNotEmpty() Test Method¶
The Nautobot test method assertQuerysetEqualAndNotEmpty() has been deprecated in favor of the new assertQuerySetEqualAndNotEmpty() method (note change in capitalization) to align with Django's assertQuerySetEqual() test method. Support for assertQuerysetEqualAndNotEmpty() may be removed in a future Nautobot release.
Dependencies¶
Django 5.2¶
Nautobot 3.1 upgrades the core Django dependency from 4.2.x LTS to 5.2.x LTS. Nautobot has been updated accordingly, but Apps and third-party dependencies may need to update to newer versions for compatibility with Django 5.2.
v3.1.1 (2026-04-27)¶
Security in v3.1.1¶
- #8840 - Updated dependency
GitPythonto>=3.1.47,<3.2to mitigate CVE-2026-42215 and CVE-2026-42284. - #8895 - Updated dependency
lxmlto6.1.0to mitigate CVE-2026-41066. As this is not a direct dependency, it will not auto-update when upgrading; please be sure to upgrade your local environment.
Added in v3.1.1¶
- #8876 - Added
render_default_panels_for_objecttemplate tag. - #8883 - Added copyright notice to the About page.
Changed in v3.1.1¶
- #8894 - Changed the CSV export algorithm to speed up the export of a large number of objects.
Fixed in v3.1.1¶
- #6199 - Fixed job class template override not working when
template_nameis set as a Meta attribute. - #8876 - Re-added placeholders for files
nautobot/extras/templates/extras/inc/jobresult_js.html,nautobot/project-static/js/job_result.js, andnautobot/project-static/js/log_level_filtering.jsthat were removed in 3.1.0, in order to avoid breaking Apps still referencing these files. - #8877 - Fixed incorrect refreshing of GitRepository "Synchronization Status" tab.
- #8885 - Fixed Kubernetes job kwarg serialization.
- #8887 - Fixed
NoReverseMatchcrash when adding Data Validation Rules.
Dependencies in v3.1.1¶
- #8840 - Updated dependency
djangorestframeworkto>=3.17.1,<3.18. - #8840 - Updated dependency
psycopg2-binaryto>=2.9.12,<2.10. - #8840 - Updated dependency
social-auth-coreto>=4.8.6,<4.9. - #8880 - Updated npm dependency
htmx.orgto^2.0.10. - #8909 - Updated dependency
social-auth-coreto>=4.8.7,<4.9.
Documentation in v3.1.1¶
- #8820 - Added documentation on how to set logging levels for Nautobot Jobs.
- #8873 - Improved documentation for VPN Terminations, VPN service types, and related VPN models added in v3.1.0.
Housekeeping in v3.1.1¶
- #8840 - Updated development dependency
richto~14.3.4. - #8840 - Updated documentation dependency
mkdocs-section-indexto~0.3.12. - #8840 - Updated documentation dependency
mkdocstringsto~1.0.4. - #8840 - Updated development dependency
ruffto~0.15.11. - #8880 - Updated npm development dependency
postcssto^8.5.10. - #8880 - Updated npm development dependency
prettierto^3.8.3. - #8906 - Fixed a unit test issue that was causing a number of view test cases to be incorrectly skipped.
- #8906 - Adjusted the RouteTargetFactory implementation to ensure data is suitable for use with the
bulk_renametest cases. - #8909 - Updated development dependency
ruffto~0.15.12. - #8909 - Updated development dependency
openapi-spec-validatorto~0.8.5.
v3.1.0 (2026-04-14)¶
Breaking Changes in v3.1.0¶
- #8825 - App developers who previously used the unsupported
UI_COLORSconstant should switch to the supportedEChartsThemeColorsto keep from breaking.
Security in v3.1.0¶
- #8842 - Updated dependency
Pillowto>=12.2.0,<13to mitigate a number of security vulnerabilities.
Added in v3.1.0¶
- #915 - Added overlay VPN service modeling to the
vpnapp: extendedVPNwithservice_type,status, andextra_attributes; addedVPNTerminationto bind a VPN service to a VLAN, Interface, or VMInterface, with support for VXLAN VNI validation and point-to-point service type enforcement. - #1702 - Added
datetimeCustom Field type. - #6161 - Added
front_imageandrear_imagefields toModuleType, matching the existing image support onDeviceType. - #8785 - Added
statefield to ScheduledJob model to explicitly track the scheduled job's lifecycle state. - #8794 - Added an
extra_columnsargument toobject_detail.ObjectsTablePanelto allow dynamically adding custom columns to related object tables in object detail views. - #8823 - Added bulk rename to all NautobotUIViewSets that have a name.
- #8855 - Added optional
refresh_on_close_if_doneflag to_JobModalButton.
Changed in v3.1.0¶
- #8785 - Changed
approval_requiredfield to property based onstate. - #8788 - Replaced
django-ajax-tablesby htmx for JobResult log entry loading and display. - #8825 - Updated the
UI_COLORSconstant for improved color contrast. - #8825 - Updated the
EChartsThemeColorsChoiceSet to match the new colors. - #8832 - Improved ECharts text contrast.
- #8838 - Increased width of object-bulk-edit form column to provide more room for field labels.
- #8839 - Disabled implicit inheritance of HTMX attributes from container HTML elements to contained elements (
htmx.config.disableInheritance = true).
Deprecated in v3.1.0¶
- #8788 - Deprecated
django_ajax_tablesdependency. It is recommended to use HTMX instead.
Removed in v3.1.0¶
- #8785 - Removed
approval_requiredfield from ScheduledJob model.
Fixed in v3.1.0¶
- #7146 - Fixed an issue where filtering a nested relation (e.g. interfaces with role filter on devices) via GraphQL would produce N+1 queries.
- #8690 - Fixed a 500 error when using tag-based permission constraints on objects with multiple matching tags.
- #8788 - Fixed
log_tableaction ignoring constrained permissions onJobLogEntryrecords. - #8804 - Decoupled rendering tab buttons in object detail view from initial page load context.
- #8804 - Fixed bug when navigating "Back" and "Forward" in browser caused active tab mismatch in object detail view.
- #8811 - Fixed missing last column table headers.
- #8814 - Fixed console log mode when job has set
has_sensitive_variables. - #8814 - Fixed setting of
resultdata when running a job with console logging enabled. - #8831 - Fixed inclusion of VPN and VPNTunnel models in global search.
- #8838 - Corrected labels for "Untagged VLAN", "Add Tagged VLANs", and "Remove Tagged VLANs" on Interface bulk-edit form.
- #8838 - Fixed handling of "Untagged VLAN" and "Tagged VLANs" fields on Interface create/edit form.
- #8846 - Fixed an AttributeError in GraphQL when querying ContentType records.
- #8847 - Fixed an exception in
test_filters_genericwhen an App didn't explicitly provide default Role and Status records for ContactAssociations. - #8851 - Corrected the message on the Dynamic Group detail view "Members" tab.
- #8857 - Fixed an exception when editing a Job whose definition has explicitly defined
task_queues. - #8857 - Fixed a case where the Job Result detail view wouldn't correctly refresh when the Job reached a terminal state.
Documentation in v3.1.0¶
- #8848 - Added documentation for the bulk rename feature.
Housekeeping in v3.1.0¶
- #6793 - Removed unused
prefetch_relatedclass attribute fromCircuitUIViewSet. - #7146 - Added the AssertNoRepeatedQueries context manager test helper to detect N+1 patterns in SQL queries.
- #7744 - Refactored ScheduledJob model related UI views to use
NautobotUIViewSet. - #8793 - Refactored ObjectChange model related UI views to use
UI component framework. - #8794 - Refactored ConfigContextSchema model related UI views to use
UI component framework. - #8810 - Refactored GitRepository model related UI views to use
UI component framework. - #8811 - Refactored Rack model related UI views to use
UI component framework. - #8812 - Refactored Job model related UI views to use
NautobotUIViewSet. - #8816 - Refactored DynamicGroup model related UI views to use
UI component framework. - #8854 - Fixed an intermittent test failure in
nautobot.core.tests.test_jobs.LogsCleanupTestCase. - #8864 - Updated the App marketplace entries and template logic for licensing.
v3.1.0a5 (2026-04-07)¶
Security in v3.1.0a5¶
- #8819 - Updated dependency
Djangoto>=5.2.13,<5.3to mitigate CVE-2026-33033 and others.
Changed in v3.1.0a5¶
- #8805 - JobResult modal now displays link to View job results as soon as the modal loads.
- #8813 - Changed job form modal to replace the Run button with a disabled "Enqueuing..." button and spinner when the form is submitted.
Fixed in v3.1.0a5¶
- #8784 - Fixed invalid results in Static Assignment to Dynamic Groups embedded search.
Housekeeping in v3.1.0a5¶
- #8799 - Fixed state leakage between consecutive calls to
merge-image-digestsGitHub action.
v3.1.0a4 (2026-04-02)¶
Security in v3.1.0a4¶
- #8663 - Updated dependency
Djangoto>=5.2.12,<5.3to mitigate CVE-2026-25673 and CVE-2026-25674.
Added in v3.1.0a4¶
- #8578 - Added jobs to manage and clean up custom field data.
- #8612 - Implemented embedded object search.
- #8627 - Added the ability to run k8s jobs with the console log.
- #8627 - Added
execute_job_resultmanagement command introduced as the shared leaf executor for bothrunjob --localandrunjob_with_job_resultflows and JobConsoleLogExecutor subprocess mode. - #8644 - Added
deferred_renderflag to UI Component FrameworkComponentclass, allowing components to opt in to deferred rendering via HTMX to improve initial page render times. - #8644 - Added deferred-rendering placeholder templates for generic
Component,Button, andPanelclasses. - #8644 - Added autogenerated but overridable
component_idhash string to each UIComponentinstance. - #8644 - Enhanced
ObjectViewandNautobotUIViewSetMixinto support HTMX queries with?component_idquery parameter to render a single UIComponenton request. - #8644 - Enhanced
ObjectDetailContentto support looking up its memberComponentinstances by theircomponent_id. - #8650 - Added
Re-Runbutton toConsole Logtab. - #8650 - Added saving the same data in
JonConsoleEntrywhich are stored inJobLogEntrywhen console log is enabled. - #8650 - Added
sanitizedata before saving it toJobConsoleEntry. - #8672 - Added experimental
_JobModalButtonas an ObjectDetail Component. - #8689 - Added ARM64 variants for all published Docker images.
- #8693 - Added support for bulk adding and removing VLANs from interfaces.
- #8703 - Added
export_job_console_entriesaction to JobResult to download console entries to plain text file. - #8723 - Added a note to Job forms when the job has no user inputs to avoid rendering an empty card.
- #8738 - - Added
pre_deletesignalprevent_delete_definition_with_pending_workflowsonApprovalWorkflowDefinitionto block deletion when pendingApprovalWorkflowinstances exist. - #8738 - - Added
pre_deletesignalprevent_delete_stage_definition_with_pending_stagesonApprovalWorkflowStageDefinitionto block deletion when pendingApprovalWorkflowStageinstances exist. - #8738 - - Added
_handle_validation_erroroverride inApprovalWorkflowDefinitionUIViewSetto display a user-friendly HTML error message with a link to the affected workflows when deletion is blocked by a pending workflow signal. - #8750 - Added boolean column for JobResult table showing whether a record has a console log or not, set as default column.
- #8750 - Added
has_job_console_entriesfilter for JobResults. - #8750 - Added action buttons on JobResult list view for downloading console output and job logs.
- #8751 - Added logic to
object_list.htmlto handle error responses when loading table contents over HTMX.
Changed in v3.1.0a4¶
- #7066 - Add support for parent-child device types to enable multi-level nested devices.
- #8627 - Changed
runjob --localnow delegates execution toexecute_job_resultinsteadJobResult.execute_job. - #8627 - Changed
runjob_with_job_resultnow delegates toexecute_job_resultdirectly (non-console path) or via JobConsoleLogExecutor subprocess (console path), replacing its previous execution logic. - #8635 - Updated CustomField clean method to block setting both required and scope filter values
- #8635 - Updated UI to hide scope filter section when required is marked.
- #8644 - Changed Device detail view "Power Utilization" panel to deferred rendering via HTMX to improve page loading performance.
- #8650 - Report for status is also displayed and saved to
JobConsoleEntrywhen console log is enabled. - #8696 - Changed "dependent object search" modal behavior so that when first opened, an initial search query is automatically triggered.
- #8696 - Changed global search behavior to display only a single loading spinner while search is in progress.
- #8696 - Changed Location and Prefix list view behavior so that when table subtrees are toggled, the "Showing X of Y" pagination info is hidden.
- #8703 - Changed
render_on_tab_idfromButtonclass to support also a list. - #8716 - Added rendering custom form templates capability to Embedded Create modal.
- #8738 - Changed
ApprovalWorkflow.approval_workflow_definitionon_deletebehavior fromCASCADEtoSET_NULL. - #8738 - Changed
ApprovalWorkflowStage.approval_workflow_stage_definitionon_deletebehavior fromCASCADEtoSET_NULL. - #8753 - Changed the default ordering of models in the global Search results to place Device, Location, Prefix, and IPAddress first in the results, followed by all remaining core models, followed by all app models.
- #8753 - Changed behavior of
LOCATION_LIST_DEFAULT_MAX_DEPTH,PREFIX_LIST_DEFAULT_MAX_DEPTH, andPREFIX_LIST_DEFAULT_CONTAINER_ONLYsettings to simply redirect unfiltered access to the Prefix and Location list views to a filtered equivalent, rather than automagically filtering the data behind the scenes. - #8770 - Changed handling of
nautobot_config.pyto be passed explicitly via--config=settings.SETTINGS_PATHin job execution commands. - #8777 - Updated the CustomField's Job name.
- #8787 - Replaced Bootstrap FileStyle library with standard Bootstrap 5 file input.
Deprecated in v3.1.0a4¶
- #8787 - Deprecated Bootstrap FileStyle library as a provided dependency. It is recommended to use Bootstrap 5 file input instead.
Removed in v3.1.0a4¶
- #8703 - Removed
Re-Runbutton fromConsole Logtab in Job Result detail view.Re-Runbutton it's only available onJob Resulttab.
Fixed in v3.1.0a4¶
- #8627 - Fixed missing fallback value for
last_timestampwhen no console log entries exist. - #8649 - Fixed displaying Django messages after dependent objects creation.
- #8649 - Fixed form error message wrapping.
- #8650 - Fixed subprocess-based(console log) job execution incorrectly reporting SUCCESS when a job raised an exception, caused by Celery eager mode silently capturing exceptions inside EagerResult rather than propagating them to the subprocess exit code.
- #8650 - Fixed
task_namewhen job is run immediately with console log. - #8662 - Fixed component ID generation crash caused by non-string dictionary keys.
- #8693 - Fixed styling for two boolean columns.
- #8717 - Fixed bug with
_JobModalButtonmodifying class instead of context. - #8720 - Fixed validation of ApprovalWorkflowDefinition formset to require at least one stage on create and update.
- #8750 - Fixed JobResult rerun behavior to persist the "console log" field properly.
- #8769 - Fixed Git Repositories table "Sync" action button.
- #8773 - Fixed eChart title color handling between dark mode and light mode switching.
Dependencies in v3.1.0a4¶
- #8728 - Updated dependency
django-filterto>=25.2,<25.3. - #8728 - Updated dependency
django-silkto>=5.5.0,<5.6. - #8728 - Updated dependency
djangorestframeworkto>=3.17.0,<3.18. - #8728 - Updated dependency
kubernetesto>=35.0.0,<36. - #8728 - Updated dependency
Markdownto>=3.10.2,<3.11. - #8728 - Updated dependency
prometheus-clientto>=0.24.1,<0.25. - #8728 - Updated dependency
social-auth-app-djangoto>=5.7.0,<5.8. - #8728 - Updated optional dependency
django-auth-ldapto>=5.3.0,<5.4.
Documentation in v3.1.0a4¶
- #8692 - Updated the 3.1 release documentation with the new features.
- #8716 - Added Embedded Actions migration guide for Nautobot App developers.
- #8774 - Updated release process documentation to reflect available automation.
Housekeeping in v3.1.0a4¶
- #6267 - Replaced third-party GitHub action in release CI.
- #8632 - Improved reliability of
nautobot.ipam.tests.integration.test_prefixesintegration test cases. - #8656 - Merged in latest fixes and updates from v3.0.8.
- #8689 - Refactored GitHub CI to use multi-architecture runners for Docker image build and publish.
- #8697 - Fixed Docker image publication for integration branches and releases.
- #8699 - Fixed isolation of docker image digests by cache scope when building multiple images in a single workflow.
- #8711 - Merged in latest fixes and updates from v3.0.9.
- #8719 - Updated development dependency
coverageto~7.13.5. - #8719 - Updated development dependency
django-debug-toolbarto~6.2.0. - #8719 - Updated development dependency
fakerto^40.11.0. - #8719 - Updated development dependency
openapi-spec-validatorto~0.8.4. - #8719 - Updated development dependency
richto~14.3.3. - #8719 - Updated development dependency
ruffto~0.15.6. - #8719 - Updated development dependency
time-machineto~3.2.0. - #8719 - Updated development dependency
yamllintto~1.38.0. - #8721 - Updated documentation dependency
mkdocstringsto~1.0.3. - #8721 - Updated documentation dependency
mkdocstrings-pythonto~2.0.3. - #8721 - Updated development dependency
pylintto~4.0.5. - #8721 - Updated development dependency
pylint-djangoto~2.7.0. - #8721 - Updated development dependency
ruffto~0.15.7. - #8770 - Added
CelerySubprocessTestCaseutility to facilitate E2E testing of Celery tasks that spawn subprocesses. - #8774 - Updated PyPI publication to use Trusted Publisher.
- #8792 - Merged in latest code and updates from v3.0.10.
v3.1.0a3 (2026-02-25)¶
Added in v3.1.0a3¶
- #2516 - Enhanced Prefix list view to support dynamic expansion/collapsing of prefix subtrees.
- #2516 - Added support for
prefix_and_descendantsfilter on Prefix list view. - #2516 - Added option for
ButtonsColumnin tables to be passed an explicitreturn_urlin the render context in order to override its default behavior. - #2516 - Added
Prefix.next_siblingproperty. - #2516 - Added
/ipam/prefixes/<uuid>/children/URL endpoint in support of enhanced Prefix list view functionality. - #8516 - Added dynamically rendered scope filter fields to the Custom Field edit form.
- #8524 - Added
Console Logtab to Job Result detail view. - #8524 - Added
job_console_entriesaction toJobResultUIViewSetto stream output from SQL into the UI in realtime. - #8524 - Modified
runjob_with_job_result.pycommand torun_jobinstead ofexecute_job. - #8524 - Improved
job_result.jsandjob_level_filtering.js. - #8546 - Implemented embedded create and search buttons accompanying dynamic model choice fields.
- #8551 - Added
max_depthfilter support to the Location list view. - #8551 - Added
max_depthfilter to the Location basic filter form. - #8551 - Added support for the setting/Constance variable
LOCATION_LIST_DEFAULT_MAX_DEPTH. Configuring this may improve the performance of the Location list view at scale. - #8559 - Implemented embedded object creation modal.
- #8562 - Added tables of "Sibling Prefixes" and "Child Prefixes" to Prefix detail view.
- #8562 - Added
TreeModel.siblingsconvenience property. - #8562 - Added table of "Sibling Locations" to Location detail view.
- #8571 - Added testing of
test_filter_form_fields_are_workingto catch more filter form issues. - #8579 - Added role-based precedence for
console_log(Author -> Admin -> Runner). - #8579 - Added the ability to run scheduled jobs with the console log.
Changed in v3.1.0a3¶
- #8527 - Changed behavior of
PREFIX_LIST_DEFAULT_MAX_DEPTHandmax_depthPrefix filter to start at 1 instead of 0. - #8527 - Changed behavior of table paginator widget to automatically return to page 1 when changing the
per_pageselection. - #8527 - Renamed Prefix table column "Children" to "Descendants" for improved clarity.
- #8527 - Changed hierarchy rendering in Prefix table to more clearly indicate parent, child, and sibling relations.
- #8537 - Updated testing of
test_model_properties_as_table_columns_are_not_orderableto catch more sortable issues. - #8551 - Changed Location list view behavior so that filtering by the filters
max_depthand/orsubtree(in the absence of any other filters) will not prevent the indentation of locations based on their nesting depth. - #8562 - Renamed "Child Prefixes" tab on Prefix detail view to "Descendant Prefixes" for clarity.
- #8562 - Renamed "Parent Prefixes" table on Prefix detail view to "Ancestor Prefixes" for clarity.
- #8564 - Updated the logic that determines which nav menu item is marked "active" to always prefer exact URL matches before falling back to introspecting the view and model.
- #8579 - Job run form split into 3 separate sections:
Job Data,Job ExecutionandJob Schedule Type. - #8579 -
Job.as_form()no longer includes execution fields (_profile,_console_log,_job_queue,_ignore_singleton_lock). These have been moved to the newJob.as_execution_form(). - #8579 -
Job.as_execution_form()added as a new classmethod returning a standaloneJobExecutionFormpopulated with execution-related fields only. - #8579 -
JobRunView.post()updated to validatejob_form,job_execution_form, andschedule_formindependently. Execution fields are now read fromjob_execution_form.cleaned_dataand job data fields fromjob_form.cleaned_data. - #8579 - Template
nautobot/extras/templates/extras/job.htmlupdated to render three separate cards:Job Data,Job Execution, andJob Schedule Type. - #8596 - Changed behavior of model edit forms to hide custom fields that are out of scope.
- #8596 - Improved unit test coverage for scope filter HTMX endpoint.
- #8609 - Made embedded object create form footer sticky.
- #8617 - Enhanced Location list view tree rendering to follow the same pattern as Prefix list view tree.
- #8622 - Restored support for
DATE_FORMAT,DATETIME_FORMAT,SHORT_DATE_FORMAT,SHORT_DATETIME_FORMAT, andTIME_FORMATsettings. - #8622 - Removed user-defined locale/language selection feature (previously introduced for 3.1 by #8417).
- #8628 - Changed "global" search to load results incrementally with HTMX in order to avoid timing out when searching a large amount of data.
Fixed in v3.1.0a3¶
- #8527 - Fixed
per_pagelist view dropdown not working in Chrome and similar browsers. - #8537, #8571 - Fixed sorting on multiple tables.
- #8562 - Fixed a warning appearing in Firefox when updating table configuration in a view that contained multiple instances of the same table class.
- #8570 - Fixed an exception under Django 5.2 when bulk-editing or bulk-deleting certain types of records.
- #8597 - Fixed initial HTMX loading of Job list view (table or tiles).
- #8597 - Fixed rendering of "Descendants" column in Prefix table.
- #8597 - Fixed duplicated messages when applying invalid filters to object list views.
- #8602 - Fixed ECharts not resizing with their container.
- #8617 - Reduced the number of database queries needed to render Location tree view.
Dependencies in v3.1.0a3¶
- #8563 - Added declared support for Python 3.14.
Documentation in v3.1.0a3¶
- #8527 - Improved developer documentation and release note content about HTMX.
Housekeeping in v3.1.0a3¶
- #8532 - Changed the Python API for the UI components to allow default values to be set directly as class attributes.
- #8602 - Decoupled the EChartsPanel and EChartsBase classes.
- #8602 - Removed the redundant
permissionattribute from the EChartsBase class. - #8622 - Removed leftover test case for
social-auth-app-djangopatch.
v3.1.0a2 (2026-02-10)¶
Housekeeping in v3.1.0a2¶
- #8538 - Fixed missing end of conditional in release CI.
v3.1.0a1 (2026-02-10)¶
Breaking Changes in v3.1.0a1¶
- #694 - Removed support for settings variables
DEFAULT_FILE_STORAGE,JOB_FILE_IO_STORAGE,STATICFILES_STORAGE,STORAGE_BACKEND, andSTORAGE_CONFIG. These are all now incorporated into the Django standardSTORAGESsettings variable. - #8459 - Dropped support for PostgreSQL versions 12 and 13 as a consequence of upgrading to Django 5.2.
Security in v3.1.0a1¶
- #8459 - Updated dependency
social-auth-app-djangoto 5.6.0 in order to pick up the official fix forCVE-2025-61783, and removed the local patch previously implemented in Nautobot for that vulnerability. - #8507 - Updated dependency
djangoto>=5.2.11,<5.3to mitigate several CVEs including CVE-2026-1287 and CVE-2026-1312.
Added in v3.1.0a1¶
- #7018 - Added support for per-user configuration of preferred language/locale through the User Preferences UI. Currently this configuration applies primarily to date/time display in the UI.
- #7957 - Added
port_typefield to Interface and InterfaceTemplate models to track physical connector type. - #8410 - Added
scope_filterfield toCustomFieldmodel. - #8427 - Added checks for
CustomField.scope_filterto show/hide custom fields on object detail view based on scope filters. - #8457 - Implemented table column config drag and drop.
- #8458 - Added initial support for running jobs in a subprocess and asynchronously capturing console output.
- #8461 - Implemented table column config saved ordering on unselected columns.
- #8468 - Added
max_depthfilter support to the Prefix list view. - #8468 - Added
max_depthandnamespacefilters to the Prefix basic filter form. - #8468 - Added support for the settings/Constance variables
PREFIX_LIST_DEFAULT_MAX_DEPTHandPREFIX_LIST_DEFAULT_CONTAINER_ONLY. Configuring either or both of these may improve the performance of the Prefix list view at scale. - #8498 - Added saving output (stdout/stderr) line by line to
JobConsoleEntrytable.
Changed in v3.1.0a1¶
- #8446 - Changed object list views to render in two passes with HTMX, improving initial load times.
- #8446 - Changed rendering of table sorting indicator arrows from client-side to server-side rendering.
- #8450 - Converted table column config to checkboxes.
- #8468 - Enhanced the "Max Length" dropdown in the Prefix list view to allow deselecting a previously selected value.
- #8468 - Changed Prefix list view behavior so that filtering by the filters
ip_version,max_depth,namespace,prefix_length__lte, and/ortype=container(in the absence of any other filters) will not prevent the indentation of prefixes based on their nesting depth.
Deprecated in v3.1.0a1¶
- #8459 - Following upstream Django patterns, the test helper method
assertQuerysetEqualAndNotEmptyhas been renamed toassertQuerySetEqualAndNotEmpty. The old method name is still available but is deprecated and will be removed in a future release.
Removed in v3.1.0a1¶
- #7018 - As a consequence of upgrading to Django 5.2, necessarily removed support for customizing date/time display in the UI through
nautobot_config.pysettingsDATE_FORMAT,DATETIME_FORMAT,TIME_FORMAT,SHORT_DATE_FORMAT, andSHORT_DATETIME_FORMAT. Formatting of date/time information is now controlled by the application-levelLANGUAGE_CODEsetting and/or by per-user language preferences.
Fixed in v3.1.0a1¶
- #7018 - Fixed rendering of "last sync time" and "last synced by" columns in Git Repository list view.
- #8315 - Fixed bug in Interface template causing emdash to not be used for Port Type if no value was set.
- #8349 - Fixed unit tests failing after upgrading to Django 5.2.
- #8422 - Fixed incompatibilities with
django_celery_beatv2.8.1. - #8468 - Fixed dynamic-group filter calculation for cases where the filter is using
exclude=True. - #8479 - Fixed missing text on the trace action button.
Dependencies in v3.1.0a1¶
- #8459 - Updated dependency
djangoto>=5.2.10,<5.3. - #8459 - Updated dependency
django-celery-beatto==2.8.1for compatibility with Django 5.2; pinned to an exact version due to Nautobot's use of some internals of this dependency.