From 7375042f9e04a69a4383fcc57592d20652ad5741 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 14 Apr 2025 15:12:47 -0400 Subject: [PATCH] Release v4.3-beta1 (#19172) * Draft changelog for v4.3 release * Add release notes summary & nav link * Docs cleanup * Update Python dependencies * Update static assets * Revert errant change to schema * Fix minimum PostgreSQL version * Misc cleanup * Correct issue numbers in change log --- base_requirements.txt | 8 +- docs/configuration/system.md | 4 + docs/installation/upgrading.md | 85 ++++++----- docs/models/dcim/devicerole.md | 2 + docs/models/dcim/racktype.md | 2 + docs/plugins/development/models.md | 5 +- docs/release-notes/index.md | 9 ++ docs/release-notes/version-4.3.md | 132 ++++++++++++++++++ mkdocs.yml | 2 + .../project-static/dist/netbox-external.css | Bin 367126 -> 366716 bytes netbox/project-static/dist/netbox.css | Bin 554086 -> 534239 bytes netbox/project-static/dist/netbox.js | Bin 383482 -> 381549 bytes netbox/project-static/dist/netbox.js.map | Bin 537270 -> 534940 bytes .../netbox-graphiql/package.json | 2 +- netbox/project-static/package.json | 8 +- netbox/project-static/styles/netbox.scss | 4 +- netbox/project-static/yarn.lock | 35 +++-- netbox/release.yaml | 4 +- requirements.txt | 14 +- 19 files changed, 230 insertions(+), 86 deletions(-) create mode 100644 docs/release-notes/version-4.3.md diff --git a/base_requirements.txt b/base_requirements.txt index b810cb56f..0c6e308e1 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -8,10 +8,7 @@ django-cors-headers # Runtime UI tool for debugging Django # https://github.com/jazzband/django-debug-toolbar/blob/main/docs/changes.rst -# See: https://django-debug-toolbar.readthedocs.io/en/latest/changes.html#id1 -# "Wrap SHOW_TOOLBAR_CALLBACK function with sync_to_async or async_to_sync to allow sync/async -# compatibility." breaks stawberry-graphql-django at version 0.52.0 (current) -django-debug-toolbar==5.0.1 +django-debug-toolbar # Library for writing reusable URL query filters # https://github.com/carltongibson/django-filter/blob/main/CHANGES.rst @@ -143,8 +140,7 @@ strawberry-graphql # Strawberry GraphQL Django extension # https://github.com/strawberry-graphql/strawberry-django/releases -# Pinned to v0.52.0 for suspected upstream bug; see #18329 -strawberry-graphql-django==0.52.0 +strawberry-graphql-django # SVG image rendering (used for rack elevations) # https://github.com/mozman/svgwrite/blob/master/NEWS.rst diff --git a/docs/configuration/system.md b/docs/configuration/system.md index 11db09370..63e7cf64f 100644 --- a/docs/configuration/system.md +++ b/docs/configuration/system.md @@ -14,6 +14,8 @@ BASE_PATH = 'netbox/' ## DATABASE_ROUTERS +!!! info "This parameter was introduced in NetBox v4.3." + Default: `[]` (empty list) An iterable of [database routers](https://docs.djangoproject.com/en/stable/topics/db/multi-db/) to use for automatically selecting the appropriate database(s) for a query. This is useful only when [multiple databases](./required-parameters.md#databases) have been configured. @@ -172,6 +174,8 @@ The file path to the location where media files (such as image attachments) are ## PROXY_ROUTERS +!!! info "This parameter was introduced in NetBox v4.3." + Default: `["utilities.proxy.DefaultProxyRouter"]` A list of Python classes responsible for determining which proxy server(s) to use for outbound HTTP requests. Each item in the list can be the class itself or the dotted path to the class. diff --git a/docs/installation/upgrading.md b/docs/installation/upgrading.md index 41b0e9662..d2e024823 100644 --- a/docs/installation/upgrading.md +++ b/docs/installation/upgrading.md @@ -17,51 +17,50 @@ Prior to upgrading your NetBox instance, be sure to carefully review all [releas NetBox requires the following dependencies: -### "Current Version" +| Dependency | Supported Versions | +|------------|--------------------| +| Python | 3.10, 3.11, 3.12 | +| PostgreSQL | 14+ | +| Redis | 4.0+ | - | Dependency | Supported Versions | - |------------|--------------------| - | Python | 3.10, 3.11, 3.12 | - | PostgreSQL | 14+ | - | Redis | 4.0+ | +### Version History -### "All Versions" - - | NetBox Version | Python min | Python max | PostgreSQL min | Redis min | Documentation | - |:--------------:|:----------:|:----------:|:--------------:|:---------:|:-------------------------------------------------------------------------------------------------:| - | 4.2 | 3.10 | 3.12 | **13** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md) | - | 4.1 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.1.0/docs/installation/index.md) | - | 4.0 | **3.10** | **3.12** | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.0.0/docs/installation/index.md) | - | 3.7 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.7.0/docs/installation/index.md) | - | 3.6 | 3.8 | **3.11** | **12** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.6.0/docs/installation/index.md) | - | 3.5 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.5.0/docs/installation/index.md) | - | 3.4 | 3.8 | 3.10 | **11** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.4.0/docs/installation/index.md) | - | 3.3 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.3.0/docs/installation/index.md) | - | 3.2 | **3.8** | **3.10** | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.2.0/docs/installation/index.md) | - | 3.1 | 3.7 | 3.9 | **10** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.1.0/docs/installation/index.md) | - | 3.0 | **3.7** | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.0.0/docs/installation/index.md) | - | 2.11 | 3.6 | **3.9** | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.11.0/docs/installation/index.md) | - | 2.10 | 3.6 | 3.8 | **9.6** | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.10.0/docs/installation/index.md) | - | 2.9 | 3.6 | 3.8 | 9.5 | **4.0** | [Link](https://github.com/netbox-community/netbox/blob/v2.9.0/docs/installation/index.md) | - | 2.8 | **3.6** | **3.8** | **9.5** | **3.4** | [Link](https://github.com/netbox-community/netbox/blob/v2.8.0/docs/installation/index.md) | - | 2.7 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.7.0/docs/installation/index.md) | - | 2.6 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.6.0/docs/installation/index.md) | - | 2.5 | **3.5** | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.5.0/docs/installation/index.md) | - | 2.4 | **3.4** | **3.7** | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.4.0/docs/installation/index.md) | - | 2.3 | 2.7 | 3.6 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.3.0/docs/installation/postgresql.md) | - | 2.2 | 2.7 | 3.6 | **9.4** | - | [Link](https://github.com/netbox-community/netbox/blob/v2.2.0/docs/installation/postgresql.md) | - | 2.1 | 2.7 | 3.6 | 9.3 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.1.0/docs/installation/postgresql.md) | - | 2.0 | 2.7 | **3.6** | **9.3** | - | [Link](https://github.com/netbox-community/netbox/blob/v2.0.0/docs/installation/postgresql.md) | - | 1.9 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.9.0-r1/docs/installation/postgresql.md) | - | 1.8 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.8.0/docs/installation/postgresql.md) | - | 1.7 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.7.0/docs/installation/postgresql.md) | - | 1.6 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.6.0/docs/installation/postgresql.md) | - | 1.5 | 2.7 | 3.5 | **9.2** | - | [Link](https://github.com/netbox-community/netbox/blob/v1.5.0/docs/installation/postgresql.md) | - | 1.4 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.4.0/docs/installation/postgresql.md) | - | 1.3 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.3.0/docs/installation/postgresql.md) | - | 1.2 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.2.0/docs/installation/postgresql.md) | - | 1.1 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.1.0/docs/getting-started.md) | - | 1.0 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/1.0.0/docs/getting-started.md) | +| NetBox Version | Python min | Python max | PostgreSQL min | Redis min | Documentation | +|:--------------:|:----------:|:----------:|:--------------:|:---------:|:-------------------------------------------------------------------------------------------------:| +| 4.3 | 3.10 | 3.12 | 14 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.3.0/docs/installation/index.md) | +| 4.2 | 3.10 | 3.12 | 13 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.2.0/docs/installation/index.md) | +| 4.1 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.1.0/docs/installation/index.md) | +| 4.0 | 3.10 | 3.12 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v4.0.0/docs/installation/index.md) | +| 3.7 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.7.0/docs/installation/index.md) | +| 3.6 | 3.8 | 3.11 | 12 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.6.0/docs/installation/index.md) | +| 3.5 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.5.0/docs/installation/index.md) | +| 3.4 | 3.8 | 3.10 | 11 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.4.0/docs/installation/index.md) | +| 3.3 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.3.0/docs/installation/index.md) | +| 3.2 | 3.8 | 3.10 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.2.0/docs/installation/index.md) | +| 3.1 | 3.7 | 3.9 | 10 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.1.0/docs/installation/index.md) | +| 3.0 | 3.7 | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v3.0.0/docs/installation/index.md) | +| 2.11 | 3.6 | 3.9 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.11.0/docs/installation/index.md) | +| 2.10 | 3.6 | 3.8 | 9.6 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.10.0/docs/installation/index.md) | +| 2.9 | 3.6 | 3.8 | 9.5 | 4.0 | [Link](https://github.com/netbox-community/netbox/blob/v2.9.0/docs/installation/index.md) | +| 2.8 | 3.6 | 3.8 | 9.5 | 3.4 | [Link](https://github.com/netbox-community/netbox/blob/v2.8.0/docs/installation/index.md) | +| 2.7 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.7.0/docs/installation/index.md) | +| 2.6 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.6.0/docs/installation/index.md) | +| 2.5 | 3.5 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.5.0/docs/installation/index.md) | +| 2.4 | 3.4 | 3.7 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.4.0/docs/installation/index.md) | +| 2.3 | 2.7 | 3.6 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.3.0/docs/installation/postgresql.md) | +| 2.2 | 2.7 | 3.6 | 9.4 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.2.0/docs/installation/postgresql.md) | +| 2.1 | 2.7 | 3.6 | 9.3 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.1.0/docs/installation/postgresql.md) | +| 2.0 | 2.7 | 3.6 | 9.3 | - | [Link](https://github.com/netbox-community/netbox/blob/v2.0.0/docs/installation/postgresql.md) | +| 1.9 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.9.0-r1/docs/installation/postgresql.md) | +| 1.8 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.8.0/docs/installation/postgresql.md) | +| 1.7 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.7.0/docs/installation/postgresql.md) | +| 1.6 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.6.0/docs/installation/postgresql.md) | +| 1.5 | 2.7 | 3.5 | 9.2 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.5.0/docs/installation/postgresql.md) | +| 1.4 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.4.0/docs/installation/postgresql.md) | +| 1.3 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.3.0/docs/installation/postgresql.md) | +| 1.2 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.2.0/docs/installation/postgresql.md) | +| 1.1 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/v1.1.0/docs/getting-started.md) | +| 1.0 | 2.7 | 3.5 | 9.1 | - | [Link](https://github.com/netbox-community/netbox/blob/1.0.0/docs/getting-started.md) | ## 3. Install the Latest Release diff --git a/docs/models/dcim/devicerole.md b/docs/models/dcim/devicerole.md index e58373565..abff149d6 100644 --- a/docs/models/dcim/devicerole.md +++ b/docs/models/dcim/devicerole.md @@ -6,6 +6,8 @@ Devices can be organized by functional roles, which are fully customizable by th ### Parent +!!! info "This field was introduced in NetBox v4.3." + The parent role of which this role is a child (optional). ### Name diff --git a/docs/models/dcim/racktype.md b/docs/models/dcim/racktype.md index ecaf539c9..5298e8b26 100644 --- a/docs/models/dcim/racktype.md +++ b/docs/models/dcim/racktype.md @@ -42,6 +42,8 @@ The number of the numerically lowest unit in the rack. This value defaults to on The external width, height and depth of the rack can be tracked to aid in floorplan calculations. These measurements must be designated in either millimeters or inches. +!!! info "The `outer_height` field was introduced in NetBox v4.3." + ### Mounting Depth The maximum depth of a mounted device that the rack can accommodate, in millimeters. For four-post frames or cabinets, this is the horizontal distance between the front and rear vertical rails. (Note that this measurement does _not_ include space between the rails and the cabinet doors.) diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index 492b7fc97..508c4ce89 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -119,6 +119,8 @@ For more information about database migrations, see the [Django documentation](h ::: netbox.models.features.ContactsMixin +!!! info "Plugin support for ContactsMixin was introduced in NetBox v4.3." + ::: netbox.models.features.CustomLinksMixin ::: netbox.models.features.CustomFieldsMixin @@ -127,9 +129,6 @@ For more information about database migrations, see the [Django documentation](h ::: netbox.models.features.EventRulesMixin -!!! note - `EventRulesMixin` was renamed from `WebhooksMixin` in NetBox v3.7. - ::: netbox.models.features.ExportTemplatesMixin ::: netbox.models.features.JobsMixin diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index d996224c1..0d0b10092 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -10,6 +10,15 @@ Minor releases are published in April, August, and December of each calendar yea This page contains a history of all major and minor releases since NetBox v2.0. For more detail on a specific patch release, please see the release notes page for that specific minor release. +#### [Version 4.3](./version-4.3.md) (May 2025) + +* Module Type Profiles & Custom Attributes ([#19002](https://github.com/netbox-community/netbox/issues/19002)) +* Reusable Table Configurations ([#14591](https://github.com/netbox-community/netbox/issues/14591)) +* Option to Treat IP Ranges as Fully Populated ([#9763](https://github.com/netbox-community/netbox/issues/9763)) +* Hierarchical Device Roles ([#18245](https://github.com/netbox-community/netbox/issues/18245)) +* Periodic Synchronization of Data Sources ([#18287](https://github.com/netbox-community/netbox/issues/18287)) +* Proxy Routing ([#18627](https://github.com/netbox-community/netbox/issues/18627)) + #### [Version 4.2](./version-4.2.md) (January 2025) * Assign Multiple MAC Addresses per Interface ([#4867](https://github.com/netbox-community/netbox/issues/4867)) diff --git a/docs/release-notes/version-4.3.md b/docs/release-notes/version-4.3.md new file mode 100644 index 000000000..f24716cc3 --- /dev/null +++ b/docs/release-notes/version-4.3.md @@ -0,0 +1,132 @@ +## v4.3.0-beta1 (2025-04-14) + +### Breaking Changes + +* The GraphQL API Now uses an advanced syntax for filtering, to enable e.g. logical AND/OR filtering and custom field lookups. +* PostgreSQL 13 is no longer supported. NetBox v4.3 requires PostgreSQL 14.0 or later. +* The `ALLOW_TOKEN_RETRIEVAL` configuration parameter now defaults to False. +* The `device` and `virtual_machine` foreign keys on the Service model have been replaced with a generic `parent` relationship to support the assignment of services to FHRP groups as well. +* The `group` foreign key on the Contact model has been replaced with a many-to-many `groups` field. +* PluginTemplateExtension no longer supports registration via the singular `model` attribute (use `models` instead). +* The legacy staged changes functionality has been removed. + +### New Features + +#### Module Type Profiles & Custom Attributes ([#19002](https://github.com/netbox-community/netbox/issues/19002)) + +The new [module type profile](../models/dcim/moduletypeprofile.md) model enables users to declare custom profiles for module types, with the ability to define custom attributes for each profile according to its functional role. For example, a CPU module type might declare architecture and clock speed attributes; a hard disk profile might declare attributes for type and speed. + +Attributes can be declared on each profile using [JSON schema](https://json-schema.org/), which allows for attributes to be declared as strings (text), integers, decimals, booleans, or choice fields. Profile attributes render as individual form fields when modifying a module type. Several profiles have been included by default to serve as examples, however these may be modified or removed. + +#### Reusable Table Configurations ([#14591](https://github.com/netbox-community/netbox/issues/14591)) + +After modifying the displayed columns and/or ordering for a specific object table in the user interface, users now have the option to save that configuration so that it can be reused in the future. Similar to saved filters, table configs can be shared with other users to easily replicate table layouts crafted to serve specific use cases. + +#### Option to Treat IP Ranges as Fully Populated ([#9763](https://github.com/netbox-community/netbox/issues/9763)) + +A new `mark_populated` boolean field has been added to the IPRange model. If set to true, NetBox will consider the IP range to be fully populated, and will not permit the creation of individual IP addresses within the range. For example, you might defer the management of an IP range to an external DHCP server, and wish for NetBox to treat the range as a opaque monolithic block for planning and allocation purposes. + +#### Hierarchical Device Roles ([#18245](https://github.com/netbox-community/netbox/issues/18245)) + +Device roles can now be arranged hierarchically, with one role optionally serving as a parent to one or more child roles. For example, you might wish to create a generic "Server" role for devices with "Application Server" and "Database Server" roles beneath it. A device could then be assigned to any of these three roles. + +#### Periodic Synchronization of Data Sources ([#18287](https://github.com/netbox-community/netbox/issues/18287)) + +Data sources can now be configured to synchronize automatically at a specified interval, as indicated by the new `sync_interval` field. No additional system configuration is necessary to support this functionality; background jobs will be scheduled automatically by the RQ worker process. + +#### Proxy Routing ([#18627](https://github.com/netbox-community/netbox/issues/18627)) + +User can now declare one or more proxy routers via the `PROXY_ROUTERS` configuration parameter to control the use of specific proxy servers for various outbound connections. For example, it is now possible to configure NetBox to use different proxies based on the type of outbound traffic or its destination. + +### Enhancements + +* [#7598](https://github.com/netbox-community/netbox/issues/7598) - Adopt advanced query filtering in GraphQL API to support filtering by custom fields +* [#8423](https://github.com/netbox-community/netbox/issues/8423) - Enable assigning services to FHRP groups +* [#15842](https://github.com/netbox-community/netbox/issues/15842) - Introduce the `LOGIN_FORM_HIDDEN` configuration parameter +* [#16224](https://github.com/netbox-community/netbox/issues/16224) - Implement pagination support for the GraphQL API +* [#17170](https://github.com/netbox-community/netbox/issues/17170) - Enable the assignment of a contact to multiple contact groups +* [#17443](https://github.com/netbox-community/netbox/issues/17443) - Add a `file_name` field to the export template model +* [#17602](https://github.com/netbox-community/netbox/issues/17602) - Add a `comments` field to all nested group models (Region, SiteGroup, Location, ContactGroup, TenantGroup, and WirelessLANGroup) +* [#17608](https://github.com/netbox-community/netbox/issues/17608) - Add a `status` field to the L2VPN model +* [#17653](https://github.com/netbox-community/netbox/issues/17653) - Enable declaring Jinja environment parameters on export templates (similar to config templates) +* [#17793](https://github.com/netbox-community/netbox/issues/17793) - Introduce a REST API endpoint for tagged objects (`/api/extras/tagged-objects/`) +* [#17841](https://github.com/netbox-community/netbox/issues/17841) - Add a `weight` field to the Tag model to influence ordering +* [#18296](https://github.com/netbox-community/netbox/issues/18296) - Add a `tenant` field to the VLAN group model +* [#18352](https://github.com/netbox-community/netbox/issues/18352) - Add a `status` field to the power outlet model +* [#18417](https://github.com/netbox-community/netbox/issues/18417) - Add an `outer_height` field to the rack & rack type models +* [#18535](https://github.com/netbox-community/netbox/issues/18535) - The presence of incompatible plugins will no longer prevent NetBox from starting +* [#18780](https://github.com/netbox-community/netbox/issues/18780) - Introduce `DATABASES` and `DATABASE_ROUTERS` configuration parameters to enable defining connections to external databases (e.g. for plugins) +* [#18783](https://github.com/netbox-community/netbox/issues/18783) - Enable filtering all applicable models by tag ID +* [#18785](https://github.com/netbox-community/netbox/issues/18785) - Enable custom choices for rack, device, and module airflow + +### Plugins + +* [#16630](https://github.com/netbox-community/netbox/issues/16630) - Plugins can now inject content within the HTML `` block via the new `plugin_head()` method on PluginTemplateExtension +* [#17424](https://github.com/netbox-community/netbox/issues/17424) - Extend ViewTab with a `visible` argument to control tab rendering +* [#17857](https://github.com/netbox-community/netbox/issues/17857) - Added a `release_track` attribute to PluginConfig +* [#18305](https://github.com/netbox-community/netbox/issues/18305) - Introduce plugin support for ContactsMixin +* [#19073](https://github.com/netbox-community/netbox/issues/19073) - Allow installed plugins to be omitted from the plugins list + +### Other Changes + +* [#18071](https://github.com/netbox-community/netbox/issues/18071) - Removed legacy staged changed functionality in favor of the [netbox-branching](https://github.com/netboxlabs/netbox-branching) plugin +* [#18072](https://github.com/netbox-community/netbox/issues/18072) - Drop support for the singular `model` attribute on PluginTemplateExtension (use `models` instead) +* [#18191](https://github.com/netbox-community/netbox/issues/18191) - Remove redundant PostgreSQL indexes +* [#18236](https://github.com/netbox-community/netbox/issues/18236) - Upgrade the HTMX library to v2.0 +* [#18540](https://github.com/netbox-community/netbox/issues/18540) - Operational plugins are now recorded in the application registry +* [#18623](https://github.com/netbox-community/netbox/issues/18623) - Upgrade the Tabler CSS theme to v1.0 +* [#18743](https://github.com/netbox-community/netbox/issues/18743) - Upgrade Django to v5.2 +* [#18751](https://github.com/netbox-community/netbox/issues/18751) - Change the default value for `ALLOW_TOKEN_RETRIEVAL` to False +* [#18808](https://github.com/netbox-community/netbox/issues/18808) - Squashed migration dependencies have been altered to rectify an issue with Django's `sqlmigrate` management command +* [#18820](https://github.com/netbox-community/netbox/issues/18820) - PostgreSQL 13 is no longer supported +* [#19004](https://github.com/netbox-community/netbox/issues/19004) - The use of inventory items has been deprecated in favor of modules. Inventory items and roles may be removed in a future NetBox release. + +### REST API Changes + +* Added the following endpoints: + * `/api/extras/table-configs/` + * `/api/extras/tagged-objects/` + * `/api/dcim/module-type-profiles/` +* core.DataSource + * Added the optional `sync_interval` field +* dcim.DeviceRole + * Added the optional `parent` recursive foreign key field to effect hierarchical ordering + * Added a `comments` field +* dcim.Location + * Added a `comments` field +* dcim.ModuleType + * Added the optional `profile` foreign key to the new ModuleTypeProfile model +* dcim.PowerOutlet + * Added a `status` field +* dcim.Rack + * Added the optional `outer_height` field +* dcim.RackType + * Added the optional `outer_height` field +* dcim.Region + * Added a `comments` field +* dcim.SiteGroup + * Added a `comments` field +* extras.ConfigTemplate + * Added optional fields `mime_type`, `file_name`, `file_extension` and `as_attachment` +* extras.ExportTemplate + * Added optional fields `file_name` and `environment_params` (JSON) +* extras.Tag + * Added a `weight` field +* ipam.IPRange + * Added a `mark_populaed` boolean field +* ipam.L2VPN + * Added a `status` field +* ipam.Service + * Removed the `device` and `virtual_machine` foreign key fields + * Added the `parent_object_type`, `parent_object_id`, and (read-only) `parent` fields +* ipam.VLANGroup + * Added the optional `tenant` foreign key field +* tenancy.Contact + * Removed the `group` foreign key field + * Added the `groups` many-to-many field +* tenancy.ContactGroup + * Added a `comments` field +* tenancy.TenantGroup + * Added a `comments` field +* wireless.WirelessLANGroup + * Added a `comments` field diff --git a/mkdocs.yml b/mkdocs.yml index c5fbcf8ee..1b4e6c393 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -202,6 +202,7 @@ nav: - ModuleBay: 'models/dcim/modulebay.md' - ModuleBayTemplate: 'models/dcim/modulebaytemplate.md' - ModuleType: 'models/dcim/moduletype.md' + - ModuleTypeProfile: 'models/dcim/moduletypeprofile.md' - Platform: 'models/dcim/platform.md' - PowerFeed: 'models/dcim/powerfeed.md' - PowerOutlet: 'models/dcim/poweroutlet.md' @@ -307,6 +308,7 @@ nav: - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: - Summary: 'release-notes/index.md' + - Version 4.3: 'release-notes/version-4.3.md' - Version 4.2: 'release-notes/version-4.2.md' - Version 4.1: 'release-notes/version-4.1.md' - Version 4.0: 'release-notes/version-4.0.md' diff --git a/netbox/project-static/dist/netbox-external.css b/netbox/project-static/dist/netbox-external.css index 702520216bbe5e036eeb5e41d8ac1cdff2adfee6..a7390f98fabbdaf42ddc9ae25fa52f37787d5174 100644 GIT binary patch delta 725 zcmbQXMeNT8v4$4L7N!>F7M3ln3fb<~CHVzb2G%*LX(d3aJTs*v!>TN?NJCdQy;wIn zKc_S|PZunzX`PXpnVwOCB%7L(qYDw#oUV|~`e(XMHmeq+&UD3WR*C6FS*(inAj9FN zWtODo>gFaErDx{p0wpx9i%`u&mIq5|S|{a~l;r1PHv%H332{1BOLAC%zS7(-ki+_! z*%GS?urt7Z$0`ky(VPy{uP|MufK^Ent0IsY)7=YLQ><}H6ZR>@k~0OYhDyXLmMvt} zaw95)2!=Dn_VhwleHpBNfClySzyen7>4$*!x)5bAQ31L3FA~9VFrkQ5eS1m~ Yt1R<$p;}h!=_jgKwYTe3vA&WA0KJg=ZvX%Q delta 1243 zcma)+y-vbV6o3PG;^<=75Nu*JF*LngDENbkyNiR9aWH~N5F)e$3?bK{K7ht>7azib zgqLv87tq~jaPZvQdMy#So!az%=j-YD>Gw-=G)~@mF)!{VyrnT@8vLyXDeg7klRvj$ zm9KSSdD3peYa(t9`9llReAEUbX7TqnRPb`sf#aAwS?A!umVck&PY#%P{Nccf|0vD5 z3xw}=VRN$5g;au>H784Q2WG8PuVfwf{GySqyVd5PSFgBNyCsuSx-pysonmaiY!KsY za9zE0BhbCFkwe;-6Wg?zUDWACfYb|KgQK4+f3BcYQ-cL=4U68q@=_Y5DuS13FT`23 zDXNJ6g7W8y_B*laf|vdXIO=VsFIb_nu<5o39Tl*2PqF_|^cMfTk%mR^zFOiel*>$i zN%?Jk`>`y7m;MMirq6bizo;D-!AiFVMK7_Gx3p+ng8qvw5)snAFhI=<5o_l!(oUp- okpc1rA^vFA@&^-1LaS>14$Ztj1wn!z-orjOZ()1#*oUw54`rg1YybcN diff --git a/netbox/project-static/dist/netbox.css b/netbox/project-static/dist/netbox.css index 9a64c6e43ed02b479e7a8595dda63bf5caa0ebeb..0d1f74c3c472eee7d889f33d956fee050365d7a7 100644 GIT binary patch delta 8137 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%0A_l0AmU z*~ECtM@7{QZ=7XvGc`A(yA6X-ejYqAhvd>YZLw%_E{2bn)A>g|!N&kp# z)sHvQ4Ujs(RHjF2`%uuQRjlyMZm7IC_prgSrzY zdc$-~Fph}TJ6bUPU&z5u(U1|4rl_fAFp%!2%i1(C=;jl%m3Vc`TMb=wVPzMToDq|p zavqGAqgOt9+C-Pd3ASqa9yaCtaq$howk2eCy)_=1;!23_V~UrEsW|pJGw);b3L7oc zxq|uV3MQH{(XH9875Y^qIVtL2R!q4TMm0RcAl@H~U5PYkA21RRxq^my8DlI`V1$E_X7>K&EvRzHFh4e$H0|T%j-Y1{%Ts5U5U#fAa|vK9$xx}H zs%24bJX#80{(v#7mfP90`HWu0yI^rk(h_y$1MDec5;{60<-+A6Whq~u+}(l7jgKL4 zoMmoOLwng$g7u76UPaD8A0M|I?7M36)}PiM-$1o5z=yHRRjUX;&*piDeNL@jgog0D zM?l6TcM>9HTWy|t{6W@5Xf1m9pl&fKP_jnL;iwNk4V-C3aq*8Nr8kAJduEwjt=k%6 zKa@pW0I~dVfy4NM7Bd_OJ&Y!V@hAmSIX1b#(G>YD!0gKw9W*TfaxZ(89#fl#1)EM7 z8pmYk6bD3nO>CjzT;TXhu3Xvridm_wEc#9qiB-@OUyP;NZLv5MLZSFTXJW(%9kxX3 zV!2zwtm1gI#%b^+lG0lfpxTXM{As|E9W69*!bo%99%hQuq8&oF_K8Eu9IY_8-@X`A zZv14EZBC$e2rS>icFn3ZmW6_Kl-V4)h#TFg4BK|HRqKsUVR3e9mZVGF7r=5^>y{?y z&or8o;D01+5b^UTsgP1$SzPAQ@p(kVhshE0QSS1&y8~i4>~x@sjr^X#^o2mz0o%?p zHCeXU8mn6f^a){YDG%?2>2k1NOEIwjJ%&|o*jtD`(c+4>usZxfceiV5N8Dw&aqT0S zdh8MQSN{OB4zrbe>>Le8zhcAj(b})s-uUSANhA0s4%-}CwC7DOVaFztILe?BM?aY~ zx;}|plY-6paIe%UxJBJ1)h(w}&E>wHP*9SEfIMu|%rhqnNuE+qBVUJ(#%_Ufj?01jIqr-BSYV$7*pbYQ7=Y$UJJi|~?ll7A nbGcGgS;qaD#-#twRh(Fc|1bHu0c?}Q#!cLvIQ(oA7oz?Lh%f)p delta 16743 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 Y&yj^ei+$vO0m*=lj{pDw delta 10038 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 R^o>FOWz0x?WQf1-e*q0gSCRk# diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 12ecc4777c15262990f3ee84a8ba6e162da2013b..c9fb173f98363f65a34823e6209be0bb00233de1 100644 GIT binary patch delta 22294 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 asXv{PeY%=8*xSeLiMIWztp(ZVd;c$b$qCc| delta 24630 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 QF3&t(r53Kt{D${`0h27T8UO$Q diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 00218185a..be4f8911f 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -1,6 +1,6 @@ { "name": "netbox-graphiql", - "version": "4.2.0", + "version": "4.3.0", "description": "NetBox GraphiQL Custom Front End", "main": "dist/graphiql.js", "license": "Apache-2.0", diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 629845aa6..2b6d26a2f 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -23,14 +23,14 @@ }, "dependencies": { "@mdi/font": "7.4.47", - "@tabler/core": "1.0.0", - "bootstrap": "5.3.3", + "@tabler/core": "1.1.1", + "bootstrap": "5.3.5", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "11.5.0", + "gridstack": "12.0.0", "htmx.org": "2.0.4", "query-string": "9.1.1", - "sass": "1.86.0", + "sass": "1.86.3", "tom-select": "2.4.3", "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" diff --git a/netbox/project-static/styles/netbox.scss b/netbox/project-static/styles/netbox.scss index effc90dec..96804c105 100644 --- a/netbox/project-static/styles/netbox.scss +++ b/netbox/project-static/styles/netbox.scss @@ -1,8 +1,8 @@ @import 'variables'; // Tabler & vendors -@import '../node_modules/@tabler/core/src/scss/_core.scss'; -@import '../node_modules/@tabler/core/src/scss/vendor/tom-select'; +@import '../node_modules/@tabler/core/scss/_core.scss'; +@import '../node_modules/@tabler/core/scss/vendor/tom-select'; // Overrides of external libraries @import 'overrides/bootstrap'; diff --git a/netbox/project-static/yarn.lock b/netbox/project-static/yarn.lock index 74a28667d..455b54068 100644 --- a/netbox/project-static/yarn.lock +++ b/netbox/project-static/yarn.lock @@ -759,20 +759,14 @@ resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== -"@tabler/core@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0.tgz#08736378108663b5893a31ad462be7d12e64be67" - integrity sha512-uFmv6f8TAaW2JaGwzjT1LfK+TjmBQSTCoznCMdV5uur4cv4TtJlV8Hh1Beu55YX0svMtOQ0Xts7tYv/+qBEcfA== +"@tabler/core@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.1.1.tgz#6b7044c4b427f14c1d78e4532106821466d619a6" + integrity sha512-VVxsx6+XtCtSjKqS0m5z8W2OcNAYHRiygl3ov+RrQDDB4UK5jfSa26dY+2sMcohocV6GsBpuozPyEk8p3/8sdQ== dependencies: "@popperjs/core" "^2.11.8" - "@tabler/icons" "^3.29.0" bootstrap "5.3.3" -"@tabler/icons@^3.29.0": - version "3.30.0" - resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.30.0.tgz#4f80f52cc6355b440a4ee0dadd4c3e3775e50663" - integrity sha512-c8OKLM48l00u9TFbh2qhSODMONIzML8ajtCyq95rW8vzkWcBrKRPM61tdkThz2j4kd5u17srPGIjqdeRUZdfdw== - "@tanstack/react-virtual@^3.0.0-beta.60": version "3.5.0" resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.5.0.tgz#873b5b77cf78af563a4a11e6251ed51ee8868132" @@ -1066,6 +1060,11 @@ bootstrap@5.3.3: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== +bootstrap@5.3.5: + version "5.3.5" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.5.tgz#be42cfe0d580e97ee1abb7d38ce94f5c393c9bb6" + integrity sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1911,10 +1910,10 @@ graphql@16.10.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== -gridstack@11.5.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-11.5.0.tgz#ecd507776db857f3308d37a8fd67d6a24c7fdd74" - integrity sha512-SE1a/aC2K8VKQr5cqV7gSJ+r/xIYghijIjHzkZ3Xo3aS1/4dvwIgPYT7QqgV1z+d7XjKYUPEizcgVQ5HhdFTng== +gridstack@12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-12.0.0.tgz#cb824410436573f480fc9e62c2e3fdf2fa536a9e" + integrity sha512-Wjfu7BtTb4NZqLpSEAJx+b9lBnfnXNgG2jUTVSD2g8NrHITrWgfk9eeHBqtDLVl2vtKQTzsSyy5lSyHAMcW2tA== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" @@ -2673,10 +2672,10 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -sass@1.86.0: - version "1.86.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.0.tgz#f49464fb6237a903a93f4e8760ef6e37a5030114" - integrity sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA== +sass@1.86.3: + version "1.86.3" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.86.3.tgz#0a0d9ea97cb6665e73f409639f8533ce057464c9" + integrity sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw== dependencies: chokidar "^4.0.0" immutable "^5.0.2" diff --git a/netbox/release.yaml b/netbox/release.yaml index 315055fff..2b985d000 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.2.7" +version: "4.3.0-beta1" edition: "Community" -published: "2025-04-10" +published: "2025-04-14" diff --git a/requirements.txt b/requirements.txt index 1dfdc1e4a..7537809d1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ Django==5.2.0 django-cors-headers==4.7.0 -django-debug-toolbar==5.0.1 +django-debug-toolbar==5.1.0 django-filter==25.1 django-htmx==1.23.0 django-graphiql-debug-toolbar==0.2.0 @@ -10,7 +10,7 @@ django-prometheus==2.3.1 django-redis==5.4.0 django-rich==1.14.0 django-rq==3.0 -django-storages==1.14.4 +django-storages==1.14.6 django-taggit==6.1.0 django-tables2==2.7.5 django-timezone-field==7.1 @@ -21,20 +21,20 @@ feedparser==6.0.11 gunicorn==23.0.0 Jinja2==3.1.6 jsonschema==4.23.0 -Markdown==3.7 +Markdown==3.8 mkdocs-material==9.6.11 mkdocstrings[python]==0.29.1 netaddr==1.3.0 nh3==0.2.21 -Pillow==11.1.0 +Pillow==11.2.1 psycopg[c,pool]==3.2.6 PyYAML==6.0.2 requests==2.32.3 -rq==2.1.0 +rq==2.3.2 social-auth-app-django==5.4.3 social-auth-core==4.5.6 -strawberry-graphql==0.263.2 -strawberry-graphql-django==0.52.0 +strawberry-graphql==0.264.0 +strawberry-graphql-django==0.58.0 svgwrite==1.4.3 tablib==3.8.0 tzdata==2025.2