Commit Graph

15573 Commits

Author SHA1 Message Date
Jason Novinger d38ace89ce
Fixes #22889: Render Config Revision banner fields in monospace (#22907)
Replace the obsolete Django admin `vLargeTextField` class with Tabler's
`font-monospace` utility for the four banner configuration parameters.

Define the widget styling in the parameter definitions, where the metaclass
constructs the form fields, and remove the ineffective `Meta.widgets`
overrides. Add regression coverage for all six code-oriented configuration
fields, including the two JSON fields that already use a monospace font.

Update the add-config-param skill to recommend `font-monospace` so future
textarea-backed parameters do not reintroduce the obsolete admin class.
2026-08-18 15:30:45 +02:00
Jeremy Stretch 93f16a536d
Fixes #22923: Fix post-exception cleanup under event_tracking() (#22926) 2026-08-13 19:56:23 +02:00
Martin Hauser 752dc33ba6 ci(release): Pin metadata tooling to match publishing action
Pin `twine` and `packaging` versions in build job to match bundled
versions in `gh-action-pypi-publish` v1.14.2.
Enforce Core Metadata 2.4 in wheel and sdist targets with verification
in validation scripts.

Fixes #22903
2026-08-13 13:54:09 -04:00
github-actions 0171c0ce5a Update source translation strings 2026-08-13 05:30:28 +00:00
Sri Chandraja Reddy Allala e9405d8f47
Fixes #22683: Prevent server errors when bulk import validation references an omitted field (#22784)
During partial bulk updates, fields omitted from the CSV are removed
from the import form before validation. Model validation can still
return an error for one of these fields, causing Django to raise a
ValueError instead of displaying the validation error.

Remap errors for absent fields to prefixed non-field errors on
NetBoxModelImportForm while preserving their codes, parameters, lazy
pluralization, and literal percent values. Genuine non-field errors
remain unchanged.

