Implement bulk imports and edits for SLM models (#46)
Partially implements #4 Based on @erichester76's https://github.com/ICTU/netbox_slm/pull/44 Signed-off-by: wkoot <3715211+wkoot@users.noreply.github.com> Co-authored-by: Eric Hester <eric.hester@umbrella.tech>
This commit is contained in:
@@ -1,4 +1,12 @@
|
|||||||
from .software_license import SoftwareLicenseForm, SoftwareLicenseFilterForm
|
from .software_license import SoftwareLicenseForm, SoftwareLicenseFilterForm, SoftwareLicenseBulkImportForm
|
||||||
from .software_product import SoftwareProductForm, SoftwareProductFilterForm
|
from .software_product import SoftwareProductForm, SoftwareProductFilterForm, SoftwareProductBulkImportForm
|
||||||
from .software_product_installation import SoftwareProductInstallationForm, SoftwareProductInstallationFilterForm
|
from .software_product_installation import (
|
||||||
from .software_product_version import SoftwareProductVersionForm, SoftwareProductVersionFilterForm
|
SoftwareProductInstallationForm,
|
||||||
|
SoftwareProductInstallationFilterForm,
|
||||||
|
SoftwareProductInstallationBulkImportForm,
|
||||||
|
)
|
||||||
|
from .software_product_version import (
|
||||||
|
SoftwareProductVersionForm,
|
||||||
|
SoftwareProductVersionFilterForm,
|
||||||
|
SoftwareProductVersionBulkImportForm,
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from django.forms import DateField
|
from django.forms import DateField
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm
|
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
|
||||||
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation, SoftwareLicense
|
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation, SoftwareLicense
|
||||||
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField, LaxURLField
|
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField, LaxURLField
|
||||||
from utilities.forms.rendering import FieldSet
|
from utilities.forms.rendering import FieldSet
|
||||||
@@ -46,6 +46,7 @@ class SoftwareLicenseForm(NetBoxModelForm):
|
|||||||
fields = (
|
fields = (
|
||||||
"name",
|
"name",
|
||||||
"description",
|
"description",
|
||||||
|
"software_product",
|
||||||
"type",
|
"type",
|
||||||
"stored_location",
|
"stored_location",
|
||||||
"stored_location_url",
|
"stored_location_url",
|
||||||
@@ -53,7 +54,6 @@ class SoftwareLicenseForm(NetBoxModelForm):
|
|||||||
"expiration_date",
|
"expiration_date",
|
||||||
"support",
|
"support",
|
||||||
"license_amount",
|
"license_amount",
|
||||||
"software_product",
|
|
||||||
"version",
|
"version",
|
||||||
"installation",
|
"installation",
|
||||||
"tags",
|
"tags",
|
||||||
@@ -65,3 +65,22 @@ class SoftwareLicenseFilterForm(NetBoxModelFilterSetForm):
|
|||||||
model = SoftwareLicense
|
model = SoftwareLicense
|
||||||
fieldsets = (FieldSet(None, ("q", "tag")),)
|
fieldsets = (FieldSet(None, ("q", "tag")),)
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareLicenseBulkImportForm(NetBoxModelImportForm):
|
||||||
|
class Meta:
|
||||||
|
model = SoftwareLicense
|
||||||
|
fields = (
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"software_product",
|
||||||
|
"type",
|
||||||
|
"start_date",
|
||||||
|
"expiration_date",
|
||||||
|
"support",
|
||||||
|
"license_amount",
|
||||||
|
"version",
|
||||||
|
"installation",
|
||||||
|
"tags",
|
||||||
|
"comments",
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from dcim.models import Manufacturer
|
from dcim.models import Manufacturer
|
||||||
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm
|
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
|
||||||
from netbox_slm.models import SoftwareProduct
|
from netbox_slm.models import SoftwareProduct
|
||||||
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
||||||
from utilities.forms.rendering import FieldSet
|
from utilities.forms.rendering import FieldSet
|
||||||
@@ -30,3 +30,15 @@ class SoftwareProductFilterForm(NetBoxModelFilterSetForm):
|
|||||||
model = SoftwareProduct
|
model = SoftwareProduct
|
||||||
fieldsets = (FieldSet(None, ("q", "tag")),)
|
fieldsets = (FieldSet(None, ("q", "tag")),)
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductBulkImportForm(NetBoxModelImportForm):
|
||||||
|
class Meta:
|
||||||
|
model = SoftwareProduct
|
||||||
|
fields = (
|
||||||
|
"name",
|
||||||
|
"description",
|
||||||
|
"manufacturer",
|
||||||
|
"tags",
|
||||||
|
"comments",
|
||||||
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from django.forms import ValidationError
|
|||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from dcim.models import Device
|
from dcim.models import Device
|
||||||
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm
|
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
|
||||||
from netbox_slm.models import SoftwareProductInstallation, SoftwareProduct, SoftwareProductVersion
|
from netbox_slm.models import SoftwareProductInstallation, SoftwareProduct, SoftwareProductVersion
|
||||||
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
||||||
from utilities.forms.rendering import FieldSet
|
from utilities.forms.rendering import FieldSet
|
||||||
@@ -59,3 +59,17 @@ class SoftwareProductInstallationFilterForm(NetBoxModelFilterSetForm):
|
|||||||
model = SoftwareProductInstallation
|
model = SoftwareProductInstallation
|
||||||
fieldsets = (FieldSet(None, ("q", "tag")),)
|
fieldsets = (FieldSet(None, ("q", "tag")),)
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductInstallationBulkImportForm(NetBoxModelImportForm):
|
||||||
|
class Meta:
|
||||||
|
model = SoftwareProductInstallation
|
||||||
|
fields = (
|
||||||
|
"device",
|
||||||
|
"virtualmachine",
|
||||||
|
"cluster",
|
||||||
|
"software_product",
|
||||||
|
"version",
|
||||||
|
"tags",
|
||||||
|
"comments",
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from django.forms import DateField
|
from django.forms import DateField
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
|
|
||||||
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm
|
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
|
||||||
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion
|
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion
|
||||||
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
from utilities.forms.fields import CommentField, DynamicModelChoiceField, TagFilterField
|
||||||
from utilities.forms.rendering import FieldSet
|
from utilities.forms.rendering import FieldSet
|
||||||
@@ -25,6 +25,7 @@ class SoftwareProductVersionForm(NetBoxModelForm):
|
|||||||
model = SoftwareProductVersion
|
model = SoftwareProductVersion
|
||||||
fields = (
|
fields = (
|
||||||
"name",
|
"name",
|
||||||
|
"software_product",
|
||||||
"release_date",
|
"release_date",
|
||||||
"documentation_url",
|
"documentation_url",
|
||||||
"end_of_support",
|
"end_of_support",
|
||||||
@@ -32,7 +33,6 @@ class SoftwareProductVersionForm(NetBoxModelForm):
|
|||||||
"file_checksum",
|
"file_checksum",
|
||||||
"file_link",
|
"file_link",
|
||||||
"release_type",
|
"release_type",
|
||||||
"software_product",
|
|
||||||
"tags",
|
"tags",
|
||||||
"comments",
|
"comments",
|
||||||
)
|
)
|
||||||
@@ -42,3 +42,19 @@ class SoftwareProductVersionFilterForm(NetBoxModelFilterSetForm):
|
|||||||
model = SoftwareProductVersion
|
model = SoftwareProductVersion
|
||||||
fieldsets = (FieldSet(None, ("q", "tag")),)
|
fieldsets = (FieldSet(None, ("q", "tag")),)
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductVersionBulkImportForm(NetBoxModelImportForm):
|
||||||
|
class Meta:
|
||||||
|
model = SoftwareProductVersion
|
||||||
|
fields = (
|
||||||
|
"name",
|
||||||
|
"software_product",
|
||||||
|
"release_date",
|
||||||
|
"end_of_support",
|
||||||
|
"filename",
|
||||||
|
"file_checksum",
|
||||||
|
"release_type",
|
||||||
|
"tags",
|
||||||
|
"comments",
|
||||||
|
)
|
||||||
|
|||||||
@@ -15,6 +15,12 @@ slm_items = (
|
|||||||
"mdi mdi-plus-thick",
|
"mdi mdi-plus-thick",
|
||||||
permissions=["netbox_slm.add_softwareproduct"],
|
permissions=["netbox_slm.add_softwareproduct"],
|
||||||
),
|
),
|
||||||
|
PluginMenuButton(
|
||||||
|
"plugins:netbox_slm:softwareproduct_import",
|
||||||
|
"Import",
|
||||||
|
"mdi mdi-upload",
|
||||||
|
permissions=["netbox_slm.import_softwareproduct"],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PluginMenuItem(
|
PluginMenuItem(
|
||||||
@@ -28,6 +34,12 @@ slm_items = (
|
|||||||
"mdi mdi-plus-thick",
|
"mdi mdi-plus-thick",
|
||||||
permissions=["netbox_slm.add_softwareproductversion"],
|
permissions=["netbox_slm.add_softwareproductversion"],
|
||||||
),
|
),
|
||||||
|
PluginMenuButton(
|
||||||
|
"plugins:netbox_slm:softwareproductversion_import",
|
||||||
|
"Import",
|
||||||
|
"mdi mdi-upload",
|
||||||
|
permissions=["netbox_slm.import_softwareproductversion"],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PluginMenuItem(
|
PluginMenuItem(
|
||||||
@@ -41,6 +53,12 @@ slm_items = (
|
|||||||
"mdi mdi-plus-thick",
|
"mdi mdi-plus-thick",
|
||||||
permissions=["netbox_slm.add_softwareproductinstallation"],
|
permissions=["netbox_slm.add_softwareproductinstallation"],
|
||||||
),
|
),
|
||||||
|
PluginMenuButton(
|
||||||
|
"plugins:netbox_slm:softwareproductinstallation_import",
|
||||||
|
"Import",
|
||||||
|
"mdi mdi-upload",
|
||||||
|
permissions=["netbox_slm.import_softwareproductinstallation"],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PluginMenuItem(
|
PluginMenuItem(
|
||||||
@@ -54,6 +72,12 @@ slm_items = (
|
|||||||
"mdi mdi-plus-thick",
|
"mdi mdi-plus-thick",
|
||||||
permissions=["netbox_slm.add_softwarelicense"],
|
permissions=["netbox_slm.add_softwarelicense"],
|
||||||
),
|
),
|
||||||
|
PluginMenuButton(
|
||||||
|
"plugins:netbox_slm:softwarelicense_import",
|
||||||
|
"Import",
|
||||||
|
"mdi mdi-upload",
|
||||||
|
permissions=["netbox_slm.import_softwarelicense"],
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ urlpatterns = [
|
|||||||
path(
|
path(
|
||||||
"software-products/delete/", views.SoftwareProductBulkDeleteView.as_view(), name="softwareproduct_bulk_delete"
|
"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/<int:pk>/", views.SoftwareProductView.as_view(), name="softwareproduct"),
|
path("software-products/<int:pk>/", views.SoftwareProductView.as_view(), name="softwareproduct"),
|
||||||
path(
|
path(
|
||||||
"software-products/<int:pk>/delete/", views.SoftwareProductDeleteView.as_view(), name="softwareproduct_delete"
|
"software-products/<int:pk>/delete/", views.SoftwareProductDeleteView.as_view(), name="softwareproduct_delete"
|
||||||
@@ -30,6 +31,9 @@ urlpatterns = [
|
|||||||
views.SoftwareProductVersionBulkDeleteView.as_view(),
|
views.SoftwareProductVersionBulkDeleteView.as_view(),
|
||||||
name="softwareproductversion_bulk_delete",
|
name="softwareproductversion_bulk_delete",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"versions/import/", views.SoftwareProductVersionBulkImportView.as_view(), name="softwareproductversion_import"
|
||||||
|
),
|
||||||
path("versions/<int:pk>/", views.SoftwareProductVersionView.as_view(), name="softwareproductversion"),
|
path("versions/<int:pk>/", views.SoftwareProductVersionView.as_view(), name="softwareproductversion"),
|
||||||
path(
|
path(
|
||||||
"versions/<int:pk>/delete/",
|
"versions/<int:pk>/delete/",
|
||||||
@@ -59,6 +63,11 @@ urlpatterns = [
|
|||||||
views.SoftwareProductInstallationBulkDeleteView.as_view(),
|
views.SoftwareProductInstallationBulkDeleteView.as_view(),
|
||||||
name="softwareproductinstallation_bulk_delete",
|
name="softwareproductinstallation_bulk_delete",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"installations/import/",
|
||||||
|
views.SoftwareProductInstallationBulkImportView.as_view(),
|
||||||
|
name="softwareproductinstallation_import",
|
||||||
|
),
|
||||||
path(
|
path(
|
||||||
"installations/<int:pk>/",
|
"installations/<int:pk>/",
|
||||||
views.SoftwareProductInstallationView.as_view(),
|
views.SoftwareProductInstallationView.as_view(),
|
||||||
@@ -84,6 +93,7 @@ urlpatterns = [
|
|||||||
path("licenses/", views.SoftwareLicenseListView.as_view(), name="softwarelicense_list"),
|
path("licenses/", views.SoftwareLicenseListView.as_view(), name="softwarelicense_list"),
|
||||||
path("licenses/add/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_add"),
|
path("licenses/add/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_add"),
|
||||||
path("licenses/delete/", views.SoftwareLicenseBulkDeleteView.as_view(), name="softwarelicense_bulk_delete"),
|
path("licenses/delete/", views.SoftwareLicenseBulkDeleteView.as_view(), name="softwarelicense_bulk_delete"),
|
||||||
|
path("licenses/import/", views.SoftwareLicenseBulkImportView.as_view(), name="softwarelicense_import"),
|
||||||
path("licenses/<int:pk>/", views.SoftwareLicenseView.as_view(), name="softwarelicense"),
|
path("licenses/<int:pk>/", views.SoftwareLicenseView.as_view(), name="softwarelicense"),
|
||||||
path("licenses/<int:pk>/delete/", views.SoftwareLicenseDeleteView.as_view(), name="softwarelicense_delete"),
|
path("licenses/<int:pk>/delete/", views.SoftwareLicenseDeleteView.as_view(), name="softwarelicense_delete"),
|
||||||
path("licenses/<int:pk>/edit/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_edit"),
|
path("licenses/<int:pk>/edit/", views.SoftwareLicenseEditView.as_view(), name="softwarelicense_edit"),
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from .software_license import (
|
|||||||
SoftwareLicenseEditView,
|
SoftwareLicenseEditView,
|
||||||
SoftwareLicenseDeleteView,
|
SoftwareLicenseDeleteView,
|
||||||
SoftwareLicenseBulkDeleteView,
|
SoftwareLicenseBulkDeleteView,
|
||||||
|
SoftwareLicenseBulkImportView,
|
||||||
)
|
)
|
||||||
from .software_product import (
|
from .software_product import (
|
||||||
SoftwareProductListView,
|
SoftwareProductListView,
|
||||||
@@ -11,6 +12,7 @@ from .software_product import (
|
|||||||
SoftwareProductEditView,
|
SoftwareProductEditView,
|
||||||
SoftwareProductDeleteView,
|
SoftwareProductDeleteView,
|
||||||
SoftwareProductBulkDeleteView,
|
SoftwareProductBulkDeleteView,
|
||||||
|
SoftwareProductBulkImportView,
|
||||||
)
|
)
|
||||||
from .software_product_installation import (
|
from .software_product_installation import (
|
||||||
SoftwareProductInstallationListView,
|
SoftwareProductInstallationListView,
|
||||||
@@ -18,6 +20,7 @@ from .software_product_installation import (
|
|||||||
SoftwareProductInstallationEditView,
|
SoftwareProductInstallationEditView,
|
||||||
SoftwareProductInstallationDeleteView,
|
SoftwareProductInstallationDeleteView,
|
||||||
SoftwareProductInstallationBulkDeleteView,
|
SoftwareProductInstallationBulkDeleteView,
|
||||||
|
SoftwareProductInstallationBulkImportView,
|
||||||
)
|
)
|
||||||
from .software_product_version import (
|
from .software_product_version import (
|
||||||
SoftwareProductVersionListView,
|
SoftwareProductVersionListView,
|
||||||
@@ -25,4 +28,5 @@ from .software_product_version import (
|
|||||||
SoftwareProductVersionEditView,
|
SoftwareProductVersionEditView,
|
||||||
SoftwareProductVersionDeleteView,
|
SoftwareProductVersionDeleteView,
|
||||||
SoftwareProductVersionBulkDeleteView,
|
SoftwareProductVersionBulkDeleteView,
|
||||||
|
SoftwareProductVersionBulkImportView,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -34,3 +34,9 @@ class SoftwareLicenseDeleteView(generic.ObjectDeleteView):
|
|||||||
class SoftwareLicenseBulkDeleteView(generic.BulkDeleteView):
|
class SoftwareLicenseBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = SoftwareLicense.objects.all()
|
queryset = SoftwareLicense.objects.all()
|
||||||
table = tables.SoftwareLicenseTable
|
table = tables.SoftwareLicenseTable
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareLicenseBulkImportView(generic.BulkImportView):
|
||||||
|
queryset = SoftwareLicense.objects.all()
|
||||||
|
table = tables.SoftwareLicenseTable
|
||||||
|
model_form = forms.SoftwareLicenseBulkImportForm
|
||||||
|
|||||||
@@ -38,3 +38,9 @@ class SoftwareProductDeleteView(generic.ObjectDeleteView):
|
|||||||
class SoftwareProductBulkDeleteView(generic.BulkDeleteView):
|
class SoftwareProductBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = SoftwareProduct.objects.all()
|
queryset = SoftwareProduct.objects.all()
|
||||||
table = tables.SoftwareProductTable
|
table = tables.SoftwareProductTable
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductBulkImportView(generic.BulkImportView):
|
||||||
|
queryset = SoftwareProduct.objects.all()
|
||||||
|
table = tables.SoftwareProductTable
|
||||||
|
model_form = forms.SoftwareProductBulkImportForm
|
||||||
|
|||||||
@@ -34,3 +34,9 @@ class SoftwareProductInstallationDeleteView(generic.ObjectDeleteView):
|
|||||||
class SoftwareProductInstallationBulkDeleteView(generic.BulkDeleteView):
|
class SoftwareProductInstallationBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = SoftwareProductInstallation.objects.all()
|
queryset = SoftwareProductInstallation.objects.all()
|
||||||
table = tables.SoftwareProductInstallationTable
|
table = tables.SoftwareProductInstallationTable
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductInstallationBulkImportView(generic.BulkImportView):
|
||||||
|
queryset = SoftwareProductInstallation.objects.all()
|
||||||
|
table = tables.SoftwareProductInstallationTable
|
||||||
|
model_form = forms.SoftwareProductInstallationBulkImportForm
|
||||||
|
|||||||
@@ -38,3 +38,9 @@ class SoftwareProductVersionDeleteView(generic.ObjectDeleteView):
|
|||||||
class SoftwareProductVersionBulkDeleteView(generic.BulkDeleteView):
|
class SoftwareProductVersionBulkDeleteView(generic.BulkDeleteView):
|
||||||
queryset = SoftwareProductVersion.objects.all()
|
queryset = SoftwareProductVersion.objects.all()
|
||||||
table = tables.SoftwareProductVersionTable
|
table = tables.SoftwareProductVersionTable
|
||||||
|
|
||||||
|
|
||||||
|
class SoftwareProductVersionBulkImportView(generic.BulkImportView):
|
||||||
|
queryset = SoftwareProductVersion.objects.all()
|
||||||
|
table = tables.SoftwareProductVersionTable
|
||||||
|
model_form = forms.SoftwareProductVersionBulkImportForm
|
||||||
|
|||||||
Reference in New Issue
Block a user