From b4160ad59bdc1057b9761b7c5457afd9bcd754c3 Mon Sep 17 00:00:00 2001 From: Idris Foughali Date: Wed, 19 Nov 2025 18:49:47 +0000 Subject: [PATCH 1/9] Feat: set status as editable field --- netbox/core/models/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 52a11c58ee3..4ad9d986bea 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -53,7 +53,7 @@ class DataSource(JobsMixin, PrimaryModel): max_length=50, choices=DataSourceStatusChoices, default=DataSourceStatusChoices.NEW, - editable=False + editable=True ) enabled = models.BooleanField( verbose_name=_('enabled'), From 111aca115b87c63d9cd02c84c120b3f796543294 Mon Sep 17 00:00:00 2001 From: Idris Foughali Date: Wed, 19 Nov 2025 18:51:01 +0000 Subject: [PATCH 2/9] Feat: added clean method to set data-source state to Ready or scheduled --- netbox/core/forms/model_forms.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 52c68fd7930..f32073726da 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -16,6 +16,7 @@ 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,6 +80,13 @@ def __init__(self, *args, **kwargs): if self.instance and self.instance.parameters: self.fields[field_name].initial = self.instance.parameters.get(name) + def clean(self): + super().clean() + if not self.data.get('sync_interval'): + self.cleaned_data['status'] = DataSourceStatusChoices.READY + else: + self.cleaned_data['status'] = DataSourceStatusChoices.SCHEDULED + def save(self, *args, **kwargs): parameters = {} From bfeba365142c749fb6916482318cf4f7181998e3 Mon Sep 17 00:00:00 2001 From: Idris Foughali Date: Wed, 19 Nov 2025 18:51:25 +0000 Subject: [PATCH 3/9] Feat: added status update during save method of DataSourceForm --- netbox/core/forms/model_forms.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index f32073726da..a4783d26853 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -95,6 +95,11 @@ def save(self, *args, **kwargs): parameters[name[8:]] = self.cleaned_data[name] self.instance.parameters = parameters + self.instance.status = self.cleaned_data['status'] + # we need to save the instance here, due to the broken super.save method not saving the status field + # correctly & would require to posts on the data-source object + self.instance.save() + return super().save(*args, **kwargs) From 2e0ff04f847374208e81995720410e8df43105ed Mon Sep 17 00:00:00 2001 From: Idris Foughali Date: Wed, 19 Nov 2025 18:52:27 +0000 Subject: [PATCH 4/9] Feat: added 2 states for DataSourceStatusChoices --- netbox/core/choices.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 6603a7d4f77..6bc1fa2f899 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -13,6 +13,8 @@ class DataSourceStatusChoices(ChoiceSet): SYNCING = 'syncing' COMPLETED = 'completed' FAILED = 'failed' + SCHEDULED = 'scheduled' + READY = 'ready' CHOICES = ( (NEW, _('New'), 'blue'), @@ -20,6 +22,8 @@ class DataSourceStatusChoices(ChoiceSet): (SYNCING, _('Syncing'), 'cyan'), (COMPLETED, _('Completed'), 'green'), (FAILED, _('Failed'), 'red'), + (SCHEDULED, _('Scheduled'), 'gray'), + (READY, _('Ready'), 'green'), ) From a49869af420f35c08bed30e6e59492fe4d5d230f Mon Sep 17 00:00:00 2001 From: Idris Foughali Date: Wed, 19 Nov 2025 19:01:01 +0000 Subject: [PATCH 5/9] Feat: removed QUEUED from ready for sync condition --- netbox/core/models/data.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 4ad9d986bea..2c43955042b 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -112,7 +112,6 @@ def backend_class(self): @property def ready_for_sync(self): return self.enabled and self.status not in ( - DataSourceStatusChoices.QUEUED, DataSourceStatusChoices.SYNCING ) From 5b5b5c8909a724a2ce20e42a8f21a91051c78f4d Mon Sep 17 00:00:00 2001 From: ifoughali Date: Wed, 19 Nov 2025 20:18:59 +0100 Subject: [PATCH 6/9] Revert "Feat: set status as editable field" This reverts commit b4160ad59bdc1057b9761b7c5457afd9bcd754c3. --- netbox/core/models/data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 2c43955042b..6cfb1bf8d94 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -53,7 +53,7 @@ class DataSource(JobsMixin, PrimaryModel): max_length=50, choices=DataSourceStatusChoices, default=DataSourceStatusChoices.NEW, - editable=True + editable=False ) enabled = models.BooleanField( verbose_name=_('enabled'), From e11508dd6c31e357ce69f73ed8f8c8582599f695 Mon Sep 17 00:00:00 2001 From: ifoughali Date: Thu, 20 Nov 2025 10:50:35 +0100 Subject: [PATCH 7/9] Fix: removed status update from the enqueue method --- netbox/core/jobs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index 8b516e6604a..db596366914 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -31,7 +31,6 @@ def enqueue(cls, *args, **kwargs): # Update the DataSource's synchronization status to queued if datasource := job.object: - datasource.status = DataSourceStatusChoices.QUEUED DataSource.objects.filter(pk=datasource.pk).update(status=datasource.status) return job From 71f707b7ac649c9157f57b5eeb75e5f44dd95e66 Mon Sep 17 00:00:00 2001 From: ifoughali Date: Thu, 20 Nov 2025 11:26:43 +0100 Subject: [PATCH 8/9] Feat: removed SCHEDULED choice due to redundency with sync interval --- netbox/core/choices.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 6bc1fa2f899..34d1460173f 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -13,7 +13,6 @@ class DataSourceStatusChoices(ChoiceSet): SYNCING = 'syncing' COMPLETED = 'completed' FAILED = 'failed' - SCHEDULED = 'scheduled' READY = 'ready' CHOICES = ( @@ -22,7 +21,6 @@ class DataSourceStatusChoices(ChoiceSet): (SYNCING, _('Syncing'), 'cyan'), (COMPLETED, _('Completed'), 'green'), (FAILED, _('Failed'), 'red'), - (SCHEDULED, _('Scheduled'), 'gray'), (READY, _('Ready'), 'green'), ) From da4c6693122f627a5c0121650c3af7b7db877d8c Mon Sep 17 00:00:00 2001 From: ifoughali Date: Thu, 20 Nov 2025 11:27:39 +0100 Subject: [PATCH 9/9] Feat: reworked status update logic --- netbox/core/forms/model_forms.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index a4783d26853..74c2880669e 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -82,23 +82,21 @@ def __init__(self, *args, **kwargs): def clean(self): super().clean() - if not self.data.get('sync_interval'): - self.cleaned_data['status'] = DataSourceStatusChoices.READY + if not self.instance.pk: + self.cleaned_data['status'] = DataSourceStatusChoices.NEW else: - self.cleaned_data['status'] = DataSourceStatusChoices.SCHEDULED + if not self.data.get('sync_interval'): + self.cleaned_data['status'] = DataSourceStatusChoices.READY 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 - self.instance.status = self.cleaned_data['status'] - # we need to save the instance here, due to the broken super.save method not saving the status field - # correctly & would require to posts on the data-source object - self.instance.save() + # update status + self.instance.status = self.cleaned_data.get('status', self.instance.status) return super().save(*args, **kwargs)