Add form-level and view-level regression coverage for mixed and
parameterized errors and for the reported interface bulk-update
workflow, including verification that invalid updates leave the object
unchanged.
2026-08-12 23:22:52 +02:00
github-actions f903cbf41d Update source translation strings 2026-08-12 05:29:58 +00:00
bctiemann a08d9f13fc
Merge pull request #22867 from netbox-community/22812-script-delete-memory-exhaustion
Closes #22812: Avoid loading all jobs into memory when deleting a JobsMixin object
2026-08-11 19:17:15 -04:00
Jeremy Stretch 3db98de783 Release v4.6.8 2026-08-11 09:37:13 -04:00
Jeremy Stretch 257c322e48 Revert "Fixes #22854: Set USE_SHADOW_DOM=False to fix GraphiQL queries w/debug enabled"
This reverts commit 30d2c9b537.
2026-08-11 09:37:13 -04:00
Arthur Hanson a94878aa08
22745 - Enforce object permissions on Script REST API write operations (#22777) 2026-08-11 08:09:13 -04:00
github-actions a7cf21a068 Update source translation strings 2026-08-11 05:23:07 +00:00
bctiemann ae8fa4c074
Merge pull request #22870 from netbox-community/22852-scripts-run-from-event-rules-ignore-notifications_default
Fixes #22852: Honor Custom Script execution defaults for Event Rules and `runscript`
2026-08-10 14:02:25 -04:00
Jeremy Stretch a4dcd82606
Fixes #22894: Sanitize error message rendered during exception in CustomLinkColumn (#22895) 2026-08-10 19:47:36 +02:00
Graham fca786bdf2
Closes #22502: Add direct unit tests for is_api_request() and is_graphql_request() (#22880) 2026-08-10 09:56:44 -05:00
Jeremy Stretch d76340f55e
Fixes #22882: Fix support for DISTINCT on nested GraphQL lists (#22892) 2026-08-10 09:52:01 -05:00
Jason Novinger f355a3de05 Fixes #22812: Address review — DB alias, batch size, MRO note
- batch_delete_jobs now writes through the same DB alias it reads from. In JobsMixin.delete
  the read queryset is bound to the instance's DB while Job.objects would use the router
  default; if those diverged on a multi-DB setup the deleted rows never left the read side
  and the batch loop never terminated.
- JobsMixin.delete and ScriptModule.delete honor a caller-supplied `using`, matching
  DeleteMixin.delete, instead of always recomputing it.
- Raise JOB_DELETE_BATCH_SIZE from 100 to 1000 and correct its rationale. With only('pk')
  the per-batch payload is gone, so the size now bounds per-cycle work rather than memory;
  1000 matches EXPORT_CHUNK_SIZE and was the fastest of 100/1000/5000 when benchmarked
  against a 200k-job deletion.
- Document that JobsMixin must precede DeleteMixin in the MRO or the batching is bypassed,
  and scope the ScriptModule.delete comment so it doesn't imply the on-disk file removal is
  transactional.
- Add a module-path rollback test alongside the existing script-path one.
2026-08-10 09:39:43 -05:00
Martin Hauser 53efbe0a00
Fixes #22805: Prevent repeated execution of LDAP configuration (#22809) 2026-08-10 09:04:16 -05:00
Martin Hauser 4660fbb0ab fix(ui): Improve dark mode form control contrast
Fixes form check input border contrast in dark mode by using solid grey
instead of translucent border. Updates checked checkbox glyph color to
rich black for better visibility against teal primary background.

Fixes #22879
2026-08-07 15:21:29 -04:00
Sri Chandraja Reddy Allala f7768e95dd
Fixes #22694: Clear stale Rack assignment when changing a Device's Site (#22764)
Prevent out-of-order dynamic select responses from restoring options for an
earlier dependency state.

Track the latest load request, preserve valid selections across superseding
loads, and properly finalize stale requests and their loading state. Clear any
pending restored value when a request cannot be made or fails.
2026-08-07 13:40:57 +02:00
github-actions a6451297a2 Update source translation strings 2026-08-07 05:30:32 +00:00
Martin Hauser d61528e464
Fixes #22821: Prevent Tenant Group deletion from creating duplicate ungrouped Tenant names or slugs (#22830) 2026-08-06 15:08:41 -05:00
Jeremy Stretch 80231a9706
Closes #22835: Improve performance when provisioning new custom fields (#22866) 2026-08-06 14:56:22 -05:00
Jeremy Stretch b1ee8297d2 Closes #22877: Improve caching logic when retrieving custom fields via get_for_model() 2026-08-06 13:28:18 -04:00
github-actions e160359e6e Update source translation strings 2026-08-06 05:57:19 +00:00
bctiemann 1f5a30dcd2
Merge pull request #22859 from netbox-community/22825-circuit-term-fielddoesnotexist
Fixes #22825: Handle CircuitTermination origins in cable path tracing
2026-08-05 16:10:54 -04:00
Jason Novinger 6bd50ef07d Fixes #22812: Note ConfirmCollector is intentionally Job-specific 2026-08-05 14:27:22 -05:00
Jason Novinger 7d46c995f7 Fixes #22812: Defer large Job payload fields during batched deletion
The batched job delete can't fast-delete (a global pre_delete receiver forces
per-instance signals), so each batch still instantiates its Job rows. Load only the PK
via only('pk') so those instances don't pull the large data/log_entries payloads,
cutting the resident set per batch. Also drop a dead `no-toggle` CSS class from the
delete-confirmation template (it is defined nowhere and, under Tabler, has no effect)
and use JobStatusChoices.STATUS_COMPLETED in the tests instead of a string literal.
2026-08-05 14:04:19 -05:00
Jason Novinger be69c55a99 Fixes #22812: Don't show a spurious "0 jobs" row for jobless objects
Django's Collector calls into the jobs GenericRelation branch unconditionally, so
ConfirmCollector recorded a zero count for objects with no jobs. _get_dependent_objects
then added a CountOnly(0), and the delete-confirmation page rendered "The following
objects will be deleted as a result of this action." plus a "0 jobs" row for every
jobless JobsMixin object. Only record a count when there are actually jobs.
2026-08-05 13:59:02 -05:00
Jason Novinger f2923f4ce4 Fixes #22812: Batch child-script job deletion when deleting a ScriptModule
Deleting a Script via the UI is only possible by deleting its parent ScriptModule
(no Script delete view exists). That cascades to the child Script rows, and the
collector materialized every one of those Scripts' jobs — the memory blowup, which
scales with jobs-per-script. JobsMixin.delete() only batched the deleted object's own
jobs, and a ScriptModule has none; the jobs live on its child Scripts.

Extract the chunked job-deletion loop from JobsMixin.delete() into a shared
batch_delete_jobs() helper, and add a ScriptModule.delete() override that batch-deletes
its child Scripts' jobs (in a single queryset keyed on the script PKs, no per-script
loop) before delegating to the cascade. This bounds peak memory to one batch regardless
of how many jobs the module's scripts hold.
2026-08-05 13:56:01 -05:00
Martin Hauser 75ceb55754
fix(extras): Honor Script defaults when triggered by Event Rules
Scripts triggered by Event Rules now respect notifications_default and
job_timeout from script Meta class. Updates documentation to clarify
this behavior and adds regression test coverage.

