diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 6b516048c..c2330db81 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -12,23 +12,37 @@ __all__ = ( class DataSourceSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datasource-detail') - type = ChoiceField(choices=DataSourceTypeChoices, required=False) + url = serializers.HyperlinkedIdentityField( + view_name='core-api:datasource-detail' + ) + type = ChoiceField( + choices=DataSourceTypeChoices + ) + status = ChoiceField( + choices=DataSourceStatusChoices, + read_only=True + ) # Related object counts - file_count = serializers.IntegerField(read_only=True) + file_count = serializers.IntegerField( + read_only=True + ) class Meta: model = DataSource fields = [ - 'id', 'url', 'display', 'name', 'type', 'url', 'enabled', 'description', 'git_branch', 'ignore_rules', - 'username', 'password', 'created', 'last_updated', 'file_count', + 'id', 'url', 'display', 'name', 'type', 'url', 'enabled', 'status', 'description', 'git_branch', + 'ignore_rules', 'username', 'password', 'created', 'last_updated', 'file_count', ] class DataFileSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='core-api:datafile-detail') - source = NestedDataSourceSerializer(read_only=True) + url = serializers.HyperlinkedIdentityField( + view_name='core-api:datafile-detail' + ) + source = NestedDataSourceSerializer( + read_only=True + ) class Meta: model = DataFile diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 809a15858..c369efe7c 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -13,9 +13,24 @@ class DataSourceTypeChoices(ChoiceSet): FTP = 'ftp' GIT = 'git' - CHOICES = [ + CHOICES = ( (LOCAL, _('Local')), (HTTP, _('HTTP(S)')), (FTP, _('FTP(S)')), (GIT, _('Git')), - ] + ) + + +class DataSourceStatusChoices(ChoiceSet): + + NEW = 'new' + SYNCING = 'syncing' + COMPLETED = 'completed' + FAILED = 'failed' + + CHOICES = ( + (NEW, _('New')), + (SYNCING, _('Syncing')), + (COMPLETED, _('Completed')), + (FAILED, _('Failed')), + ) diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 531551d4b..7bcab60af 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -15,7 +15,7 @@ class DataSourceFilterSet(django_filters.FilterSet): class Meta: model = DataSource - fields = ('id', 'name', 'type', 'git_branch', 'username') + fields = ('id', 'name', 'type', 'enabled', 'status', 'git_branch', 'username') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index eda7719a9..8f0e98d8d 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -3,7 +3,9 @@ from django import forms from core.choices import * from core.models import * from netbox.forms import NetBoxModelFilterSetForm -from utilities.forms import DynamicModelMultipleChoiceField, MultipleChoiceField +from utilities.forms import ( + BOOLEAN_WITH_BLANK_CHOICES, DynamicModelMultipleChoiceField, MultipleChoiceField, StaticSelect, +) __all__ = ( 'DataFileFilterForm', @@ -46,6 +48,16 @@ class DataFileFilterForm(NetBoxModelFilterSetForm): choices=DataSourceTypeChoices, required=False ) + enabled = forms.NullBooleanField( + required=False, + widget=StaticSelect( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + status = MultipleChoiceField( + choices=DataSourceStatusChoices, + required=False + ) git_branch = forms.CharField( max_length=100, required=False diff --git a/netbox/core/migrations/0004_datasource_status.py b/netbox/core/migrations/0004_datasource_status.py new file mode 100644 index 000000000..4c5a543b7 --- /dev/null +++ b/netbox/core/migrations/0004_datasource_status.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.5 on 2023-01-27 14:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0003_datasource_created_datasource_last_updated'), + ] + + operations = [ + migrations.AddField( + model_name='datasource', + name='status', + field=models.CharField(default='new', editable=False, max_length=50), + ), + ] diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 2f6127087..aa16d4765 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -40,6 +40,12 @@ class DataSource(ChangeLoggedModel): max_length=200, verbose_name=_('URL') ) + status = models.CharField( + max_length=50, + choices=DataSourceStatusChoices, + default=DataSourceStatusChoices.NEW, + editable=False + ) enabled = models.BooleanField( default=True ) diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index a85a1ffb4..797519da6 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -19,6 +19,10 @@ Type {{ object.get_type_display }} + + Status + {{ object.get_status_display }} + Enabled {% checkmark object.enabled %}