v3.3.0a1 (2026-11-09)
Breaking Changes in v3.3.0a1
- #4138 - It is no longer possible to change the
ip_address,interface, orvm_interfaceof an existing IP Address Assignment (IPAddressToInterface), including via the REST API; delete the assignment and create a new one instead.
Added in v3.3.0a1
- #4138 - Added
PRIMARY_IP_REQUIRES_INTERFACE_ASSIGNMENTconfiguration setting; when disabled, an IP address that is not assigned to any interface can be designated as the primary IP of a Device, Virtual Machine, or Virtual Device Context. - #4138 - Added "Unassigned primary IPv4" and "Unassigned primary IPv6" fields to the Device, Virtual Machine, and Virtual Device Context create/edit forms when
PRIMARY_IP_REQUIRES_INTERFACE_ASSIGNMENTis disabled, allowing a primary IP to be set at creation time. - #4138 - Added
primary_ip4_for_virtual_machinesandprimary_ip6_for_virtual_machinesreverse relations from IP Address to Virtual Machine, including in GraphQL. - #4138 - Added
assignedfilter to IP Addresses, matching IP addresses that are assigned to an interface or designated as the primary IP of a Device, Virtual Machine, or Virtual Device Context. - #4138 - Added optional "Primary IP For" column to the IP Address list view.
- #4138 - Added display of the Devices, Virtual Machines, and Virtual Device Contexts using an IP address as their primary IP to the "Assignment" row of the IP Address detail view, when the IP address is not assigned to any interface.
- #8520 - Added drag-and-drop reordering for navbar favorite pages.
- #9386 - Implemented UI toast component.
- #9402 - Added background refresh of Django messages while the browser tab is active.
- #9408 - Enhanced
ExportObjectListsystem Job to support export to JSON and YAML formats for all models. - #9409 - Added a Playwright-based UI test framework as the forward standard for browser-based test coverage: shared page-object and fixture infrastructure in
nautobot/playwright/, per-app test suites undernautobot/<app>/tests/integration/, an optionalplaywrightdependency group, aninvoke playwrighttask, and aplaywright-testCI job. The Locations list view filter Selenium test was replaced by its Playwright equivalent. - #9411 - Added support for rate limiting of REST API requests, with many new configuration options.
- #9411 - Added
to_int_or_nonehelper function tonautobot/core/utils/data.py - #9416 - Added a message to the "Export Object List" job when a many-to-many field has additional data recorded about each association (such as the priority recorded against each of an InterfaceRedundancyGroup's interfaces), noting which values are not included in the export and where to find them.
- #9420 - Added an internal
nautobot.extras.conditionspackage (comparison operators, event payload builder, and condition preset catalog) with acondition_presetsregistry that Apps can register into viaregister_condition_preset(). - #9421 - Added
ObjectOverviewViewMixin, providing a per-object overview endpoint onNautobotUIViewSet. - #9428 - Added a summary of recent successful run durations to the Job run form and job modal, showing the median and, for jobs whose runtime varies, the longest recent run.
- #9441 - Added
RequestPerformanceMeasurementsMiddlewareto measure and report request performance measurements as aServer-Timingheader in HTTP responses. - #9441 - Added
REQUEST_TOTAL_DURATION_HEADER_ENABLEDsettings variable, which when set to true enables a "total request duration" performance measurement on each request/response. - #9441 - Added
REQUEST_DB_DURATION_HEADER_ENABLEDsettings variable, which when set to true enables a "database query duration" performance measurement on each request/response. - #9448 - Enhanced
ExportObjectListsystem Job with anexport_fieldsparameter, restricting an export to the fields named and rendering the columns in that order. Fields may include nested references to related objects that the user has permission to view, such asstatus__nameordevice_type__manufacturer__name, as well as custom fields, such ascf_my_field. - #9448 - Added suppression of the
match_fieldsimport metadata when the selected fields do not cover the entirety of a model's default natural key. - #9450 - Added an expand button on object list rows that reveals an overview of the object's fields without leaving the list.
- #9455 - Added
ConditionTypeChoices. - #9455 - Added
ConditionRow(preset and raw-expression rows), expression compilation andcheck()to the internalnautobot.extras.conditionspackage. - #9462 - Enhanced the
ExportObjectListsystem Job to apply the launching list view's sort order, including a saved view's storedsort_order, in addition to its filters. - #9462 - Added a
nautobot-server export_objectsmanagement command that runs theExportObjectListJob locally, for development and manual testing of the export pipeline. - #9462 - Added
NON_FILTER_PARAMSandresolve_filter_params()tonautobot.apps.utils, for Apps that need to resolve the filters a list view has applied the way Nautobot's own list views resolve them. - #9468 - Added
ComplexityCostRateLimitingMiddlewareto instrument request complexity costs into response header. - #9469 - Added the
CHANGELOG_SKIP_UNCHANGED_SAVESsetting, which can be set toFalseto keep recording change records for saves that modify none of an object's field values, as Nautobot did before 3.3.0. - #9469 - Exposed
event_topic_has_subscriber()innautobot.apps.events, which reports whether any registered event broker would receive a given topic, so that an App can skip building a payload that nothing would consume. - #9501 - Added a "Fields to Export" picker to the export dialog and to the
Export Object ListJob's own form, for checking the specific fields to export - including fields of related objects, such as a device's manufacturer, and each custom field - and dragging them into the order the columns should appear in. - #9501 - Added a "Match the list view" button to that picker, which fills the selection in with the columns the list view is displaying, in the order it displays them - those of the saved view in use, else your own table configuration, else the table's defaults - so they can be reviewed and adjusted before the export runs. A related-object-count column is carried across as the relation it counts, where an export can emit that relation; any column with no exportable equivalent is named rather than quietly dropped.
- #9501 - Added a download button to the export progress dialog, offering the exported file as soon as the export finishes.
- #9501 - Added support for a Job variable's form field to be configured from the rest of the Job form, through a
configure_for_form()method, so that an App can offer a variable whose choices depend on what another variable is set to. - #9513 - Added a
conditionsfield to webhooks and job hooks. - #9513 - Added a condition preset catalog endpoint at
/api/extras/condition-presets/, so a client building condition rows reads the available presets and their parameters. - #9521 - Added evaluation of conditions on webhooks and job hooks, so an action that carries conditions now runs only for the changes those conditions accept.
- #9521 - Added an error log entry naming the action and the condition when a condition cannot be evaluated. The action does not run for that change.
- #9524 - Added
nautobot.apps.utils.mock_wsgi_requesthelper function. - #9524 - Added JSON and YAML support to the
Import Objectssystem Job, which previously accepted CSV only. The format is auto-detected from the file extension or content, or can be selected explicitly. - #9524 - Added support for importing a file that declares its own
model, in which case the content type need not be specified. A file that declares a different model than the one requested is refused. - #9524 - Added a
nautobot-server import_objectsmanagement command, which runs theImport ObjectsJob locally. - #9524 - Added a
ScriptVariable.defaultattribute, recording thedefault=a Job variable was declared with. - #9524 - Added
APIViewTestCases.CreateObjectViewTestCase.test_recreate_object_document, a generic per-model check that an object exported to the JSON/YAML document format can be imported back from it. - #9542 - Added row selection and bulk edit helpers (
select_row,click_edit_selected,expect_bulk_edit_count,get_bulk_edit_pks,apply_bulk_edit) tonautobot.playwright.list_page.ListPage. - #9543 - Added a
searchableattribute to nav menu items, so they can be excluded from the global search bar's model filters. - #9547 - Added in-place updates to the
Import Objectssystem Job: records that match an existing object, by default on its natural key, update that object instead of creating a new one. - #9547 - Added a
Meta.import_match_fieldsattribute for REST API serializers, declaring the match fields of a model whose natural key isn't spelled in the serializer's own fields, and declared it for IP addresses (namespace, andaddressmatched on its host alone), IP address ranges (namespace,start_address) and prefixes (prefix,namespace). - #9547 - Added support for
IPAddressRange.objects.filter(start_address=..., end_address=...)and the equivalentexclude(), as withIPAddress.objects.filter(address=...). - #9558 - Added
get_all_saved_views_for_usertonautobot.apps.views. - #9559 - Added request duration and db duration metrics to Prometheus.
- #9559 - Added rest complexity cost rate limiting metrics to Prometheus.
- #9561 - Added a Conditions section to the webhook and job hook edit forms, and a Conditions panel to their detail views.
- #9561 - Added
ColorSelectMultipletonautobot.apps.forms, aColorSelectfor a field that holds several colors at once. - #9562 - Added optional
depth,depth_unit,weightandweight_unitfields to the Device Type model. - #9562 - Added optional
weightandweight_unitfields to the Module Type model. - #9562 - Added the new depth and weight fields to the single-record YAML/JSON import and export of Device Types and Module Types, which follow the devicetype-library format.
- #9562 - Added
WeightUnitChoicestonautobot.apps.choices. - #9571 - Added a
job_formblock to theextras/htmx/job_form_modal.htmltemplate. - #9574 - Added the
containsoperator for a condition on a many-valued field such as tags. - #9584 - Added Custom Fields in conditions selects.
- #9588 - Added support for passing a file object as the
contentofJob.create_file(). - #9594 - Added the ability to favorite any page.
- #9602 - Added the
NAUTOBOT_RATE_LIMITING_CUSTOM_COMPLEXITY_COST_ESTIMATION_FUNCTIONsetting, allowing a deployment to replace Nautobot's built-in rate limiting complexity cost estimation with its own function. - #9605 - Added
DetailPage.click_edit(),ListPage.select_all_rows(),ListPage.select_all_matching(),ListPage.assign_all_matching_to_group()and therestore_page_sizefixture tonautobot.playwright. - #9615 - Added
ObjectFormPage,create_object.track(), and thecreated_location,created_device_typeandcreated_rolefixtures tonautobot.playwright. - #9671 - Added
nautobot.playwright.accessibility.assert_no_accessibility_violations()and theaxe_core_on_loadfixture for axe-core scans in Playwright tests. - #9704 - Added an "Import Mode" input ("Create/Update", "Create Only", or "Update Only") to the Import Objects system Job, and a matching
--modeoption tonautobot-server import_objects. - #9704 - Added a
can_importfilter to the content types REST API endpoint. - #9729 - Added sticky table headers to object list views.
- #9740 - Added
exportandimportmodel features andis_exportable_modelandis_importable_modelclass attributes onBaseModel, which a model can set toFalseto opt out of support by the "Export Object List" and "Import Objects" system Jobs respectively. - #9740 - Added
FeatureQuery.includes()method to check whether a given model supports a given feature. - #9753 - Added a search field to the object embedded search form.
- #9754 - Added the
namespacefield to IP Address and IP Address Range REST API responses; it was previously accepted on create but not returned. - #9754 - Added the
namespaceproperty to the IP Address and IP Address Range models. - #9754 - Added the
translate_import_match_field_and_value_to_database_lookup()serializer method, which an app's serializer can override to control how an import looks up existing records from a given match field. - #9754 - Added the
Meta.related_field_query_pathsserializer option, mapping a related field that exists only on the serializer to the database path it is reached by, for export and import matching. - #9754 - Added the
Meta.derived_fields_omitted_from_default_exportserializer option, listing fields that an export leaves out unless they are explicitly selected. - #9778 - Added
htmx_onlyoptional kwarg for use byNautobotViewSetMixinactions that only respond positively to HTMX requests.
Changed in v3.3.0a1
- #4138 - Changed Virtual Device Context primary IP validation to require that the IP address be assigned to one of the interfaces assigned to the Virtual Device Context, rather than to any of the parent Device's interfaces, and to also permit the NAT outside address of such an IP address.
- #4138 - Changed the "Assigned" column of the IP Address list view to also indicate IP addresses designated as the primary IP of a Device, Virtual Machine, or Virtual Device Context.
- #4138 - Changed the validation of Device, Virtual Machine, and Virtual Device Context primary IP addresses to permit a primary IP that is not assigned to any interface and is unchanged from its saved value, regardless of
PRIMARY_IP_REQUIRES_INTERFACE_ASSIGNMENT. - #4138 - Changed the IP Address merge tool to abort with an error, rather than complete, if the merged IP address would not be a valid primary IP for the Devices, Virtual Machines, and Virtual Device Contexts using the merged IP addresses as their primary IP.
- #4138 - Changed IP address to interface assignment validation to reject assigning an IP address to an interface that does not belong to the Device, Virtual Machine, or Virtual Device Context using it as a primary IP without an interface assignment.
- #9402 - Changed Django messages to render as toasts by default instead of alerts.
- #9408 - Changed the format of CSV exports produced by
ExportObjectListsystem Job to include a header comment containing metadata. - #9408 - Changed CSV exports to include more many-to-many fields by default.
- #9408 - Changed the
ExportObjectListsystem Jobexport_formatparameter to distinguish betweenyaml(the new generic YAML export format) anddevicetype_library(the custom YAML format used specifically for DeviceType and ModuleType interoperability with thedevicetype-libraryrepository). Previously running the Job withexport_format="yaml"would generate the latter format, now it generates the new format instead. - #9408 - Added database query optimizations to the
ExportObjectListsystem Job to improve performance of exports. - #9416 - Changed JSON/YAML export of many-to-many fields to nest each member's related-object keys (
software_version: {version: ...}) instead of flattening them (software_version__version: ...), matching how other related objects are exported. - #9469 - Changed saving an object that modifies none of its fields to no longer create a change record, and to no longer trigger webhooks, job hooks, or events. The object's
last_updatedtimestamp is still written. - #9469 - Changed the
prechangesnapshot in webhook and event payloads to be generated from the stored database row at the time of the save, instead of being retrieved from the object's previous ObjectChange record. - #9501 - Changed the "Export to file" action on object list views to open a dialog in which the export format and the fields to export can be selected, in place of the previous one-click "Export as CSV" and "Export as YAML" entries.
- #9501 - Changed the "Export to file" action to be disabled, with an explanatory tooltip, for users who cannot run the "Export Object List" Job, or when that Job is disabled.
- #9514 - Changed multiple custom links to be collected into a single dropdown menu.
- #9514 - Changed custom link buttons to display a link icon.
- #9516 - Changed
ComplexityCostRateLimitingMiddlewareto persist rate limit budget in Redis - #9516 - Renamed
NAUTOBOT_RATE_LIMITING_LIMITtoNAUTOBOT_RATE_LIMITING_REST_BUDGET - #9517 - Lightened borders, dividers, and navigation menu links hover highlight in dark mode.
- #9524 - Changed the
Import Objectssystem Job to reject data containing unrecognized fields, including unrecognizedcf_<key>custom fields, rather than silently ignoring them. Fields that Nautobot generates rather than stores, such asdisplayandobject_type, continue to be accepted and ignored so that an exported file re-imports unchanged. - #9524 - Changed the object-list "Import" button to read "Import from File", the Job now accepting more than CSV.
- #9543 - Excluded the following nav menu items from the global search bar's model filters: Apps Marketplace, Installed Apps, Device Constraints, IP Address Assignments, Wireless Controllers and (Wireless) Device Groups.
- #9543 - Renamed the Virtualization "Interfaces" nav menu item to "VM Interfaces".
- #9547 - Changed exported
match_fieldsmetadata to name the object's own fields rather than lookups into related objects, for examplematch_fields=manufacturer modelfor device types rather thanmatch_fields=manufacturer__name model. - #9547 - Changed CSV import, including via the REST API, to treat a related object whose every column reads
NoObjectas null, so that updating an object from such a row clears the relation rather than leaving it unchanged. - #9547 - Changed the
Import Objectssystem Job to update, rather than fail on, records that match an existing object, including when no match fields are given. The Job now also returns the counts of created, updated and unchanged objects, and the match fields it used. - #9562 - Renamed the REST API OpenAPI schema component for the Rack
outer_unitchoices fromOuterUnitEnumtoRackDimensionUnitChoices, as the same choices now also apply to the Device Typedepth_unitfield. - #9571 - Changed the "Import from file" action on object list views to open the
Import ObjectsJob in a dialog. - #9571 - Changed the "Import from file" action to be disabled for users who cannot run the
Import ObjectsJob, or when that Job is disabled. - #9571 - Changed the
job_import_buttontemplate tag to require the template context. - #9576 - Changed the default placeholder for dropdown menus from
---------to a single em-dash. - #9587 - Changed the "Fields to Export" picker so that checking a related object selects the fields that identify it, then all of its fields, then none; added a "Natural key" option where those fields are not all listed, and an "All custom fields" option.
- #9601 - Changed webhooks and job hooks to allow more than one hook with the same content type, the same target (payload URL or Job) and a common action. Previously the second such hook was refused with "A webhook already exists" or "A job hook already exists".
- #9621 - Changed the styling of expandable table rows.
- #9670 - Added a filter box to the Swagger UI REST API documentation page for filtering endpoints by path.
- #9704 - Changed object list views and the Import Objects Job form to offer importing to users with either of
addorchangepermission. - #9710 - Changed the API Tokens view to partially obscure displayed token keys.
- #9740 - Changed the "Import Objects" and "Export Object List" system Jobs to only accept content-types for Nautobot core and App models (
BaseModelsubclasses), plusauth.Groupand (for export only)contenttypes.ContentType, rather than any installed model such as those provided bydjango-celery-beatordjango-constance. - #9740 - Changed object list views to omit the "Import" or "Export" button for models that do not support import or export respectively.
- #9754 - Changed the export of IP Addresses and IP Address Ranges to leave out their parent Prefix unless it is explicitly selected, as it is determined by their Namespace and address, so that an exported file can still be imported after the parent Prefix changes.
- #9754 - Changed
assertInstanceEqual()to compare a model instance returned by a non-field attribute, such as a property, by its primary key, as it already compares foreign key fields. - #9761 - Improved the hover and focus appearance of tag links.
Deprecated in v3.3.0a1
- #4138 - Deprecated the
VirtualDeviceContext.validate_primary_ips()method; primary IP validation is performed byVirtualDeviceContext.clean(). - #9754 - Deprecated the
_namespaceproperty of the IP Address and IP Address Range models in favor of the newnamespaceproperty.
Removed in v3.3.0a1
- #9576 - Removed default
placeholdertext identical to the form-fieldlabelfrom most forms. Form fields with explicitly specifiedplaceholdervalues are unaffected. - #9601 - Removed the
Webhook.check_for_conflicts()andJobHook.check_for_conflicts()class methods. - #9671 - Removed
SeleniumTestCase.assertNoAccessibilityViolations(). Playwright tests callnautobot.playwright.accessibility.assert_no_accessibility_violations()instead.
Fixed in v3.3.0a1
- #4138 - Fixed an exception when removing an IP address from an interface on a module that is not installed in a Device.
- #4138 - Fixed a Virtual Device Context's primary IP not being cleared when the IP address is removed from the Virtual Device Context's interfaces.
- #4138 - Fixed the IP Address merge tool clearing, rather than updating, the primary IP of Virtual Device Contexts using one of the merged IP addresses.
- #9111 - Fixed duplication of form fields when a NautobotUIViewSet-based embedded "create" modal failed form validation.
- #9111 - Fixed an exception being raised when viewing the detail view of an IPAddress with a null
parent. - #9416 - Fixed CSV export of many-to-many fields whose values contain a comma, double-quote, or newline; such values are now quoted so they can be imported correctly.
- #9416 - Fixed CSV import of a many-to-many column exported for related objects that are identified by more than one field, such as a Device's software image files.
- #9448 - Fixed representation of nested UUIDs in object-list exports from MySQL.
- #9462 - Fixed the
ExportObjectListsystem Job discarding a saved view's stored filters when the query string carried only non-filter parameters, such assortorpage, exporting every object instead of the view's own. Saved-view filters are now resolved exactly asObjectListViewresolves them. - #9462 - Fixed the
ExportObjectListsystem Job treating a list view's own query parameters as filters, such asexpanded_subtreeon the Prefix and Device list views. An export launched from such a view discarded the saved view's filters; the Job now takes the set of non-filter parameters from the launching view. - #9462 - Fixed the
ExportObjectListsystem Job failing to export a content type that has no filterset, or whose model is a plain Django model rather than a Nautobot one -auth | groupandcontenttypes | content typeare both. Object permissions continue to be applied to these exports, and filters that cannot be applied for want of a filterset now fail the Job with an explanatory message rather than being silently ignored. - #9462 - Fixed the
ExportObjectListsystem Job raising an unhandled exception, rather than reporting a clear error, when asked to export a content type whose model no longer exists. - #9469 - Fixed a slow memory leak in change logging, where the captured pre-change state of an object was retained for the lifetime of the worker process instead of the request that captured it.
- #9514 - Fixed the "New window" option on custom links having no effect.
- #9524 - Fixed Job
BooleanVarvariables declared withdefault=True(such asImportObjects.roll_back_if_error) being received asFalsewhen omitted from a REST API job-run request. - #9524 - Fixed the
Import Objectssystem Job being unable to import models whose serializer takes the owning user from the request, such as Tokens and Saved Views; the Job now deserializes under a request carrying the user who ran it. - #9524 - Fixed the export field picker's "Match the list view" button appearing to do nothing for a content type that has no list view, such as
users | token; it now says so rather than returning an empty selection. - #9547 - Fixed the
Import Objectssystem Job failing, before importing anything, for object types whose manager doesn't support object permissions, such as users. - #9554 - Fixed spurious change-log entries being recorded when clearing a many-to-many field (such as an interface's tagged VLANs or a VRF's assigned devices) that was already empty.
- #9576 - Fixed incorrect widget for the
typefield when creating/editing Prefixes. - #9587 - Fixed an export field selection naming a related object reached through another one, such as
device_type__manufacturer, exporting that object's ID instead of the fields that identify it. - #9588 - Fixed the
ExportObjectListsystem Job running out of memory when exporting large numbers of records. - #9642 - Fixed webhooks and job hooks accepting a condition on a field path that cannot be referenced in a condition for their content types, such as
location.parent.nameor a deleted custom field or unknown field. - #9670 - Fixed the Redoc REST API documentation page loading the Redocly logo from an external CDN; the logo is now bundled with Nautobot's static files.
- #9746 - Fixed navbar favorites accepting external links and malformed data.
- #9754 - Fixed the REST API ignoring a
namespacegiven when updating an existing IP Address or IP Address Range. The object is now moved into that Namespace and its parent Prefix is resolved again within it, as the edit form already does. - #9761 - Fixed tag links, and the header's search help link, being too small to satisfy the WCAG 2.2 pointer target minimum.
- #9763 - Fixed exported Job console log timestamps not being rendered in the requesting user's configured timezone.
Dependencies in v3.3.0a1
- #9315 - Updated dependency
prometheus-clientto>=0.26.0,<0.27. - #9518 - Updated dependency
django-silkto>=5.6.0,<5.7. - #9518 - Updated dependency
emojito>=2.16.0,<2.17. - #9518 - Updated dependency
mysqlclientto>=2.3.0,<2.4. - #9611 - Updated dependency
Markdownto>=3.11.2,<3.12. - #9611 - Updated optional dependency
django-auth-ldapto>=5.4.0,<5.5. - #9611 - Updated dependency
django-constanceto>=4.5.0,<4.6. - #9611 - Updated dependency
django-filterto>=26.2,<26.3. - #9611 - Updated dependency
django-tree-queriesto>=0.28.0,<0.29. - #9612 - Updated dependency
django-structlogto>=11.0,<11.1. - #9612 - Updated dependency
kubernetesto>=37.0.1,<38. - #9612 - Updated dependency
python-slugifyto>=9.1.3,<9.2. - #9670 - Replaced dependency
drf-spectacular-sidecarwith theswagger-ui-distandredocNPM packages, bundled into Nautobot's static files, for the Swagger UI and Redoc REST API documentation pages. Static files underdrf_spectacular_sidecar/are no longer available to apps or custom templates. - #9670 - Updated Swagger UI to version 5.34.0.
Documentation in v3.3.0a1
- #9416 - Added initial documentation for CSV/JSON/YAML import/export functionality as enhanced in v3.3.
- #9428 - Added documentation for the
humanize_durationtemplate filter. - #9448 - Added documentation for the
export_fieldsparameter when exporting records to JSON, YAML, or CSV. - #9455 - Added Conditions documentation.
- #9521 - Added documentation of conditions to the Webhooks and Job Hooks pages.
- #9521 - Documented what happens when a condition cannot be checked, in Conditions.
- #9576 - Added notes about form-field
placeholdervalues and the use of Select2 widgets to the core developer documentation. - #9587 - Documented what an export contains when no fields are selected.
- #9603 - Improved the conditions guide and removed the note about the dry run, which is not available yet.
- #9638 - Added documentation for rate limiting.
- #9638 - Added documentation for request performance measurements.
Housekeeping in v3.3.0a1
- #9111 - Refactored IPAddress model related UI views to use
NautobotUIViewSet. - #9315 - Updated development dependency
django-debug-toolbarto~7.1.1. - #9315 - Updated development dependency
time-machineto~3.4.0. - #9409 - Moved the existing Selenium integration tests from
nautobot/<app>/tests/integration/tonautobot/<app>/tests/selenium/. - #9457 - Fixed support for running parallel tests under Python 3.14.
- #9457 - Changed the default development environment Python version from 3.13 to 3.14.
- #9457 - Updated CI to use Python 3.14 for tests where applicable.
- #9462 - Consolidated the duplicated
non_filter_paramsdeclarations andget_filter_params()implementations inObjectListView,ObjectListViewMixinand theExportObjectListsystem Job intonautobot.core.utils.requests.NON_FILTER_PARAMSandresolve_filter_params(). - #9469 - Added
change_has_consumers(), which answers whether any enabled webhook, job hook, or event broker would act on a given content type and action, so that work done only for those consumers can be skipped. - #9470 - Fixed omission of
pytestandplaywrightPython packages from the Dockerdevimage. - #9479 - Moved Playwright login out of the auth fixture and into a helper with documentation for using it in a script.
- #9511 - Changed Playwright browser contexts to send the
X-Disable-Debug-Toolbarheader, and the development configuration to keep Django-debug-toolbar off pages that carry it or whenNAUTOBOT_SHOW_DJDT_TOOLBARis set to a falsy value. - #9518 - Updated development dependency
fakerto^40.40.0. - #9518 - Updated development dependency
django-test-migrationsto~1.7.0. - #9519 - Updated development dependency
django-debug-toolbarto~8.0.0. - #9519 - Updated development dependency
towncrierto~26.9.0and simplified its configuration inpyproject.toml. - #9520 - Replaced the Device detail Selenium tests with Playwright tests and added a shared
DetailPagepage object for detail views. - #9529 - Added a Playwright
AuthenticationEnforcedTestCaseand moved the Django test-client view-authentication sweep intotest_views.pyas a unit test. - #9542 - Ported the radio profile bulk edit Selenium test to Playwright.
- #9547 - Added support for
invoke tests --no-colorparameter. - #9557 - Replaced the Selenium computed-field tests with a Playwright
ComputedFieldsTestCase, added tab helpers to the sharedDetailPage, table-configuration helpers to the sharedListPage, and a sharedcreated_devicefixture. - #9562 - Fixed a nondeterministic ordering in the Object Metadata
assigned_object_typefilter test. - #9564 - Ported the Notes create and update tests from Selenium to Playwright and added
BasePage.expect_flash_message. - #9605 - Replaced the Dynamic Group create and edit Selenium test with Playwright tests that verify the group's member count after refreshing its members.
- #9605 - Ported the Selenium test for "Update Group Assignment for All" on a filtered device list to Playwright.
- #9605 - Added a Celery worker to the Playwright CI job so that tests can run jobs started from the UI, such as Refresh Members.
- #9611 - Updated development dependency
coverageto~7.17.0. - #9611 - Updated development dependency
djlintto~1.47.1. - #9611 - Updated development dependency
mkdocs-materialto~9.8.0. - #9611 - Updated development dependency
playwrightto~1.64.1. - #9611 - Updated development dependency
pylintto~4.1.3. - #9611 - Updated development dependency
pytestto~9.2.0. - #9611 - Updated development dependency
pytest-playwrightto~0.10.0. - #9611 - Updated development dependency
ruffto~0.17.3. - #9611 - Updated development dependency
time-machineto~3.6.0. - #9612 - Updated development dependency
watchdogto~7.0.0. - #9615 - Ported the Device create test from Selenium to Playwright.
- #9620 - Added a Playwright test asserting the Power Utilization panel is not rendered on a device without power components.
- #9630 - Added Playwright tests for the conditions editor on the webhook form.
- #9647 - Changed the
playwrightdependency group back to optional, so that a plainpoetry installworks on platforms that Playwright does not publish a wheel for, such as Alpine. - #9651 - Set the toast autohide delay to 5 seconds.
- #9671 - Replaced the Selenium accessibility tests with their Playwright equivalents, and made the
playwright-testjob a precondition of theall-tests-passedCI check. - #9774 - Updated CI tests to run with
--no-colorflag.