Commit Graph

15264 Commits

Author SHA1 Message Date
Jamie (Bear) Murphy 87b17ff26d
Fixes #21711: Added support for filtering and viewing modules by their module type profile (#21900) 2026-04-17 10:34:50 -07:00
Martin Hauser 93fdcaf34e perf(dcim): Batch peer termination lookups in Cable Path Tracing
Add `get_peer_terminations()` to resolve multiple cable terminations in
a single query, reducing N+1 queries during path tracing. Update path
resolution to use batched lookup and deduplicate peers by identity.

Fixes #21688
2026-04-17 10:03:09 -04:00
Martin Hauser 0d1e9d88a8 fix(dcim): Add comments field to MAC Address form
Include the comments field in MACAddressForm field list to allow editing
MAC Address comments via the UI form.

Fixes #21947
2026-04-17 09:37:56 -04:00
github-actions 3eb89531ad Update source translation strings 2026-04-17 05:42:14 +00:00
Jeremy Stretch b2af01c400
Update performance issue template (#21946)
* Update performance issue template

* Update .github/ISSUE_TEMPLATE/03-performance.yaml

Co-authored-by: Martin Hauser <mhauser@netboxlabs.com>
2026-04-16 23:13:16 +02:00
Martin Hauser 850d4dd1ad fix(ui): Suppress unauthorized embedded object tables
Add a `should_render()` hook to the `Panel` base class and override it
in `ObjectsTablePanel` to check the requesting user's view permission
for the panel's model. This prevents object detail pages from issuing
HTMX requests for related tables (e.g. locations, devices, image
attachments) that return 403 and disrupt the page.

Fixes #21893

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2026-04-16 16:48:15 -04:00
Arthur Hanson a6cc0b671e
#21361 Expand unit tests for ObjectChange and testing asserts (#21905)
* #21361 Expand unit tests for ObjectChange and testing asserts

* cleanup

* review feedback

* review feedback

* cleanup

* cleanup

* cleanup

* cleanup
2026-04-16 16:42:57 -04:00
Jeremy Stretch 4fb9410aa9
Misc updates to the contributing guide (#21944)
* Misc updates to the contributing guide

* Update CONTRIBUTING.md

Co-authored-by: Martin Hauser <mhauser@netboxlabs.com>

---------

Co-authored-by: Martin Hauser <mhauser@netboxlabs.com>
2026-04-16 16:35:33 -04:00
Jeremy Stretch af7a35f836
Closes #21936: Deprecate `LOGIN_REQUIRED` (#21941)
Closes #21936: Deprecate LOGIN_REQUIRED
2026-04-16 14:33:11 -05:00
Arthur 5c1d1d6001 documentation 2026-04-16 11:49:54 -07:00
Arthur bbd2796c17 documentation 2026-04-16 11:29:59 -07:00
Arthur 3a30dc5dbc internationalize strings 2026-04-16 11:02:42 -07:00
Arthur 86e29cd3f6 cleanup 2026-04-16 09:27:15 -07:00
Arthur a2845d190e cleanup 2026-04-16 09:20:47 -07:00
Arthur 7f14434162 cleanup 2026-04-16 09:10:45 -07:00
github-actions 885be7106a Update source translation strings 2026-04-16 05:43:12 +00:00
Arthur ba9d060803 Merge branch 'main' into 21782-config 2026-04-15 16:33:56 -07:00
Jeremy Stretch 1af320e0a9
Fixes #21538: Fix annotated count for contacts assigned to multiple contact groups (#21919) 2026-04-15 16:01:19 -05:00
Martin Hauser c28736e1d6
Fixes #21913: Restore plugin template extension support on declarative-layout detail views (#21928) 2026-04-15 14:29:17 -05:00
Jeremy Stretch f0fc93d827
Fixes #21683: Fix support for importing port mappings on device/module types (#21921) 2026-04-15 19:45:26 +02:00
Jeremy Stretch bf9de4721e
Closes #20881: `get_filterset_for_model()` should reference application registry (#21922) 2026-04-15 19:36:33 +02:00
Jeremy Stretch bce667300a
Fixes #21737: Check that uploaded custom scripts are valid Python modules before saving (#21920) 2026-04-15 10:16:58 -07:00
Sergio López 660ca42149 Closes #21875: Allow subclasses of dict for API_TOKEN_PEPPERS 2026-04-14 16:59:49 -04:00
Jeremy Stretch 539448683c
Release v4.6.0-beta1 (#21910)
* Draft v4.6 release notes

* Revert django-tables2 upgrade

* Correct release notes

* Release v4.6.0-beta1

* Fix typo
2026-04-14 10:09:06 -04:00
Jeremy Stretch e208a28137 Merge branch 'main' into feature 2026-04-14 08:48:22 -04:00
Jeremy Stretch 75e1b86613
Release v4.5.8 (#21903)
* Release v4.5.8
* Limit django-tables2 to <v2.9
2026-04-14 08:39:16 -04:00
github-actions e12334c01b Update source translation strings 2026-04-14 05:39:35 +00:00
Arthur 2fde9db66e #21782 - Enable optional config template selection on Device 2026-04-13 15:41:42 -07:00
Arthur 46396d7667 #21782 - Enable optional config template selection on Device 2026-04-13 15:41:34 -07:00
Jeremy Stretch ea6552b239 Revert "Closes #21902: Upgrade django-tables2 to v3.0"
This reverts commit d57346d9f0.
2026-04-13 16:37:35 -04:00
bctiemann 36afe5541f
Merge pull request #21904 from netbox-community/21902-upgrade-django-tables2
Closes #21902: Upgrade django-tables2 to v3.0
2026-04-13 16:23:01 -04:00
Jeremy Stretch d57346d9f0 Closes #21902: Upgrade django-tables2 to v3.0 2026-04-13 14:17:05 -04:00
Jeremy Stretch 5aeb045fb5
Closes #21783: Fix support for bulk import of cables connected to power feeds (#21873) 2026-04-13 12:03:46 -05:00
Martin Hauser 6c12d8b402
Fixes #21869: Remove redundant ScriptModule class synchronization on save (#21899) 2026-04-13 10:53:00 -05:00
Jeremy Stretch 58275977bb
Closes #21890: Deprecate the `models` registry key (#21892)
* Closes #21890: Deprecate the 'models' registry key

* Add deprecation note for 'models' key to development docs
2026-04-13 09:24:30 -04:00
Jeremy Stretch 5054566abb Fix migration indexes 2026-04-13 09:04:06 -04:00
Jason Novinger 28a11f6aad
Fixes #21357: Add support for registering custom model actions (#21560)
* Add ModelAction and register_model_actions() API for custom permission actions

* Add ObjectTypeSplitMultiSelectWidget and RegisteredActionsWidget

* Integrate registered actions into ObjectPermissionForm

* Add JavaScript for registered actions show/hide

* Register custom actions for DataSource, Device, and VirtualMachine

* Add tests for ModelAction and register_model_actions

* Refine registered actions widget UI

- Use verbose labels (App | Model) for action group headers
- Simplify template layout with h5 headers instead of cards
- Consolidate Standard/Custom/Additional Actions into single Actions fieldset

* Hide custom actions field when no applicable models selected

The entire field row is now hidden when no selected object types
have registered custom actions, avoiding an empty "Custom actions"
label.

* Add documentation for custom model actions

- Add plugin development guide for registering custom actions
- Update admin permissions docs to mention custom actions UI
- Add docstrings to ModelAction and register_model_actions

* Add RESERVED_ACTIONS constant and fix dedup in registered actions

- Define RESERVED_ACTIONS in users/constants.py for the four built-in
  permission actions (view, add, change, delete)
- Replace hardcoded action lists in ObjectPermissionForm with the constant
- Fix duplicate action names in clean() when the same action is registered
  across multiple models (e.g. render_config for Device and VirtualMachine)
- Fix template substring matching bug in objectpermission.html detail view
  by passing RESERVED_ACTIONS through view context for proper list membership

* Fix shared action pre-selection and additional actions leakage on edit

* Prevent duplicate action registration in register_model_actions()

* Remove stale comment in RegisteredActionsWidget

* Rebuild frontend assets after rebase onto feature

* Refactor SplitMultiSelectWidget to use class attributes for widget classes

* Reject reserved action names in register_model_actions()

* Show all registered actions with enable/disable instead of show/hide

* Validate action name is not empty and clarify RESERVED_ACTIONS origin

* Adapt custom actions panel for declarative layout system

Convert the ObjectPermission detail view to use the new panel-based
layout from #21568. Add ObjectPermissionCustomActionsPanel that
cross-references assigned object types with the model_actions registry
to display which models each custom action applies to.

Also fix dark-mode visibility of disabled action checkboxes in the
permission form by overriding Bootstrap's disabled opacity.

* Flatten registered actions UI and declare via Meta.permissions

Implement two changes requested in review of #21560:

1. Use Meta.permissions for action declaration
   - Add Meta.permissions to DataSource, Device, and VirtualMachine
   - register_models() auto-registers actions from Meta.permissions
   - Remove explicit register_model_actions() calls from apps.py
   - Add get_action_model_map() utility to utilities/permissions.py

2. Flatten the ObjectPermission form UI
   - Show a single deduplicated list of action checkboxes (one per
     unique action name) instead of grouped-by-model checkboxes
   - RegisteredActionsWidget uses create_option() to inject model_keys
     and help_text; JS enables/disables based on selected object types
   - render_field.html bypasses outer wrapper for registeredactionswidget
     so widget emits rows with identical DOM structure to CRUD checkboxes
   - Unchecking a model now also unchecks unsupported action checkboxes

Fixes #21357

* Address review feedback on registered actions

- Sort model_keys in data-models attribute for deterministic output
- Rename registered_actions field label to 'Registered actions'
- Target object_types selected list via data-object-types-selected
  attribute instead of hardcoded DOM ID
- Reduce setTimeout delay to 0ms since moveOption() is synchronous

* Consolidate ObjectPermission detail view actions panel

Merge ObjectPermissionActionsPanel and ObjectPermissionCustomActionsPanel
into a single Actions panel that shows CRUD booleans and all registered
actions in one table, matching the form's consolidated layout.

Also fix data-object-types-selected attribute value (True -> 'true') and
update plugin docs to show Meta.permissions as the primary registration
approach.

* Address additional bot review feedback

- clean() collects all validation errors before raising instead of stopping at the first
- Fix stale admin docs (still referenced "Custom actions" and "grouped by model")

* Update netbox/netbox/registry.py

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>

* Fix model_actions registry to use set operations

The registry was changed to defaultdict(set) but the registration
code still used list methods. Update .append() to .add() and fix
tests to use set-compatible access patterns.

* Rename permission migrations for clarity

* Move ModelAction validation into __post_init__

* Drop model name from permission descriptions

* Simplify ObjectPermission form and remove custom widgets

Replace the dynamic UI with standard BooleanField checkboxes for each
registered action. No custom widgets, no JavaScript, no template
changes.

- Remove RegisteredActionsWidget, ObjectTypeSplitMultiSelectWidget,
  and registeredActions.ts
- Use dynamic BooleanFields for registered actions (renders identically
  to CRUD checkboxes)
- Move action-resolution logic from panel to ObjectPermission model
- Remove object-type cross-validation from form clean()
- Remove unused get_action_model_map utility

* Remove register_model_actions from public API

Meta.permissions is the documented approach for plugins. The
register_model_actions function is now an internal implementation
detail.

* Sort registered actions and improve test coverage

Sort action names alphabetically for stable display order. Add tests
for cloning, empty registry, and models_csv output.

* Add help_text to registered action checkboxes

* Return model_keys as list from get_registered_actions()

Move string joining to the template so callers get native
list data instead of a pre-formatted CSV string.

* Improve detail view: human-friendly descriptions and additional actions

Return dicts from get_registered_actions() with help_text and verbose
model names. Add get_additional_actions() for manually-entered actions
that aren't CRUD or registered. Show both in the Actions panel.

* Renumber permission migrations after feature merge

Resolve migration conflicts with default_ordering_indexes migrations.
Renumber to 0023 (core), 0232 (dcim), 0056 (virtualization) and
update dependencies.

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
2026-04-13 08:37:09 -04:00
Martin Hauser 9b734bac93 chore(ci): Update GitHub Actions to use commit SHA pinning
Bump actions/create-github-app-token from v1 to v3.1.1 and
EndBug/add-and-commit from v9.1.4 to v10.0.0, both pinned to full commit
SHAs for improved supply chain security.

Fixes #21896
2026-04-13 08:04:55 -04:00
Martin Hauser 0f277894b2 chore(ci): Update ruff-action to v4.0.0
Update ruff GitHub Action from v3.6.1 to v4.0.0 and bump ruff version
from 0.15.2 to 0.15.10 for latest linting improvements.

Fixes #21682
2026-04-13 08:03:58 -04:00
Jeremy Stretch cb5ade07f0
Closes #21887: Deprecate support for legacy view actions (#21889) 2026-04-11 00:55:27 +02:00
Jeremy Stretch 71d918636c Remove cancelled TODO 2026-04-10 17:10:11 -04:00
Jeremy Stretch 82cf60091a Closes #21884: Deprecate the DEFAULT_ACTION_PERMISSIONS constant 2026-04-10 17:08:35 -04:00
Jeremy Stretch 133ed53849
Closes #21881: Deprecate legacy Sentry configuration parameters (#21882) 2026-04-10 15:35:58 -05:00
Martin Hauser ab94e3d40e feat(api): Include NAT IP fields in primary IP serializers
Add nat_inside and nat_outside fields to primary_ip, primary_ip4,
primary_ip6, and oob_ip on Device and VirtualMachine serializers.
Update prefetch logic to honor field-level constraints on nested
serializers and add test coverage for NAT field inclusion.

Fixes #19138
2026-04-10 15:07:53 -04:00
Jeremy Stretch 315fcdffb6 Merge branch 'main' into feature 2026-04-10 14:58:07 -04:00
github-actions 4ca688de57 Update source translation strings 2026-04-10 05:40:14 +00:00
bctiemann ed7ebd9d98
Merge pull request #21863 from netbox-community/21801-duplicate-filename-allowed-when-upload-files-using-s3
Fixes #21801: Ensure unique Image Attachment filenames when using S3 storage
2026-04-09 13:47:54 -04:00
Jeremy Stretch 7462e45c8e
Closes #21865: Display debug toolbar if `INTERNAL_IPS` is empty (#21871) 2026-04-09 19:19:25 +02:00
Martin Hauser 48037f6fed
fix(extras): Reject unknown custom fields (#21861)
Add validation to reject unknown custom field names during API updates.
Ensure model.clean() normalization is preserved in serializers to remove
stale custom field data from both the database and change logs.
Filter stale keys during serialization to prevent lingering references.

Fixes #21529
2026-04-09 08:49:27 -07:00
Ibtissam El alami 0bc05f27f9
Fixes #21704: Add port mappings to DeviceType & ModuleType YAML export (#21859) 2026-04-09 09:41:14 -05:00