diff --git a/CHANGELOG.md b/CHANGELOG.md index 505f5aa..f834d79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ ### Added * Toggle to show plugin as top level menu item (#42) -* Bulk import except `LaxURLFields` (#4) +* Bulk import and bulk edit (#4) * Changelog with backdated changes (#51) * List filtering (#54) diff --git a/netbox_slm/forms/__init__.py b/netbox_slm/forms/__init__.py index 254091a..a8ddb1d 100644 --- a/netbox_slm/forms/__init__.py +++ b/netbox_slm/forms/__init__.py @@ -1,12 +1,24 @@ -from .software_license import SoftwareLicenseForm, SoftwareLicenseFilterForm, SoftwareLicenseBulkImportForm -from .software_product import SoftwareProductForm, SoftwareProductFilterForm, SoftwareProductBulkImportForm +from .software_license import ( + SoftwareLicenseForm, + SoftwareLicenseFilterForm, + SoftwareLicenseBulkImportForm, + SoftwareLicenseBulkEditForm, +) +from .software_product import ( + SoftwareProductForm, + SoftwareProductFilterForm, + SoftwareProductBulkImportForm, + SoftwareProductBulkEditForm, +) from .software_product_installation import ( SoftwareProductInstallationForm, SoftwareProductInstallationFilterForm, SoftwareProductInstallationBulkImportForm, + SoftwareProductInstallationBulkEditForm, ) from .software_product_version import ( SoftwareProductVersionForm, SoftwareProductVersionFilterForm, SoftwareProductVersionBulkImportForm, + SoftwareProductVersionBulkEditForm, ) diff --git a/netbox_slm/forms/software_license.py b/netbox_slm/forms/software_license.py index 88923a6..79ebdea 100644 --- a/netbox_slm/forms/software_license.py +++ b/netbox_slm/forms/software_license.py @@ -1,7 +1,7 @@ -from django.forms import CharField, DateField, ChoiceField +from django.forms import CharField, DateField, ChoiceField, IntegerField, NullBooleanField from django.urls import reverse_lazy -from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm +from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm, NetBoxModelBulkEditForm from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation, SoftwareLicense from utilities.forms.constants import BOOLEAN_WITH_BLANK_CHOICES from utilities.forms.fields import ( @@ -16,25 +16,22 @@ from utilities.forms.widgets import APISelect, DatePicker class SoftwareLicenseForm(NetBoxModelForm): - """Form for creating a new SoftwareLicense object.""" - comments = CommentField() stored_location_url = LaxURLField(required=False) + start_date = DateField(required=False, widget=DatePicker()) + expiration_date = DateField(required=False, widget=DatePicker()) software_product = DynamicModelChoiceField( queryset=SoftwareProduct.objects.all(), required=True, label="Software Product", - widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproduct-list")}), ) version = DynamicModelChoiceField( queryset=SoftwareProductVersion.objects.all(), required=False, widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductversion-list")}), - query_params={ - "software_product": "$software_product", - }, + query_params=dict(software_product="$software_product"), ) installation = DynamicModelChoiceField( queryset=SoftwareProductInstallation.objects.all(), @@ -42,12 +39,8 @@ class SoftwareLicenseForm(NetBoxModelForm): widget=APISelect( attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductinstallation-list")} ), - query_params={ - "software_product": "$software_product", - }, + query_params=dict(software_product="$software_product"), ) - start_date = DateField(required=False, widget=DatePicker()) - expiration_date = DateField(required=False, widget=DatePicker()) class Meta: model = SoftwareLicense @@ -112,6 +105,8 @@ class SoftwareLicenseFilterForm(NetBoxModelFilterSetForm): class SoftwareLicenseBulkImportForm(NetBoxModelImportForm): + support = NullBooleanField(required=False, help_text="Support (values other than 'True' and 'False' are ignored)") + class Meta: model = SoftwareLicense fields = ( @@ -119,6 +114,7 @@ class SoftwareLicenseBulkImportForm(NetBoxModelImportForm): "description", "software_product", "type", + "stored_location", "start_date", "expiration_date", "support", @@ -126,5 +122,64 @@ class SoftwareLicenseBulkImportForm(NetBoxModelImportForm): "version", "installation", "tags", - "comments", ) + + +class SoftwareLicenseBulkEditForm(NetBoxModelBulkEditForm): + model = SoftwareLicense + fieldsets = ( + FieldSet( + "type", + "stored_location", + "stored_location_url", + "start_date", + "expiration_date", + "support", + "license_amount", + "software_product", + "version", + "installation", + ), + ) + nullable_fields = ( + "type", + "stored_location", + "stored_location_url", + "start_date", + "expiration_date", + "support", + "license_amount", + "version", + "installation", + ) + + tag = TagFilterField(model) + comments = CommentField() + + type = CharField(required=False) + stored_location = CharField(required=False) + stored_location_url = LaxURLField(required=False) + start_date = DateField(required=False, widget=DatePicker()) + expiration_date = DateField(required=False, widget=DatePicker()) + support = ChoiceField(required=False, choices=BOOLEAN_WITH_BLANK_CHOICES) + license_amount = IntegerField(required=False, min_value=0) + + software_product = DynamicModelChoiceField( + queryset=SoftwareProduct.objects.all(), + required=False, + label="Software Product", + ) + version = DynamicModelChoiceField( + queryset=SoftwareProductVersion.objects.all(), + required=False, + widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductversion-list")}), + query_params=dict(software_product="$software_product"), + ) + installation = DynamicModelChoiceField( + queryset=SoftwareProductInstallation.objects.all(), + required=False, + widget=APISelect( + attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductinstallation-list")} + ), + query_params=dict(software_product="$software_product"), + ) diff --git a/netbox_slm/forms/software_product.py b/netbox_slm/forms/software_product.py index 59f1e02..1dc79f5 100644 --- a/netbox_slm/forms/software_product.py +++ b/netbox_slm/forms/software_product.py @@ -1,7 +1,7 @@ from django.forms import CharField from dcim.models import Manufacturer -from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm +from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm, NetBoxModelBulkEditForm from netbox_slm.models import SoftwareProduct from utilities.forms.fields import ( CommentField, @@ -13,8 +13,6 @@ from utilities.forms.rendering import FieldSet class SoftwareProductForm(NetBoxModelForm): - """Form for creating a new SoftwareProduct object.""" - comments = CommentField() manufacturer = DynamicModelChoiceField( @@ -60,5 +58,18 @@ class SoftwareProductBulkImportForm(NetBoxModelImportForm): "description", "manufacturer", "tags", - "comments", ) + + +class SoftwareProductBulkEditForm(NetBoxModelBulkEditForm): + model = SoftwareProduct + fieldsets = (FieldSet("manufacturer"),) + nullable_fields = ("manufacturer", "comments") + + tag = TagFilterField(model) + comments = CommentField() + + manufacturer = DynamicModelChoiceField( + queryset=Manufacturer.objects.all(), + required=False, + ) diff --git a/netbox_slm/forms/software_product_installation.py b/netbox_slm/forms/software_product_installation.py index e4c357c..8f3d372 100644 --- a/netbox_slm/forms/software_product_installation.py +++ b/netbox_slm/forms/software_product_installation.py @@ -2,7 +2,7 @@ from django.forms import ValidationError from django.urls import reverse_lazy from dcim.models import Device -from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm +from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm, NetBoxModelBulkEditForm from netbox_slm.models import SoftwareProductInstallation, SoftwareProduct, SoftwareProductVersion from utilities.forms.fields import ( CommentField, @@ -16,8 +16,6 @@ from virtualization.models import VirtualMachine, Cluster class SoftwareProductInstallationForm(NetBoxModelForm): - """Form for creating a new SoftwareProductInstallation object.""" - comments = CommentField() device = DynamicModelChoiceField(queryset=Device.objects.all(), required=False) @@ -31,15 +29,12 @@ class SoftwareProductInstallationForm(NetBoxModelForm): queryset=SoftwareProduct.objects.all(), required=True, label="Software Product", - widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproduct-list")}), ) version = DynamicModelChoiceField( queryset=SoftwareProductVersion.objects.all(), required=True, widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductversion-list")}), - query_params={ - "software_product": "$software_product", - }, + query_params=dict(software_product="$software_product"), ) class Meta: @@ -112,5 +107,32 @@ class SoftwareProductInstallationBulkImportForm(NetBoxModelImportForm): "software_product", "version", "tags", - "comments", ) + + +class SoftwareProductInstallationBulkEditForm(NetBoxModelBulkEditForm): + model = SoftwareProductInstallation + fieldsets = (FieldSet("device", "virtualmachine", "cluster", "software_product", "version"),) + nullable_fields = ("device", "virtualmachine", "cluster", "comments") + + tag = TagFilterField(model) + comments = CommentField() + + device = DynamicModelChoiceField(queryset=Device.objects.all(), required=False) + virtualmachine = DynamicModelChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + label="Virtual Machine", + ) + cluster = DynamicModelChoiceField(queryset=Cluster.objects.all(), required=False) + software_product = DynamicModelChoiceField( + queryset=SoftwareProduct.objects.all(), + required=False, + label="Software Product", + ) + version = DynamicModelChoiceField( + queryset=SoftwareProductVersion.objects.all(), + required=False, + widget=APISelect(attrs={"data-url": reverse_lazy("plugins-api:netbox_slm-api:softwareproductversion-list")}), + query_params=dict(software_product="$software_product"), + ) diff --git a/netbox_slm/forms/software_product_version.py b/netbox_slm/forms/software_product_version.py index 84ea0af..3510be3 100644 --- a/netbox_slm/forms/software_product_version.py +++ b/netbox_slm/forms/software_product_version.py @@ -2,7 +2,7 @@ from django.forms import DateField, CharField, MultipleChoiceField from django.urls import reverse_lazy from dcim.models import Manufacturer -from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm +from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm, NetBoxModelBulkEditForm from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareReleaseTypes from utilities.forms.fields import ( CommentField, @@ -15,8 +15,6 @@ from utilities.forms.widgets import APISelect, DatePicker class SoftwareProductVersionForm(NetBoxModelForm): - """Form for creating a new SoftwareProductVersion object.""" - comments = CommentField() release_date = DateField(required=False, widget=DatePicker()) @@ -76,6 +74,8 @@ class SoftwareProductVersionFilterForm(NetBoxModelFilterSetForm): class SoftwareProductVersionBulkImportForm(NetBoxModelImportForm): + release_type = CharField(help_text=f"Release type (possible values: {SoftwareReleaseTypes.values})") + class Meta: model = SoftwareProductVersion fields = ( @@ -88,5 +88,39 @@ class SoftwareProductVersionBulkImportForm(NetBoxModelImportForm): "file_checksum", "release_type", "tags", - "comments", ) + + +class SoftwareProductVersionBulkEditForm(NetBoxModelBulkEditForm): + model = SoftwareProductVersion + fieldsets = ( + FieldSet( + "release_date", + "documentation_url", + "end_of_support", + "filename", + "file_checksum", + "file_link", + "release_type", + "software_product", + ), + ) + nullable_fields = ("release_date", "documentation_url", "end_of_support", "filename", "file_checksum", "file_link") + + tag = TagFilterField(model) + comments = CommentField() + + release_date = DateField(required=False, widget=DatePicker()) + documentation_url = CharField(required=False) + end_of_support = DateField(required=False, widget=DatePicker()) + filename = CharField(required=False) + file_checksum = CharField(required=False) + file_link = CharField(required=False) + + release_type = MultipleChoiceField(required=False, choices=SoftwareReleaseTypes.choices) + + software_product = DynamicModelChoiceField( + queryset=SoftwareProduct.objects.all(), + required=False, + label="Software Product", + ) diff --git a/netbox_slm/navigation.py b/netbox_slm/navigation.py index 8bc921b..4d8b25f 100644 --- a/netbox_slm/navigation.py +++ b/netbox_slm/navigation.py @@ -16,7 +16,7 @@ slm_items = ( permissions=["netbox_slm.add_softwareproduct"], ), PluginMenuButton( - "plugins:netbox_slm:softwareproduct_import", + "plugins:netbox_slm:softwareproduct_bulk_import", "Import", "mdi mdi-upload", permissions=["netbox_slm.import_softwareproduct"], @@ -35,7 +35,7 @@ slm_items = ( permissions=["netbox_slm.add_softwareproductversion"], ), PluginMenuButton( - "plugins:netbox_slm:softwareproductversion_import", + "plugins:netbox_slm:softwareproductversion_bulk_import", "Import", "mdi mdi-upload", permissions=["netbox_slm.import_softwareproductversion"], @@ -54,7 +54,7 @@ slm_items = ( permissions=["netbox_slm.add_softwareproductinstallation"], ), PluginMenuButton( - "plugins:netbox_slm:softwareproductinstallation_import", + "plugins:netbox_slm:softwareproductinstallation_bulk_import", "Import", "mdi mdi-upload", permissions=["netbox_slm.import_softwareproductinstallation"], @@ -73,7 +73,7 @@ slm_items = ( permissions=["netbox_slm.add_softwarelicense"], ), PluginMenuButton( - "plugins:netbox_slm:softwarelicense_import", + "plugins:netbox_slm:softwarelicense_bulk_import", "Import", "mdi mdi-upload", permissions=["netbox_slm.import_softwarelicense"], diff --git a/netbox_slm/tables.py b/netbox_slm/tables.py index 12931f8..b263689 100644 --- a/netbox_slm/tables.py +++ b/netbox_slm/tables.py @@ -167,6 +167,7 @@ class SoftwareLicenseTable(NetBoxTable): default_columns = ( "pk", "name", + "type", "manufacturer", "software_product", "installation", diff --git a/netbox_slm/templates/netbox_slm/softwarelicense.html b/netbox_slm/templates/netbox_slm/softwarelicense.html index ced1c4d..61af371 100644 --- a/netbox_slm/templates/netbox_slm/softwarelicense.html +++ b/netbox_slm/templates/netbox_slm/softwarelicense.html @@ -20,6 +20,10 @@ Description {{ object.description }} + + Type + {{ object.type }} + Software Product {{ object.software_product|linkify }} @@ -32,10 +36,6 @@ Installation {{ object.installation|linkify }} - - Type - {{ object.type }} - Stored location {% if object.stored_location_url %} diff --git a/netbox_slm/urls.py b/netbox_slm/urls.py index 2c33a95..85c8392 100644 --- a/netbox_slm/urls.py +++ b/netbox_slm/urls.py @@ -1,106 +1,15 @@ -from django.urls import path +from django.urls import path, include -from netbox.views.generic import ObjectChangeLogView -from netbox_slm import views -from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation, SoftwareLicense +from netbox_slm import views # noqa F401 +from utilities.urls import get_model_urls urlpatterns = [ - # SoftwareProduct - path("software-products/", views.SoftwareProductListView.as_view(), name="softwareproduct_list"), - path("software-products/add/", views.SoftwareProductEditView.as_view(), name="softwareproduct_add"), - path( - "software-products/delete/", views.SoftwareProductBulkDeleteView.as_view(), name="softwareproduct_bulk_delete" - ), - path("software-products/import/", views.SoftwareProductBulkImportView.as_view(), name="softwareproduct_import"), - path("software-products//", views.SoftwareProductView.as_view(), name="softwareproduct"), - path( - "software-products//delete/", views.SoftwareProductDeleteView.as_view(), name="softwareproduct_delete" - ), - path("software-products//edit/", views.SoftwareProductEditView.as_view(), name="softwareproduct_edit"), - path( - "software-products//changelog/", - ObjectChangeLogView.as_view(), - name="softwareproduct_changelog", - kwargs={"model": SoftwareProduct}, - ), - # SoftwareProductVersion - path("versions/", views.SoftwareProductVersionListView.as_view(), name="softwareproductversion_list"), - path("versions/add/", views.SoftwareProductVersionEditView.as_view(), name="softwareproductversion_add"), - path( - "versions/delete/", - views.SoftwareProductVersionBulkDeleteView.as_view(), - name="softwareproductversion_bulk_delete", - ), - path( - "versions/import/", views.SoftwareProductVersionBulkImportView.as_view(), name="softwareproductversion_import" - ), - path("versions//", views.SoftwareProductVersionView.as_view(), name="softwareproductversion"), - path( - "versions//delete/", - views.SoftwareProductVersionDeleteView.as_view(), - name="softwareproductversion_delete", - ), - path("versions//edit/", views.SoftwareProductVersionEditView.as_view(), name="softwareproductversion_edit"), - path( - "versions//changelog/", - ObjectChangeLogView.as_view(), - name="softwareproductversion_changelog", - kwargs={"model": SoftwareProductVersion}, - ), - # SoftwareProductInstallation - path( - "installations/", - views.SoftwareProductInstallationListView.as_view(), - name="softwareproductinstallation_list", - ), - path( - "installations/add/", - views.SoftwareProductInstallationEditView.as_view(), - name="softwareproductinstallation_add", - ), - path( - "installations/delete/", - views.SoftwareProductInstallationBulkDeleteView.as_view(), - name="softwareproductinstallation_bulk_delete", - ), - path( - "installations/import/", - views.SoftwareProductInstallationBulkImportView.as_view(), - name="softwareproductinstallation_import", - ), - path( - "installations//", - views.SoftwareProductInstallationView.as_view(), - name="softwareproductinstallation", - ), - path( - "installations//delete/", - views.SoftwareProductInstallationDeleteView.as_view(), - name="softwareproductinstallation_delete", - ), - path( - "installations//edit/", - views.SoftwareProductInstallationEditView.as_view(), - name="softwareproductinstallation_edit", - ), - path( - "installations//changelog/", - ObjectChangeLogView.as_view(), - name="softwareproductinstallation_changelog", - kwargs={"model": SoftwareProductInstallation}, - ), - # SoftwareLicense - path("licenses/", views.SoftwareLicenseListView.as_view(), name="softwarelicense_list"), - path("licenses/add/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_add"), - path("licenses/delete/", views.SoftwareLicenseBulkDeleteView.as_view(), name="softwarelicense_bulk_delete"), - path("licenses/import/", views.SoftwareLicenseBulkImportView.as_view(), name="softwarelicense_import"), - path("licenses//", views.SoftwareLicenseView.as_view(), name="softwarelicense"), - path("licenses//delete/", views.SoftwareLicenseDeleteView.as_view(), name="softwarelicense_delete"), - path("licenses//edit/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_edit"), - path( - "licenses//changelog/", - ObjectChangeLogView.as_view(), - name="softwarelicense_changelog", - kwargs={"model": SoftwareLicense}, - ), + path("software-products/", include(get_model_urls("netbox_slm", "softwareproduct", detail=False))), + path("software-products//", include(get_model_urls("netbox_slm", "softwareproduct"))), + path("versions/", include(get_model_urls("netbox_slm", "softwareproductversion", detail=False))), + path("versions//", include(get_model_urls("netbox_slm", "softwareproductversion"))), + path("installations/", include(get_model_urls("netbox_slm", "softwareproductinstallation", detail=False))), + path("installations//", include(get_model_urls("netbox_slm", "softwareproductinstallation"))), + path("licenses/", include(get_model_urls("netbox_slm", "softwarelicense", detail=False))), + path("licenses//", include(get_model_urls("netbox_slm", "softwarelicense"))), ] diff --git a/netbox_slm/views/software_license.py b/netbox_slm/views/software_license.py index eca9dcc..4eb3716 100644 --- a/netbox_slm/views/software_license.py +++ b/netbox_slm/views/software_license.py @@ -1,42 +1,50 @@ from netbox.views import generic from netbox_slm import filtersets, forms, tables from netbox_slm.models import SoftwareLicense +from utilities.views import register_model_view +@register_model_view(SoftwareLicense, "list", path="", detail=False) class SoftwareLicenseListView(generic.ObjectListView): - """View for listing all existing SoftwareLicenses.""" - queryset = SoftwareLicense.objects.all() filterset = filtersets.SoftwareLicenseFilterSet filterset_form = forms.SoftwareLicenseFilterForm table = tables.SoftwareLicenseTable +@register_model_view(SoftwareLicense) class SoftwareLicenseView(generic.ObjectView): - """Display SoftwareLicense details""" - queryset = SoftwareLicense.objects.all() +@register_model_view(SoftwareLicense, "add", detail=False) +@register_model_view(SoftwareLicense, "edit") class SoftwareLicenseEditView(generic.ObjectEditView): - """View for editing and creating a SoftwareLicense instance.""" - queryset = SoftwareLicense.objects.all() form = forms.SoftwareLicenseForm +@register_model_view(SoftwareLicense, "delete") class SoftwareLicenseDeleteView(generic.ObjectDeleteView): - """View for deleting a SoftwareLicense instance""" - queryset = SoftwareLicense.objects.all() -class SoftwareLicenseBulkDeleteView(generic.BulkDeleteView): - queryset = SoftwareLicense.objects.all() - table = tables.SoftwareLicenseTable - - +@register_model_view(SoftwareLicense, "bulk_import", detail=False) class SoftwareLicenseBulkImportView(generic.BulkImportView): queryset = SoftwareLicense.objects.all() - table = tables.SoftwareLicenseTable model_form = forms.SoftwareLicenseBulkImportForm + + +@register_model_view(SoftwareLicense, "bulk_edit", path="edit", detail=False) +class SoftwareLicenseBulkEditView(generic.BulkEditView): + queryset = SoftwareLicense.objects.all() + filterset = filtersets.SoftwareLicenseFilterSet + table = tables.SoftwareLicenseTable + form = forms.SoftwareLicenseBulkEditForm + + +@register_model_view(SoftwareLicense, "bulk_delete", path="delete", detail=False) +class SoftwareLicenseBulkDeleteView(generic.BulkDeleteView): + queryset = SoftwareLicense.objects.all() + filterset = filtersets.SoftwareLicenseFilterSet + table = tables.SoftwareLicenseTable diff --git a/netbox_slm/views/software_product.py b/netbox_slm/views/software_product.py index 622d3ec..c4920f3 100644 --- a/netbox_slm/views/software_product.py +++ b/netbox_slm/views/software_product.py @@ -1,20 +1,19 @@ from netbox.views import generic from netbox_slm import filtersets, forms, tables from netbox_slm.models import SoftwareProduct +from utilities.views import register_model_view +@register_model_view(SoftwareProduct, "list", path="", detail=False) class SoftwareProductListView(generic.ObjectListView): - """View for listing all existing SoftwareProducts.""" - queryset = SoftwareProduct.objects.all() filterset = filtersets.SoftwareProductFilterSet filterset_form = forms.SoftwareProductFilterForm table = tables.SoftwareProductTable +@register_model_view(SoftwareProduct) class SoftwareProductView(generic.ObjectView): - """Display SoftwareProduct details""" - queryset = SoftwareProduct.objects.all() def get_extra_context(self, request, instance): @@ -22,25 +21,34 @@ class SoftwareProductView(generic.ObjectView): return {"versions": versions} +@register_model_view(SoftwareProduct, "add", detail=False) +@register_model_view(SoftwareProduct, "edit") class SoftwareProductEditView(generic.ObjectEditView): - """View for editing and creating a SoftwareProduct instance.""" - queryset = SoftwareProduct.objects.all() form = forms.SoftwareProductForm +@register_model_view(SoftwareProduct, "delete") class SoftwareProductDeleteView(generic.ObjectDeleteView): - """View for deleting a SoftwareProduct instance""" - queryset = SoftwareProduct.objects.all() -class SoftwareProductBulkDeleteView(generic.BulkDeleteView): - queryset = SoftwareProduct.objects.all() - table = tables.SoftwareProductTable - - +@register_model_view(SoftwareProduct, "bulk_import", detail=False) class SoftwareProductBulkImportView(generic.BulkImportView): queryset = SoftwareProduct.objects.all() - table = tables.SoftwareProductTable model_form = forms.SoftwareProductBulkImportForm + + +@register_model_view(SoftwareProduct, "bulk_edit", path="edit", detail=False) +class SoftwareProductBulkEditView(generic.BulkEditView): + queryset = SoftwareProduct.objects.all() + filterset = filtersets.SoftwareProductFilterSet + table = tables.SoftwareProductTable + form = forms.SoftwareProductBulkEditForm + + +@register_model_view(SoftwareProduct, "bulk_delete", path="delete", detail=False) +class SoftwareProductBulkDeleteView(generic.BulkDeleteView): + queryset = SoftwareProduct.objects.all() + filterset = filtersets.SoftwareProductFilterSet + table = tables.SoftwareProductTable diff --git a/netbox_slm/views/software_product_installation.py b/netbox_slm/views/software_product_installation.py index c5eb407..c574739 100644 --- a/netbox_slm/views/software_product_installation.py +++ b/netbox_slm/views/software_product_installation.py @@ -1,42 +1,50 @@ from netbox.views import generic from netbox_slm import filtersets, forms, tables from netbox_slm.models import SoftwareProductInstallation +from utilities.views import register_model_view +@register_model_view(SoftwareProductInstallation, "list", path="", detail=False) class SoftwareProductInstallationListView(generic.ObjectListView): - """View for listing all existing SoftwareProductInstallations.""" - queryset = SoftwareProductInstallation.objects.all() filterset = filtersets.SoftwareProductInstallationFilterSet filterset_form = forms.SoftwareProductInstallationFilterForm table = tables.SoftwareProductInstallationTable +@register_model_view(SoftwareProductInstallation) class SoftwareProductInstallationView(generic.ObjectView): - """Display SoftwareProductInstallation details""" - queryset = SoftwareProductInstallation.objects.all() +@register_model_view(SoftwareProductInstallation, "add", detail=False) +@register_model_view(SoftwareProductInstallation, "edit") class SoftwareProductInstallationEditView(generic.ObjectEditView): - """View for editing and creating a SoftwareProductInstallation instance.""" - queryset = SoftwareProductInstallation.objects.all() form = forms.SoftwareProductInstallationForm +@register_model_view(SoftwareProductInstallation, "delete") class SoftwareProductInstallationDeleteView(generic.ObjectDeleteView): - """View for deleting a SoftwareProductInstallation instance""" - queryset = SoftwareProductInstallation.objects.all() -class SoftwareProductInstallationBulkDeleteView(generic.BulkDeleteView): - queryset = SoftwareProductInstallation.objects.all() - table = tables.SoftwareProductInstallationTable - - +@register_model_view(SoftwareProductInstallation, "bulk_import", detail=False) class SoftwareProductInstallationBulkImportView(generic.BulkImportView): queryset = SoftwareProductInstallation.objects.all() - table = tables.SoftwareProductInstallationTable model_form = forms.SoftwareProductInstallationBulkImportForm + + +@register_model_view(SoftwareProductInstallation, "bulk_edit", path="edit", detail=False) +class SoftwareProductInstallationBulkEditView(generic.BulkEditView): + queryset = SoftwareProductInstallation.objects.all() + filterset = filtersets.SoftwareProductInstallationFilterSet + table = tables.SoftwareProductInstallationTable + form = forms.SoftwareProductInstallationBulkEditForm + + +@register_model_view(SoftwareProductInstallation, "bulk_delete", path="delete", detail=False) +class SoftwareProductInstallationBulkDeleteView(generic.BulkDeleteView): + queryset = SoftwareProductInstallation.objects.all() + filterset = filtersets.SoftwareProductInstallationFilterSet + table = tables.SoftwareProductInstallationTable diff --git a/netbox_slm/views/software_product_version.py b/netbox_slm/views/software_product_version.py index c495ae7..940fe5d 100644 --- a/netbox_slm/views/software_product_version.py +++ b/netbox_slm/views/software_product_version.py @@ -1,20 +1,19 @@ from netbox.views import generic from netbox_slm import filtersets, forms, tables from netbox_slm.models import SoftwareProductVersion +from utilities.views import register_model_view +@register_model_view(SoftwareProductVersion, "list", path="", detail=False) class SoftwareProductVersionListView(generic.ObjectListView): - """View for listing all existing SoftwareProductVersions.""" - queryset = SoftwareProductVersion.objects.all() filterset = filtersets.SoftwareProductVersionFilterSet filterset_form = forms.SoftwareProductVersionFilterForm table = tables.SoftwareProductVersionTable +@register_model_view(SoftwareProductVersion) class SoftwareProductVersionView(generic.ObjectView): - """Display SoftwareProductVersion details""" - queryset = SoftwareProductVersion.objects.all() def get_extra_context(self, request, instance): @@ -22,25 +21,34 @@ class SoftwareProductVersionView(generic.ObjectView): return {"installations": installation_count} +@register_model_view(SoftwareProductVersion, "add", detail=False) +@register_model_view(SoftwareProductVersion, "edit") class SoftwareProductVersionEditView(generic.ObjectEditView): - """View for editing and creating a SoftwareProductVersion instance.""" - queryset = SoftwareProductVersion.objects.all() form = forms.SoftwareProductVersionForm +@register_model_view(SoftwareProductVersion, "delete") class SoftwareProductVersionDeleteView(generic.ObjectDeleteView): - """View for deleting a SoftwareProductVersion instance""" - queryset = SoftwareProductVersion.objects.all() -class SoftwareProductVersionBulkDeleteView(generic.BulkDeleteView): - queryset = SoftwareProductVersion.objects.all() - table = tables.SoftwareProductVersionTable - - +@register_model_view(SoftwareProductVersion, "bulk_import", detail=False) class SoftwareProductVersionBulkImportView(generic.BulkImportView): queryset = SoftwareProductVersion.objects.all() - table = tables.SoftwareProductVersionTable model_form = forms.SoftwareProductVersionBulkImportForm + + +@register_model_view(SoftwareProductVersion, "bulk_edit", path="edit", detail=False) +class SoftwareProductVersionBulkEditView(generic.BulkEditView): + queryset = SoftwareProductVersion.objects.all() + filterset = filtersets.SoftwareProductVersionFilterSet + table = tables.SoftwareProductVersionTable + form = forms.SoftwareProductVersionBulkEditForm + + +@register_model_view(SoftwareProductVersion, "bulk_delete", path="delete", detail=False) +class SoftwareProductVersionBulkDeleteView(generic.BulkDeleteView): + queryset = SoftwareProductVersion.objects.all() + filterset = filtersets.SoftwareProductVersionFilterSet + table = tables.SoftwareProductVersionTable