Skip to content

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 using index_together will need to migrate to use Model.Meta.indexes instead and create a database migration accordingly.
  • Models using a ManyToManyField with an explicit through table (as is recommended by Nautobot) may need to run nautobot-server makemigrations <app> to generate a schema migration explicitly specifying the through_fields for each such ManyToManyField.
  • The test method assertQuerysetEqual() (previously deprecated in Django 4.2) is removed; App tests using this method will need to migrate to use assertQuerySetEqual() (note capitalization) instead.
  • Nautobot previously maintained a Django templatetag named querystring, which may conflict with the built-in querystring templatetag 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, use nautobot.app.templatetags.legacy_querystring instead.

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 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 Device objects only when the device is a Cisco model.
  • Showing local contact information for Location objects only when the LocationType is Site.
  • Presenting ATT billing account information for Circuit objects 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.

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_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, 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 GitPython to >=3.1.47,<3.2 to mitigate CVE-2026-42215 and CVE-2026-42284.
  • #8895 - Updated dependency lxml to 6.1.0 to 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_object template 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_name is 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, and nautobot/project-static/js/log_level_filtering.js that 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 NoReverseMatch crash when adding Data Validation Rules.

Dependencies in v3.1.1

  • #8840 - Updated dependency djangorestframework to >=3.17.1,<3.18.
  • #8840 - Updated dependency psycopg2-binary to >=2.9.12,<2.10.
  • #8840 - Updated dependency social-auth-core to >=4.8.6,<4.9.
  • #8880 - Updated npm dependency htmx.org to ^2.0.10.
  • #8909 - Updated dependency social-auth-core to >=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 rich to ~14.3.4.
  • #8840 - Updated documentation dependency mkdocs-section-index to ~0.3.12.
  • #8840 - Updated documentation dependency mkdocstrings to ~1.0.4.
  • #8840 - Updated development dependency ruff to ~0.15.11.
  • #8880 - Updated npm development dependency postcss to ^8.5.10.
  • #8880 - Updated npm development dependency prettier to ^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_rename test cases.
  • #8909 - Updated development dependency ruff to ~0.15.12.
  • #8909 - Updated development dependency openapi-spec-validator to ~0.8.5.

v3.1.0 (2026-04-14)

Breaking Changes in v3.1.0

  • #8825 - App developers who previously used the unsupported UI_COLORS constant should switch to the supported EChartsThemeColors to keep from breaking.

Security in v3.1.0

  • #8842 - Updated dependency Pillow to >=12.2.0,<13 to mitigate a number of security vulnerabilities.

Added in v3.1.0

  • #915 - Added overlay VPN service modeling to the vpn app: extended VPN with service_type, status, and extra_attributes; added VPNTermination to 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 datetime Custom Field type.
  • #6161 - Added front_image and rear_image fields to ModuleType, matching the existing image support on DeviceType.
  • #8785 - Added state field to ScheduledJob model to explicitly track the scheduled job's lifecycle state.
  • #8794 - Added an extra_columns argument to object_detail.ObjectsTablePanel to 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_done flag to _JobModalButton.

Changed in v3.1.0

  • #8785 - Changed approval_required field to property based on state.
  • #8788 - Replaced django-ajax-tables by htmx for JobResult log entry loading and display.
  • #8825 - Updated the UI_COLORS constant for improved color contrast.
  • #8825 - Updated the EChartsThemeColors ChoiceSet 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_tables dependency. It is recommended to use HTMX instead.

Removed in v3.1.0

  • #8785 - Removed approval_required field 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_table action ignoring constrained permissions on JobLogEntry records.
  • #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 result data 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_generic when 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_related class attribute from CircuitUIViewSet.
  • #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 Django to >=5.2.13,<5.3 to 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-digests GitHub action.

v3.1.0a4 (2026-04-02)

Security in v3.1.0a4

  • #8663 - Updated dependency Django to >=5.2.12,<5.3 to 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_result management command introduced as the shared leaf executor for both runjob --local and runjob_with_job_result flows and JobConsoleLogExecutor subprocess mode.
  • #8644 - Added deferred_render flag to UI Component Framework Component class, 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, and Panel classes.
  • #8644 - Added autogenerated but overridable component_id hash string to each UI Component instance.
  • #8644 - Enhanced ObjectView and NautobotUIViewSetMixin to support HTMX queries with ?component_id query parameter to render a single UI Component on request.
  • #8644 - Enhanced ObjectDetailContent to support looking up its member Component instances by their component_id.
  • #8650 - Added Re-Run button to Console Log tab.
  • #8650 - Added saving the same data in JonConsoleEntry which are stored in JobLogEntry when console log is enabled.
  • #8650 - Added sanitize data before saving it to JobConsoleEntry.
  • #8672 - Added experimental _JobModalButton as 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_entries action 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_delete signal prevent_delete_definition_with_pending_workflows on ApprovalWorkflowDefinition to block deletion when pending ApprovalWorkflow instances exist.
  • #8738 - - Added pre_delete signal prevent_delete_stage_definition_with_pending_stages on ApprovalWorkflowStageDefinition to block deletion when pending ApprovalWorkflowStage instances exist.
  • #8738 - - Added _handle_validation_error override in ApprovalWorkflowDefinitionUIViewSet to 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_entries filter for JobResults.
  • #8750 - Added action buttons on JobResult list view for downloading console output and job logs.
  • #8751 - Added logic to object_list.html to 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 --local now delegates execution to execute_job_result instead JobResult.execute_job.
  • #8627 - Changed runjob_with_job_result now delegates to execute_job_result directly (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 JobConsoleEntry when 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_id from Button class to support also a list.
  • #8716 - Added rendering custom form templates capability to Embedded Create modal.
  • #8738 - Changed ApprovalWorkflow.approval_workflow_definition on_delete behavior from CASCADE to SET_NULL.
  • #8738 - Changed ApprovalWorkflowStage.approval_workflow_stage_definition on_delete behavior from CASCADE to SET_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, and PREFIX_LIST_DEFAULT_CONTAINER_ONLY settings 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.py to be passed explicitly via --config=settings.SETTINGS_PATH in 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-Run button from Console Log tab in Job Result detail view. Re-Run button it's only available on Job Result tab.

