Compare commits

...

20 Commits

Author SHA1 Message Date
Idris Foughali
5f09dff5d3 Merge cf16a29ad3 into 970f2bd4ed 2025-12-09 17:35:15 +01:00
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
ifoughali
cf16a29ad3 Style: removed comment 2025-12-05 15:24:35 +01:00
ifoughali
544c97d923 XMerge branch 'closes-20817-Fix-datasource-sync-broken-when-cron-is-set' of https://github.com/ifoughal/netbox into closes-20817-Fix-datasource-sync-broken-when-cron-is-set 2025-12-05 15:23:43 +01:00
ifoughali
77ee6baa23 refactor: moved status update logic from clean() to save() method 2025-12-05 15:23:38 +01:00
Idris Foughali
09d1049267 Merge branch 'netbox-community:main' into closes-20817-Fix-datasource-sync-broken-when-cron-is-set 2025-12-05 14:51:56 +01:00
Idris Foughali
93e5f919ba Merge branch 'netbox-community:main' into closes-20817-Fix-datasource-sync-broken-when-cron-is-set 2025-12-01 10:07:15 +01:00
ifoughali
929d024003 Merge branch 'closes-20817-Fix-datasource-sync-broken-when-cron-is-set' of https://github.com/ifoughal/netbox into closes-20817-Fix-datasource-sync-broken-when-cron-is-set 2025-11-26 09:00:22 +01:00
ifoughali
e4b614038e revert: re-added queued status set for datasource object 2025-11-26 09:00:17 +01:00
Idris Foughali
3016b1d90b Merge branch 'netbox-community:main' into closes-20817-Fix-datasource-sync-broken-when-cron-is-set 2025-11-26 08:55:12 +01:00
ifoughali
57b47dc1ea style: use != instead of not in for single SYNCING check 2025-11-26 08:05:20 +01:00
ifoughali
da4c669312 Feat: reworked status update logic 2025-11-20 11:27:39 +01:00
ifoughali
71f707b7ac Feat: removed SCHEDULED choice due to redundency with sync interval 2025-11-20 11:26:43 +01:00
ifoughali
e11508dd6c Fix: removed status update from the enqueue method 2025-11-20 10:50:35 +01:00
ifoughali
5b5b5c8909 Revert "Feat: set status as editable field"
This reverts commit b4160ad59b.
2025-11-19 20:18:59 +01:00
Idris Foughali
a49869af42 Feat: removed QUEUED from ready for sync condition 2025-11-19 19:01:01 +00:00
Idris Foughali
2e0ff04f84 Feat: added 2 states for DataSourceStatusChoices 2025-11-19 18:52:27 +00:00
Idris Foughali
bfeba36514 Feat: added status update during save method of DataSourceForm 2025-11-19 18:51:25 +00:00
Idris Foughali
111aca115b Feat: added clean method to set data-source state to Ready or scheduled 2025-11-19 18:51:01 +00:00
Idris Foughali
b4160ad59b Feat: set status as editable field 2025-11-19 18:49:47 +00:00
39 changed files with 7926 additions and 6855 deletions

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
"openapi": "3.0.3",
"info": {
"title": "NetBox REST API",
"version": "4.4.7",
"version": "4.4.8",
"license": {
"name": "Apache v2 License"
}
@@ -27326,6 +27326,58 @@
"explode": true,
"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",
"name": "type",
@@ -30798,6 +30850,58 @@
"explode": true,
"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",
"name": "type",
@@ -34158,6 +34262,58 @@
"explode": true,
"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",
"name": "updated_by_request",
@@ -46373,6 +46529,58 @@
"explode": true,
"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",
"name": "type",
@@ -52303,6 +52511,58 @@
"explode": true,
"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",
"name": "tx_power",
@@ -58814,6 +59074,58 @@
"explode": true,
"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",
"name": "updated_by_request",
@@ -66953,6 +67265,58 @@
"explode": true,
"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",
"name": "updated_by_request",
@@ -78840,6 +79204,58 @@
"explode": true,
"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",
"name": "type",
@@ -83976,6 +84392,58 @@
"explode": true,
"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",
"name": "type",
@@ -96759,6 +97227,58 @@
"explode": true,
"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",
"name": "type",

View File

@@ -1,5 +1,22 @@
# 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)
### Enhancements

View File

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

View File

@@ -16,6 +16,7 @@ from utilities.forms import get_field_value
from utilities.forms.fields import CommentField, JSONField
from utilities.forms.rendering import FieldSet
from utilities.forms.widgets import HTMXSelect
from core.choices import DataSourceStatusChoices
__all__ = (
'ConfigRevisionForm',
@@ -79,14 +80,28 @@ class DataSourceForm(NetBoxModelForm):
if self.instance and self.instance.parameters:
self.fields[field_name].initial = self.instance.parameters.get(name)
def save(self, *args, **kwargs):
def save(self, *args, **kwargs):
parameters = {}
for name in self.fields:
if name.startswith('backend_'):
parameters[name[8:]] = self.cleaned_data[name]
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)

View File

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

View File

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

View File

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

View File

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