From 4bd02ab6f9255899f7182ae34cda8f780f04afca Mon Sep 17 00:00:00 2001
From: wkoot <3715211+wkoot@users.noreply.github.com>
Date: Wed, 19 Feb 2025 22:58:55 +0100
Subject: [PATCH] Add bulk import and bulk edit (#60)
Closes #4
Signed-off-by: wkoot <3715211+wkoot@users.noreply.github.com>
---
CHANGELOG.md | 2 +-
netbox_slm/forms/__init__.py | 16 ++-
netbox_slm/forms/software_license.py | 83 ++++++++++---
netbox_slm/forms/software_product.py | 19 ++-
.../forms/software_product_installation.py | 38 ++++--
netbox_slm/forms/software_product_version.py | 42 ++++++-
netbox_slm/navigation.py | 8 +-
netbox_slm/tables.py | 1 +
.../templates/netbox_slm/softwarelicense.html | 8 +-
netbox_slm/urls.py | 113 ++----------------
netbox_slm/views/software_license.py | 36 +++---
netbox_slm/views/software_product.py | 36 +++---
.../views/software_product_installation.py | 36 +++---
netbox_slm/views/software_product_version.py | 36 +++---
14 files changed, 275 insertions(+), 199 deletions(-)
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