Fixes #22852
2026-08-05 18:01:38 +02:00
github-actions 280e32fcc9 Update source translation strings 2026-08-05 05:54:34 +00:00
Jason Novinger 0701a42a94 Fixes #22812: Avoid loading all jobs into memory when deleting a JobsMixin object
Deleting a Script (or any JobsMixin object) with thousands of associated jobs could
consume several GB of memory and exhaust the host, because Django's deletion collector
loads every related Job into memory. Jobs can never be fast-deleted (a global pre_delete
receiver forces per-instance signal dispatch), and each Job carries potentially large
data and log_entries payloads.

Two paths loaded the full job set independently, so both are addressed:

- The delete cascade: JobsMixin.delete() now deletes the object's jobs in batches before
  delegating to super().delete(), wrapped in a transaction so a failure in the parent
  delete rolls the job deletions back. After the loop the cascade collector finds no jobs
  to materialize.

- The delete-confirmation page: _get_dependent_objects() uses a ConfirmCollector that
  counts the jobs relation rather than descending into it, so the page never instantiates
  the jobs. Counted relations render as a non-expandable row (via a CountOnly stand-in)
  alongside the itemized dependents.
2026-08-04 16:39:35 -05:00
Elliott Balsley 3d3bebcb78
Closes #22787: Improve GraphQL query efficiency when resolving assigned objects (#22792) 2026-08-04 15:28:20 -04:00
bctiemann 8b203e55a8
Merge pull request #22850 from netbox-community/22844-CustomFieldChoiceSetSerializer-base_choices
Fixes #22844: Allow null value for CustomFieldChoiceSet `base_choices` in REST API
2026-08-04 13:54:25 -04:00
Jeremy Stretch 852f73b081 Release v4.6.8-rc2 2026-08-04 13:24:01 -04:00
Jason Satein c36e72876f
Closes #22567: Warn that a custom script file name must not shadow an installed Python module (#22804) 2026-08-04 08:36:11 -07:00
github-actions bb29246033 Update source translation strings 2026-08-04 05:56:44 +00:00
Jason Novinger a158ed3794 Fixes #22825: Handle CircuitTermination origins in cable path tracing
CablePath.save() and delete() wrote the _path back-reference onto the path's
origin object, and PathTraceView built the trace SVG URL from the origin's REST
API action. Both assume the origin is a PathEndpoint, but a CircuitTermination
is a valid cable-path origin (per from_origin) without the _path field or a
-trace API action, so those paths raised FieldDoesNotExist and NoReverseMatch
respectively. Guard the _path writes and the SVG URL on PathEndpoint membership,
and skip the SVG block in the template when no URL is available.
2026-08-03 16:10:32 -05:00
Jeremy Stretch be72e841f5 Closes #22837: Omit implicit pagination on GraphQL to-one prefetches 2026-08-03 14:57:42 -04:00
Jeremy Stretch 4afdb31b89
Fixes #22848: Ensure deterministic ordering for duplicate IP addresses (#22849) 2026-08-03 11:58:24 -05:00
Jeremy Stretch 6047ce1a37
Fixes #22854: Set `USE_SHADOW_DOM=False` to fix GraphiQL queries w/debug enabled (#22855) 2026-08-03 11:13:40 -05:00
bctiemann 071c78d172
Closes #22828: Validate Webhook.payload_url as a URL or Jinja2 template (#22832) 2026-08-03 10:46:24 -05:00
Jeremy Stretch 492cb83cc3 Fixes #22844: Allow null value for CustomFieldChoiceSet base_choices in REST API 2026-08-03 09:00:07 -04:00
Jeremy Stretch 4877d1167f Correct release date for v4.6.7 2026-07-31 16:48:04 -04:00
github-actions 42cb0326fb Update source translation strings 2026-07-31 06:00:45 +00:00
Jeremy Stretch a1fc744556 Release v4.6.7 2026-07-30 16:36:25 -04:00
Jason Novinger 1f3aac25db
Closes #22810: Skip cached scope rebuild when scope fields are unchanged (#22811) 2026-07-30 15:22:11 -05:00
Jeremy Stretch aefe938c63 Closes #22823: Avoid extraneous DB queries when fetching IP/prefix family via GraphQL API 2026-07-30 13:38:47 -04:00
bctiemann b5c6619108
Merge pull request #22806 from netbox-community/22800-circuitgroupassignmentspanel-not-filtered-by-circuit-type
Fixes #22800: Fix filtering of Circuit Group Assignments by member type
2026-07-30 13:03:53 -04:00
bctiemann 6f9c6080e5
Merge pull request #22827 from netbox-community/22822-graphql-rack-units
Closes #22822: Avoid extra DB query when fetching rack reservation units via GraphQL API
2026-07-30 12:25:44 -04:00