Fixed in v3.1.0a4

  • #8627 - Fixed missing fallback value for last_timestamp when 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_name when 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 _JobModalButton modifying 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-filter to >=25.2,<25.3.
  • #8728 - Updated dependency django-silk to >=5.5.0,<5.6.
  • #8728 - Updated dependency djangorestframework to >=3.17.0,<3.18.
  • #8728 - Updated dependency kubernetes to >=35.0.0,<36.
  • #8728 - Updated dependency Markdown to >=3.10.2,<3.11.
  • #8728 - Updated dependency prometheus-client to >=0.24.1,<0.25.
  • #8728 - Updated dependency social-auth-app-django to >=5.7.0,<5.8.
  • #8728 - Updated optional dependency django-auth-ldap to >=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_prefixes integration 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 coverage to ~7.13.5.
  • #8719 - Updated development dependency django-debug-toolbar to ~6.2.0.
  • #8719 - Updated development dependency faker to ^40.11.0.
  • #8719 - Updated development dependency openapi-spec-validator to ~0.8.4.
  • #8719 - Updated development dependency rich to ~14.3.3.
  • #8719 - Updated development dependency ruff to ~0.15.6.
  • #8719 - Updated development dependency time-machine to ~3.2.0.
  • #8719 - Updated development dependency yamllint to ~1.38.0.
  • #8721 - Updated documentation dependency mkdocstrings to ~1.0.3.
  • #8721 - Updated documentation dependency mkdocstrings-python to ~2.0.3.
  • #8721 - Updated development dependency pylint to ~4.0.5.
  • #8721 - Updated development dependency pylint-django to ~2.7.0.
  • #8721 - Updated development dependency ruff to ~0.15.7.
  • #8770 - Added CelerySubprocessTestCase utility 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_descendants filter on Prefix list view.
  • #2516 - Added option for ButtonsColumn in tables to be passed an explicit return_url in the render context in order to override its default behavior.
  • #2516 - Added Prefix.next_sibling property.
  • #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 Log tab to Job Result detail view.
  • #8524 - Added job_console_entries action to JobResultUIViewSet to stream output from SQL into the UI in realtime.
  • #8524 - Modified runjob_with_job_result.py command to run_job instead of execute_job.
  • #8524 - Improved job_result.js and job_level_filtering.js.
  • #8546 - Implemented embedded create and search buttons accompanying dynamic model choice fields.
  • #8551 - Added max_depth filter support to the Location list view.
  • #8551 - Added max_depth filter 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.siblings convenience property.
  • #8562 - Added table of "Sibling Locations" to Location detail view.
  • #8571 - Added testing of test_filter_form_fields_are_working to 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_DEPTH and max_depth Prefix 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_page selection.
  • #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_orderable to catch more sortable issues.
  • #8551 - Changed Location list view behavior so that filtering by the filters max_depth and/or subtree (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 Execution and Job 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 new Job.as_execution_form().
  • #8579 - Job.as_execution_form() added as a new classmethod returning a standalone JobExecutionForm populated with execution-related fields only.
  • #8579 - JobRunView.post() updated to validate job_form, job_execution_form, and schedule_form independently. Execution fields are now read from job_execution_form.cleaned_data and job data fields from job_form.cleaned_data.
  • #8579 - Template nautobot/extras/templates/extras/job.html updated to render three separate cards: Job Data, Job Execution, and Job 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, and TIME_FORMAT settings.
  • #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_page list 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 permission attribute from the EChartsBase class.
  • #8622 - Removed leftover test case for social-auth-app-django patch.

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, and STORAGE_CONFIG. These are all now incorporated into the Django standard STORAGES settings 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-django to 5.6.0 in order to pick up the official fix for CVE-2025-61783, and removed the local patch previously implemented in Nautobot for that vulnerability.
  • #8507 - Updated dependency django to >=5.2.11,<5.3 to 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_type field to Interface and InterfaceTemplate models to track physical connector type.
  • #8410 - Added scope_filter field to CustomField model.
  • #8427 - Added checks for CustomField.scope_filter to 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_depth filter support to the Prefix list view.
  • #8468 - Added max_depth and namespace filters to the Prefix basic filter form.
  • #8468 - Added support for the settings/Constance variables PREFIX_LIST_DEFAULT_MAX_DEPTH and PREFIX_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 JobConsoleEntry table.

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/or type=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 assertQuerysetEqualAndNotEmpty has been renamed to assertQuerySetEqualAndNotEmpty. 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.py settings DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, SHORT_DATE_FORMAT, and SHORT_DATETIME_FORMAT. Formatting of date/time information is now controlled by the application-level LANGUAGE_CODE setting 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_beat v2.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 django to >=5.2.10,<5.3.
  • #8459 - Updated dependency django-celery-beat to ==2.8.1 for compatibility with Django 5.2; pinned to an exact version due to Nautobot's use of some internals of this dependency.

Housekeeping in v3.1.0a1

  • #8327 - Updated pyproject.toml to be compatible with PEP 621.
  • #8327 - Updated Nautobot development environment to require Poetry 2.x.
  • #8377 - Fixed a bad merge in pyproject.toml.
  • #8502 - Improved the Docker build process and tagging in CI.