Tests cover: retry on deadlock, retry on lock timeout, single-retry
limit, non-retriable errors pass through, fresh request ID on retry,
and OperationalError without a psycopg cause.
When a request fails due to a PostgreSQL deadlock (40P01) or lock
timeout (55P03), CoreMiddleware now catches the OperationalError,
closes the database connection, and re-dispatches the request with
a fresh request ID and clean event tracking state.
This addresses cascading failures caused by concurrent API write
operations (e.g. automated device reconciliation at high throughput)
where deadlocked requests return 500 errors and aggressive client
retries worsen contention.
Restrict the CI workflow's push trigger to the main and feature branches
while preserving the existing paths-ignore filters.
This avoids unnecessary push-triggered CI runs on topic branches without
changing pull request workflow behavior.
Fixes#19324
Ensure CoreMiddleware emits Django's got_request_exception signal before
returning handled 500 responses for API requests and custom error templates.
This allows integrations such as Sentry to report exceptions that would
otherwise be hidden when middleware returns a custom error response.
Add `nested` and `max_depth` params to GenericForeignKeyAttr to render
hierarchical objects as breadcrumbs when they expose `get_ancestors()`.
Applied to scope fields in IPAM/wireless and circuit termination points.
Fixes#21938
Add changelog message support to BulkRenameView for models that support
change logging. Introduce NetBoxModelBulkRenameForm as a changelog-aware
wrapper around the existing utilities.forms.BulkRenameForm, preserving the
existing import path while avoiding circular imports.
Set _changelog_message before saving renamed objects in both MPTT and
non-MPTT rename paths, and add a regression test to verify that the
submitted message is recorded on the resulting ObjectChange records.
Remove unused VMInterfaceBulkRenameForm and VirtualDiskBulkRenameForm,
along with their unused view references, since BulkRenameView constructs
its form dynamically.
Display a warning in the UI whenever a user goes to provision a v1
token (both via the admin token form and the user profile token form).
Update documentation to note that v1 tokens are deprecated and will be
removed in NetBox v5.0.
Configure coverage.py for multiprocessing so Django's parallel test
workers are included in the coverage data.
Move coverage source and report settings into pyproject.toml,
and combine per-process coverage data before generating the report.
Fixes#22118
Add explicit CI job names showing the Python and Node versions, with the
coverage job clearly marked in the GitHub Actions UI.
Run coverage only for the designated coverage matrix entry to avoid
redundant coverage collection and reporting across the full test matrix.
Also add the YAML document marker and clean up trailing whitespace.
Move Ruff configuration from ruff.toml into pyproject.toml and remove
obsolete Black, isort, and Pylint sections.
Consolidates all Python tooling config in a single file following
modern Python packaging standards.
Fixes#22099
Use DRF's ChoiceField for `cable_end` to preserve the existing raw
"A"/"B" API output while documenting the allowed values and nullability
in the generated schema.
Fixes#22084
* #22034 fix rack group migation from very old netbox installation
* #22034 fix rack group migation from very old netbox installation
* #22034 fix rack group migation from very old netbox installation
* fix after loading old database
* simplify
* fix index name
Update AddObject.get_url() to skip parameters that resolve to None,
preventing invalid query strings.
Adjust VLAN-to-Prefix action to use scope_type/scope instead of site
field.
Fixes#22031
Update InterfaceFilterSet to check both is_active and is_complete when
filtering by connected=true. Incomplete pass-through paths (e.g. cabled
front ports without rear port connections) are now correctly excluded.
Fixes regression where active but incomplete cable paths were incorrectly
returned as connected.
Fixes#22005