Compare commits

..

1 Commits

Author SHA1 Message Date
Jeremy Stretch
970f2bd4ed Release v4.4.8
Some checks are pending
CI / build (20.x, 3.10) (push) Waiting to run
CI / build (20.x, 3.11) (push) Waiting to run
CI / build (20.x, 3.12) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, actions) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Waiting to run
CodeQL / Analyze (${{ matrix.language }}) (none, python) (push) Waiting to run
2025-12-09 11:28:36 -05:00
39 changed files with 7912 additions and 6869 deletions

View File

@@ -15,7 +15,7 @@ body:
attributes: attributes:
label: NetBox version label: NetBox version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v4.4.7 placeholder: v4.4.8
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@@ -27,7 +27,7 @@ body:
attributes: attributes:
label: NetBox Version label: NetBox Version
description: What version of NetBox are you currently running? description: What version of NetBox are you currently running?
placeholder: v4.4.7 placeholder: v4.4.8
validations: validations:
required: true required: true
- type: dropdown - type: dropdown

View File

@@ -2,7 +2,7 @@
"openapi": "3.0.3", "openapi": "3.0.3",
"info": { "info": {
"title": "NetBox REST API", "title": "NetBox REST API",
"version": "4.4.7", "version": "4.4.8",
"license": { "license": {
"name": "Apache v2 License" "name": "Apache v2 License"
} }
@@ -27326,6 +27326,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",
@@ -30798,6 +30850,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",
@@ -34158,6 +34262,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "updated_by_request", "name": "updated_by_request",
@@ -46373,6 +46529,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",
@@ -52303,6 +52511,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "tx_power", "name": "tx_power",
@@ -58814,6 +59074,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "updated_by_request", "name": "updated_by_request",
@@ -66953,6 +67265,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "updated_by_request", "name": "updated_by_request",
@@ -78840,6 +79204,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",
@@ -83976,6 +84392,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",
@@ -96759,6 +97227,58 @@
"explode": true, "explode": true,
"style": "form" "style": "form"
}, },
{
"in": "query",
"name": "tenant",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant__n",
"schema": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Tenant (slug)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{
"in": "query",
"name": "tenant_id__n",
"schema": {
"type": "array",
"items": {
"type": "integer"
}
},
"description": "Tenant (ID)",
"explode": true,
"style": "form"
},
{ {
"in": "query", "in": "query",
"name": "type", "name": "type",

View File

@@ -1,5 +1,22 @@
# NetBox v4.4 # NetBox v4.4
## v4.4.8 (2025-12-09)
### Enhancements
* [#20068](https://github.com/netbox-community/netbox/issues/20068) - Support the assignment of module type profile attributes via bulk import
* [#20914](https://github.com/netbox-community/netbox/issues/20914) - Enable filtering device components by tenant assigned to device
### Bug Fixes
* [#19918](https://github.com/netbox-community/netbox/issues/19918) - Fix support for `{module}` resolution of components of child modules
* [#20759](https://github.com/netbox-community/netbox/issues/20759) - Improve legibility of object types in permissions form
* [#20860](https://github.com/netbox-community/netbox/issues/20860) - Ensure user-provided changelog message is recorded when creating device components via the UI
* [#20878](https://github.com/netbox-community/netbox/issues/20878) - Use the active database connection when executing custom scripts
* [#20888](https://github.com/netbox-community/netbox/issues/20888) - Resolve warnings about non-decimal values for min/max latitude & longitude fields
---
## v4.4.7 (2025-11-25) ## v4.4.7 (2025-11-25)
### Enhancements ### Enhancements

View File

@@ -13,7 +13,6 @@ class DataSourceStatusChoices(ChoiceSet):
SYNCING = 'syncing' SYNCING = 'syncing'
COMPLETED = 'completed' COMPLETED = 'completed'
FAILED = 'failed' FAILED = 'failed'
READY = 'ready'
CHOICES = ( CHOICES = (
(NEW, _('New'), 'blue'), (NEW, _('New'), 'blue'),
@@ -21,7 +20,6 @@ class DataSourceStatusChoices(ChoiceSet):
(SYNCING, _('Syncing'), 'cyan'), (SYNCING, _('Syncing'), 'cyan'),
(COMPLETED, _('Completed'), 'green'), (COMPLETED, _('Completed'), 'green'),
(FAILED, _('Failed'), 'red'), (FAILED, _('Failed'), 'red'),
(READY, _('Ready'), 'green'),
) )

View File

@@ -16,7 +16,6 @@ from utilities.forms import get_field_value
from utilities.forms.fields import CommentField, JSONField from utilities.forms.fields import CommentField, JSONField
from utilities.forms.rendering import FieldSet from utilities.forms.rendering import FieldSet
from utilities.forms.widgets import HTMXSelect from utilities.forms.widgets import HTMXSelect
from core.choices import DataSourceStatusChoices
__all__ = ( __all__ = (
'ConfigRevisionForm', 'ConfigRevisionForm',
@@ -80,28 +79,14 @@ class DataSourceForm(NetBoxModelForm):
if self.instance and self.instance.parameters: if self.instance and self.instance.parameters:
self.fields[field_name].initial = self.instance.parameters.get(name) self.fields[field_name].initial = self.instance.parameters.get(name)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
parameters = {} parameters = {}
for name in self.fields: for name in self.fields:
if name.startswith('backend_'): if name.startswith('backend_'):
parameters[name[8:]] = self.cleaned_data[name] parameters[name[8:]] = self.cleaned_data[name]
self.instance.parameters = parameters self.instance.parameters = parameters
# Determine initial status based on new/existing instance
if not self.instance.pk:
# New instance
object_status = DataSourceStatusChoices.NEW
else:
# Existing instance
if not self.cleaned_data.get("sync_interval"):
object_status = DataSourceStatusChoices.READY
else:
object_status = self.instance.status
# # Final override only if the user explicitly provided a status
self.instance.status = object_status
return super().save(*args, **kwargs) return super().save(*args, **kwargs)

View File

@@ -111,7 +111,10 @@ class DataSource(JobsMixin, PrimaryModel):
@property @property
def ready_for_sync(self): def ready_for_sync(self):
return self.enabled and self.status != DataSourceStatusChoices.SYNCING return self.enabled and self.status not in (
DataSourceStatusChoices.QUEUED,
DataSourceStatusChoices.SYNCING
)
def clean(self): def clean(self):
super().clean() super().clean()

View File

@@ -30,7 +30,7 @@
"gridstack": "12.3.3", "gridstack": "12.3.3",
"htmx.org": "2.0.8", "htmx.org": "2.0.8",
"query-string": "9.3.1", "query-string": "9.3.1",
"sass": "1.94.2", "sass": "1.95.0",
"tom-select": "2.4.3", "tom-select": "2.4.3",
"typeface-inter": "3.18.1", "typeface-inter": "3.18.1",
"typeface-roboto-mono": "1.1.13" "typeface-roboto-mono": "1.1.13"

View File

@@ -3190,10 +3190,10 @@ safe-regex-test@^1.1.0:
es-errors "^1.3.0" es-errors "^1.3.0"
is-regex "^1.2.1" is-regex "^1.2.1"
sass@1.94.2: sass@1.95.0:
version "1.94.2" version "1.95.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.94.2.tgz#198511fc6fdd2fc0a71b8d1261735c12608d4ef3" resolved "https://registry.yarnpkg.com/sass/-/sass-1.95.0.tgz#3a3a4d4d954313ab50eaf16f6e2548a2f6ec0811"
integrity sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A== integrity sha512-9QMjhLq+UkOg/4bb8Lt8A+hJZvY3t+9xeZMKSBtBEgxrXA3ed5Ts4NDreUkYgJP1BTmrscQE/xYhf7iShow6lw==
dependencies: dependencies:
chokidar "^4.0.0" chokidar "^4.0.0"
immutable "^5.0.2" immutable "^5.0.2"

View File

@@ -1,3 +1,3 @@
version: "4.4.7" version: "4.4.8"
edition: "Community" edition: "Community"
published: "2025-11-25" published: "2025-12-09"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
colorama==0.4.6 colorama==0.4.6
Django==5.2.8 Django==5.2.9
django-cors-headers==4.9.0 django-cors-headers==4.9.0
django-debug-toolbar==6.1.0 django-debug-toolbar==6.1.0
django-filter==25.2 django-filter==25.2
django-graphiql-debug-toolbar==0.2.0 django-graphiql-debug-toolbar==0.2.0
django-htmx==1.26.0 django-htmx==1.27.0
django-mptt==0.17.0 django-mptt==0.17.0
django-pglocks==1.0.4 django-pglocks==1.0.4
django-prometheus==2.4.1 django-prometheus==2.4.1
@@ -14,30 +14,30 @@ django-rq==3.2.1
django-storages==1.14.6 django-storages==1.14.6
django-tables2==2.8.0 django-tables2==2.8.0
django-taggit==6.1.0 django-taggit==6.1.0
django-timezone-field==7.1 django-timezone-field==7.2.1
djangorestframework==3.16.1 djangorestframework==3.16.1
drf-spectacular==0.29.0 drf-spectacular==0.29.0
drf-spectacular-sidecar==2025.10.1 drf-spectacular-sidecar==2025.12.1
feedparser==6.0.12 feedparser==6.0.12
gunicorn==23.0.0 gunicorn==23.0.0
Jinja2==3.1.6 Jinja2==3.1.6
jsonschema==4.25.1 jsonschema==4.25.1
Markdown==3.10 Markdown==3.10
mkdocs-material==9.7.0 mkdocs-material==9.7.0
mkdocstrings==0.30.1 mkdocstrings==1.0.0
mkdocstrings-python==1.19.0 mkdocstrings-python==2.0.1
netaddr==1.3.0 netaddr==1.3.0
nh3==0.3.2 nh3==0.3.2
Pillow==12.0.0 Pillow==12.0.0
psycopg[c,pool]==3.2.13 psycopg[c,pool]==3.3.2
PyYAML==6.0.3 PyYAML==6.0.3
requests==2.32.5 requests==2.32.5
rq==2.6.1 rq==2.6.1
social-auth-app-django==5.6.0 social-auth-app-django==5.6.0
social-auth-core==4.8.1 social-auth-core==4.8.1
sorl-thumbnail==12.11.0 sorl-thumbnail==12.11.0
strawberry-graphql==0.287.0 strawberry-graphql==0.287.2
strawberry-graphql-django==0.67.2 strawberry-graphql-django==0.70.1
svgwrite==1.4.3 svgwrite==1.4.3
tablib==3.9.0 tablib==3.9.0
tzdata==2025.2 tzdata==2025.2