diff --git a/src/netbox_slm/api/serializers.py b/src/netbox_slm/api/serializers.py
index 411c741..520663a 100644
--- a/src/netbox_slm/api/serializers.py
+++ b/src/netbox_slm/api/serializers.py
@@ -1,14 +1,12 @@
from rest_framework import serializers
-from netbox.api.serializers import PrimaryModelSerializer
-# from netbox_slm.api.nested_serializers import (
-# NestedRecordSerializer,
-# NestedNameServerSerializer,
-# )
-from netbox_slm.models import SoftwareProduct, SoftwareProductVersion
+from netbox.api.serializers import NetBoxModelSerializer
+from netbox_slm.models import (
+ SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation,
+)
-class SoftwareProductSerializer(PrimaryModelSerializer):
+class SoftwareProductSerializer(NetBoxModelSerializer):
display = serializers.SerializerMethodField()
url = serializers.HyperlinkedIdentityField(
view_name="plugins-api:netbox_slm-api:softwareproduct-detail"
@@ -24,7 +22,7 @@ class SoftwareProductSerializer(PrimaryModelSerializer):
return f"{obj.manufacturer.name} - {obj.name}"
-class SoftwareProductVersionSerializer(PrimaryModelSerializer):
+class SoftwareProductVersionSerializer(NetBoxModelSerializer):
display = serializers.SerializerMethodField()
url = serializers.HyperlinkedIdentityField(
view_name="plugins-api:netbox_slm-api:softwareproductversion-detail"
@@ -38,3 +36,20 @@ class SoftwareProductVersionSerializer(PrimaryModelSerializer):
def get_display(self, obj):
return obj.name
+
+
+class SoftwareProductInstallationSerializer(NetBoxModelSerializer):
+ display = serializers.SerializerMethodField()
+ url = serializers.HyperlinkedIdentityField(
+ view_name="plugins-api:netbox_slm-api:softwareproductinstallation-detail"
+ )
+
+ class Meta:
+ model = SoftwareProductInstallation
+ fields = [
+ 'id', 'display', 'url', 'device', 'virtualmachine', 'software_product', 'version', 'tags',
+ 'custom_field_data', 'created', 'last_updated',
+ ]
+
+ def get_display(self, obj):
+ return obj
diff --git a/src/netbox_slm/api/urls.py b/src/netbox_slm/api/urls.py
index b68ab3a..421eb61 100644
--- a/src/netbox_slm/api/urls.py
+++ b/src/netbox_slm/api/urls.py
@@ -1,13 +1,15 @@
-from netbox.api import OrderedDefaultRouter
+from netbox.api.routers import NetBoxRouter
from netbox_slm.api.views import (
NetboxSLMRootView,
SoftwareProductViewSet,
SoftwareProductVersionViewSet,
+ SoftwareProductInstallationViewSet,
)
-router = OrderedDefaultRouter()
+router = NetBoxRouter()
router.APIRootView = NetboxSLMRootView
router.register("softwareproducts", SoftwareProductViewSet)
router.register("softwareproductversions", SoftwareProductVersionViewSet)
+router.register("softwareproductinstallations", SoftwareProductInstallationViewSet)
urlpatterns = router.urls
\ No newline at end of file
diff --git a/src/netbox_slm/api/views.py b/src/netbox_slm/api/views.py
index 5488879..8fbd9b4 100644
--- a/src/netbox_slm/api/views.py
+++ b/src/netbox_slm/api/views.py
@@ -3,10 +3,16 @@ from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.routers import APIRootView
-from extras.api.views import CustomFieldModelViewSet
-from netbox_slm.api.serializers import SoftwareProductSerializer, SoftwareProductVersionSerializer
-from netbox_slm.filters import SoftwareProductFilter, SoftwareProductVersionFilter
-from netbox_slm.models import SoftwareProduct, SoftwareProductVersion
+from netbox.api.viewsets import NetBoxModelViewSet
+from netbox_slm.api.serializers import (
+ SoftwareProductSerializer, SoftwareProductVersionSerializer, SoftwareProductInstallationSerializer,
+)
+from netbox_slm.filters import (
+ SoftwareProductFilter, SoftwareProductVersionFilter, SoftwareProductInstallationFilter,
+)
+from netbox_slm.models import (
+ SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation,
+)
class NetboxSLMRootView(APIRootView):
@@ -18,27 +24,19 @@ class NetboxSLMRootView(APIRootView):
return "NetboxSLM"
-class SoftwareProductViewSet(CustomFieldModelViewSet):
+class SoftwareProductViewSet(NetBoxModelViewSet):
queryset = SoftwareProduct.objects.all()
serializer_class = SoftwareProductSerializer
filterset_class = SoftwareProductFilter
- # @action(detail=True, methods=["get"])
- # def records(self, request, pk=None):
- # records = Record.objects.filter(zone=pk)
- # serializer = RecordSerializer(records, many=True, context={"request": request})
- # return Response(serializer.data)
-
-class SoftwareProductVersionViewSet(CustomFieldModelViewSet):
+class SoftwareProductVersionViewSet(NetBoxModelViewSet):
queryset = SoftwareProductVersion.objects.all()
serializer_class = SoftwareProductVersionSerializer
filterset_class = SoftwareProductVersionFilter
- # @action(detail=True, methods=["get"])
- # def records(self, request, pk=None):
- # records = Record.objects.filter(zone=pk)
- # serializer = RecordSerializer(records, many=True, context={"request": request})
- # return Response(serializer.data)
-# for reference: https://github.com/auroraresearchlab/netbox-dns/blob/main/netbox_dns/api/views.py
\ No newline at end of file
+class SoftwareProductInstallationViewSet(NetBoxModelViewSet):
+ queryset = SoftwareProductInstallation.objects.all()
+ serializer_class = SoftwareProductInstallationSerializer
+ filterset_class = SoftwareProductInstallationFilter
diff --git a/src/netbox_slm/filters.py b/src/netbox_slm/filters.py
index b8633dd..0a6b83d 100644
--- a/src/netbox_slm/filters.py
+++ b/src/netbox_slm/filters.py
@@ -2,12 +2,12 @@ import django_filters
from django.db.models import Q
from django.utils.translation import gettext as _
from extras.filters import TagFilter
-from netbox.filtersets import PrimaryModelFilterSet
+from netbox.filtersets import NetBoxModelFilterSet
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation
from utilities.forms import DynamicModelMultipleChoiceField
-class BaseFilter(PrimaryModelFilterSet):
+class BaseFilter(NetBoxModelFilterSet):
q = django_filters.CharFilter(
method="search",
label="Search",
diff --git a/src/netbox_slm/forms.py b/src/netbox_slm/forms.py
index 2344635..52cf869 100644
--- a/src/netbox_slm/forms.py
+++ b/src/netbox_slm/forms.py
@@ -1,12 +1,11 @@
from django import forms
from django.urls import reverse_lazy
from django.utils.translation import gettext as _
-from extras.forms import (
- CustomFieldModelForm,
- CustomFieldModelCSVForm,
- AddRemoveTagsForm,
- CustomFieldModelBulkEditForm,
- CustomFieldModelFilterForm,
+from netbox.forms import (
+ NetBoxModelForm,
+ NetBoxModelCSVForm,
+ NetBoxModelBulkEditForm,
+ NetBoxModelFilterSetForm,
)
from dcim.models import Manufacturer, Device
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation
@@ -16,7 +15,7 @@ from utilities.forms import (
from virtualization.models import VirtualMachine
-class SoftwareProductForm(CustomFieldModelForm):
+class SoftwareProductForm(NetBoxModelForm):
"""Form for creating a new SoftwareProduct object."""
manufacturer = DynamicModelChoiceField(
@@ -27,17 +26,12 @@ class SoftwareProductForm(CustomFieldModelForm):
# }
)
- # tags = DynamicModelMultipleChoiceField(
- # queryset=Tag.objects.all(),
- # required=False,
- # )
-
class Meta:
model = SoftwareProduct
- fields = ("name", "manufacturer", "description",) # "tags")
+ fields = ("name", "manufacturer", "description", "tags")
-class SoftwareProductFilterForm(CustomFieldModelFilterForm):
+class SoftwareProductFilterForm(NetBoxModelFilterSetForm):
"""Form for filtering SoftwareProduct instances."""
model = SoftwareProduct
@@ -52,23 +46,24 @@ class SoftwareProductFilterForm(CustomFieldModelFilterForm):
# tag = TagFilterField(SoftwareProduct)
-class SoftwareProductCSVForm(CustomFieldModelCSVForm):
+class SoftwareProductCSVForm(NetBoxModelCSVForm):
class Meta:
model = SoftwareProduct
fields = ("name",)
-class SoftwareProductBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class SoftwareProductBulkEditForm(NetBoxModelBulkEditForm):
pk = forms.ModelMultipleChoiceField(
queryset=SoftwareProduct.objects.all(),
widget=forms.MultipleHiddenInput(),
)
class Meta:
+ model = SoftwareProduct
nullable_fields = []
-class SoftwareProductVersionForm(CustomFieldModelForm):
+class SoftwareProductVersionForm(NetBoxModelForm):
"""Form for creating a new SoftwareProductVersion object."""
name = forms.CharField(label=_("Version"))
@@ -79,21 +74,16 @@ class SoftwareProductVersionForm(CustomFieldModelForm):
),
)
- # tags = DynamicModelMultipleChoiceField(
- # queryset=Tag.objects.all(),
- # required=False,
- # )
-
class Meta:
model = SoftwareProductVersion
- fields = ("name", "software_product",) # "tags")
+ fields = ("name", "software_product", "tags")
# def clean(self):
# import pdb;pdb.set_trace()
# return super(SoftwareProductVersionForm, self).clean()
-class SoftwareProductVersionFilterForm(CustomFieldModelFilterForm):
+class SoftwareProductVersionFilterForm(NetBoxModelFilterSetForm):
"""Form for filtering SoftwareProductVersion instances."""
model = SoftwareProductVersion
@@ -108,23 +98,24 @@ class SoftwareProductVersionFilterForm(CustomFieldModelFilterForm):
# tag = TagFilterField(SoftwareProduct)
-class SoftwareProductVersionCSVForm(CustomFieldModelCSVForm):
+class SoftwareProductVersionCSVForm(NetBoxModelCSVForm):
class Meta:
model = SoftwareProductVersion
fields = ("name",)
-class SoftwareProductVersionBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
+class SoftwareProductVersionBulkEditForm(NetBoxModelBulkEditForm):
pk = forms.ModelMultipleChoiceField(
queryset=SoftwareProduct.objects.all(),
widget=forms.MultipleHiddenInput(),
)
class Meta:
+ model = SoftwareProductVersion
nullable_fields = []
-class SoftwareProductInstallationForm(CustomFieldModelForm):
+class SoftwareProductInstallationForm(NetBoxModelForm):
"""Form for creating a new SoftwareProductInstallation object."""
device = DynamicModelChoiceField(
@@ -159,16 +150,9 @@ class SoftwareProductInstallationForm(CustomFieldModelForm):
}
)
- # todo need version and device ?
-
- # tags = DynamicModelMultipleChoiceField(
- # queryset=Tag.objects.all(),
- # required=False,
- # )
-
class Meta:
model = SoftwareProductInstallation
- fields = ("device", "virtualmachine", "software_product", "version",) # "tags")
+ fields = ("device", "virtualmachine", "software_product", "version", "tags")
def clean(self):
if not any([self.cleaned_data['device'], self.cleaned_data['virtualmachine']]):
@@ -176,7 +160,7 @@ class SoftwareProductInstallationForm(CustomFieldModelForm):
return super(SoftwareProductInstallationForm, self).clean()
-class SoftwareProductInstallationFilterForm(CustomFieldModelFilterForm):
+class SoftwareProductInstallationFilterForm(NetBoxModelFilterSetForm):
"""Form for filtering SoftwareProductInstallation instances."""
model = SoftwareProductInstallation
@@ -186,17 +170,23 @@ class SoftwareProductInstallationFilterForm(CustomFieldModelFilterForm):
# tag = TagFilterField(SoftwareProduct)
-class SoftwareProductInstallationCSVForm(CustomFieldModelCSVForm):
+class SoftwareProductInstallationCSVForm(NetBoxModelCSVForm):
class Meta:
model = SoftwareProductInstallation
fields = tuple()
-class SoftwareProductInstallationBulkEditForm(AddRemoveTagsForm, CustomFieldModelBulkEditForm):
- pk = forms.ModelMultipleChoiceField(
- queryset=SoftwareProductInstallation.objects.all(),
- widget=forms.MultipleHiddenInput(),
+class SoftwareProductInstallationBulkEditForm(NetBoxModelBulkEditForm):
+ software_product = DynamicModelChoiceField(
+ queryset=SoftwareProduct.objects.all(),
+ required=False
)
-
- class Meta:
- nullable_fields = []
+ version = DynamicModelChoiceField(
+ queryset=SoftwareProductVersion.objects.all(),
+ required=False
+ )
+ model = SoftwareProductInstallation
+ fieldsets = (
+ (None, ('software_product', 'version',)),
+ )
+ # nullable_fields = ('',)
\ No newline at end of file
diff --git a/src/netbox_slm/middleware.py b/src/netbox_slm/middleware.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/netbox_slm/migrations/0003_auto_20220407_1209.py b/src/netbox_slm/migrations/0003_auto_20220407_1209.py
new file mode 100644
index 0000000..6141c0a
--- /dev/null
+++ b/src/netbox_slm/migrations/0003_auto_20220407_1209.py
@@ -0,0 +1,43 @@
+# Generated by Django 3.2.9 on 2022-04-07 12:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('netbox_slm', '0002_alter_softwareproduct_manufacturer'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='softwareproduct',
+ name='created',
+ field=models.DateTimeField(auto_now_add=True, null=True),
+ ),
+ migrations.AlterField(
+ model_name='softwareproduct',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
+ ),
+ migrations.AlterField(
+ model_name='softwareproductinstallation',
+ name='created',
+ field=models.DateTimeField(auto_now_add=True, null=True),
+ ),
+ migrations.AlterField(
+ model_name='softwareproductinstallation',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
+ ),
+ migrations.AlterField(
+ model_name='softwareproductversion',
+ name='created',
+ field=models.DateTimeField(auto_now_add=True, null=True),
+ ),
+ migrations.AlterField(
+ model_name='softwareproductversion',
+ name='id',
+ field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False),
+ ),
+ ]
diff --git a/src/netbox_slm/models.py b/src/netbox_slm/models.py
index d618e45..298b885 100644
--- a/src/netbox_slm/models.py
+++ b/src/netbox_slm/models.py
@@ -2,12 +2,12 @@ from django.db import models
from django.urls import reverse, reverse_lazy
from django.utils import safestring
# from extras.utils import extras_features # todo this changed in netbox 3.1.X and higher, currently not used but checkout why
-from netbox.models import PrimaryModel
+from netbox.models import NetBoxModel
from utilities.querysets import RestrictedQuerySet
# @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
-class SoftwareProduct(PrimaryModel):
+class SoftwareProduct(NetBoxModel):
"""
A SoftwareProduct represents ...
"""
@@ -38,7 +38,7 @@ class SoftwareProduct(PrimaryModel):
# @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
-class SoftwareProductVersion(PrimaryModel):
+class SoftwareProductVersion(NetBoxModel):
software_product = models.ForeignKey(
to='netbox_slm.SoftwareProduct',
on_delete=models.PROTECT,
@@ -63,7 +63,7 @@ class SoftwareProductVersion(PrimaryModel):
# @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
-class SoftwareProductInstallation(PrimaryModel):
+class SoftwareProductInstallation(NetBoxModel):
device = models.ForeignKey(
to='dcim.Device',
on_delete=models.PROTECT,
diff --git a/src/netbox_slm/signals.py b/src/netbox_slm/signals.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/netbox_slm/tables.py b/src/netbox_slm/tables.py
index 2fffa93..1110eaf 100644
--- a/src/netbox_slm/tables.py
+++ b/src/netbox_slm/tables.py
@@ -1,10 +1,11 @@
import django_tables2 as tables
+
from django_tables2.utils import Accessor
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation
-from utilities.tables import BaseTable, ChoiceFieldColumn, ToggleColumn
+from netbox.tables import NetBoxTable, ChoiceFieldColumn, ToggleColumn, columns
-class SoftwareProductTable(BaseTable):
+class SoftwareProductTable(NetBoxTable):
"""Table for displaying SoftwareProduct objects."""
pk = ToggleColumn()
@@ -15,11 +16,11 @@ class SoftwareProductTable(BaseTable):
)
installations = tables.Column(accessor='get_installation_count', verbose_name='Installations')
- # tags = TagColumn(
- # url_name="plugins:netbox_dns:zone_list",
- # )
+ tags = columns.TagColumn(
+ url_name="plugins:netbox_slm:softwareproduct_list",
+ )
- class Meta(BaseTable.Meta):
+ class Meta(NetBoxTable.Meta):
model = SoftwareProduct
fields = (
"pk",
@@ -27,7 +28,7 @@ class SoftwareProductTable(BaseTable):
"manufacturer",
"description",
"installations",
- # "tags",
+ "tags",
)
default_columns = (
"pk",
@@ -35,7 +36,7 @@ class SoftwareProductTable(BaseTable):
"manufacturer",
"description",
"installations",
- # "tags",
+ "tags",
)
sequence = (
"manufacturer",
@@ -45,7 +46,7 @@ class SoftwareProductTable(BaseTable):
)
-class SoftwareProductVersionTable(BaseTable):
+class SoftwareProductVersionTable(NetBoxTable):
"""Table for displaying SoftwareProductVersion objects."""
pk = ToggleColumn()
@@ -60,11 +61,11 @@ class SoftwareProductVersionTable(BaseTable):
)
installations = tables.Column(accessor='get_installation_count', verbose_name='Installations')
- # tags = TagColumn(
- # url_name="plugins:netbox_dns:zone_list",
- # )
+ tags = columns.TagColumn(
+ url_name="plugins:netbox_slm:softwareproductversion_list",
+ )
- class Meta(BaseTable.Meta):
+ class Meta(NetBoxTable.Meta):
model = SoftwareProductVersion
fields = (
"pk",
@@ -72,7 +73,7 @@ class SoftwareProductVersionTable(BaseTable):
"software_product",
"manufacturer",
"installations",
- # "tags",
+ "tags",
)
default_columns = (
"pk",
@@ -80,7 +81,7 @@ class SoftwareProductVersionTable(BaseTable):
"software_product",
"manufacturer",
"installations",
- # "tags",
+ "tags",
)
sequence = (
"manufacturer",
@@ -90,7 +91,7 @@ class SoftwareProductVersionTable(BaseTable):
)
-class SoftwareProductInstallationTable(BaseTable):
+class SoftwareProductInstallationTable(NetBoxTable):
"""Table for displaying SoftwareProductInstallation objects."""
pk = ToggleColumn()
@@ -117,11 +118,11 @@ class SoftwareProductInstallationTable(BaseTable):
linkify=True
)
- # tags = TagColumn(
- # url_name="plugins:netbox_dns:zone_list",
- # )
+ tags = columns.TagColumn(
+ url_name="plugins:netbox_slm:softwareproductinstallation_list",
+ )
- class Meta(BaseTable.Meta):
+ class Meta(NetBoxTable.Meta):
model = SoftwareProductInstallation
fields = (
"pk",
@@ -130,7 +131,7 @@ class SoftwareProductInstallationTable(BaseTable):
"type",
"software_product",
"version",
- # "tags",
+ "tags",
)
default_columns = (
"pk",
@@ -138,7 +139,7 @@ class SoftwareProductInstallationTable(BaseTable):
"type",
"software_product",
"version",
- # "tags",
+ "tags",
)
def render_software_product(self, value, **kwargs):
diff --git a/src/netbox_slm/template_content.py b/src/netbox_slm/template_content.py
deleted file mode 100644
index e69de29..0000000
diff --git a/src/netbox_slm/templates/netbox_slm/object.html b/src/netbox_slm/templates/netbox_slm/object.html
deleted file mode 100644
index 2f123bc..0000000
--- a/src/netbox_slm/templates/netbox_slm/object.html
+++ /dev/null
@@ -1,93 +0,0 @@
-{% extends 'base/layout.html' %}
-{% load buttons %}
-{% load custom_links %}
-{% load helpers %}
-{% load perms %}
-{% load plugins %}
-{% load view_helpers %}
-
-{% block header %}
- {# Breadcrumbs #}
-
- {{ block.super }}
-{% endblock %}
-
-{% block title %}{{ object }}{% endblock %}
-
-{% block subtitle %}
-
- Created {{ object.created|annotated_date }}
- ·
- Updated {{ object.last_updated|timesince }} ago
-
-{% endblock %}
-
-{% block controls %}
- {# Clone/Edit/Delete Buttons #}
-
-
- {% plugin_buttons object %}
-
- {# Extra buttons #}
- {% block extra_controls %}{% endblock %}
-
- {% if object.clone_fields and request.user|can_add:object %}
- {% plugin_clone_button object %}
- {% endif %}
- {% if request.user|can_change:object %}
- {% plugin_edit_button object %}
- {% endif %}
- {% if request.user|can_delete:object %}
- {% plugin_delete_button object %}
- {% endif %}
-
-
-
- {% custom_links object %}
-
-
-{% endblock controls %}
-
-{% block tabs %}
-
- {% block tab_items %}
- -
- {{ object|meta:"verbose_name"|bettertitle }}
-
- {% endblock tab_items %}
- {% if perms.extras.view_journalentry %}
- {% with journal_viewname=object|plugin_viewname:'journal' %}
- {% url journal_viewname pk=object.pk as journal_url %}
- {% if journal_url %}
- -
-
- Journal {% badge object.journal_entries.count %}
-
-
- {% endif %}
- {% endwith %}
- {% endif %}
- {% if perms.extras.view_objectchange %}
- {% with changelog_viewname=object|plugin_viewname:'changelog' %}
- {% url changelog_viewname pk=object.pk as changelog_url %}
- {% if changelog_url %}
- -
- Change Log
-
- {% endif %}
- {% endwith %}
- {% endif %}
-
-{% endblock tabs %}
-
-{% block content-wrapper %}
-
- {% block content %}{% endblock %}
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/netbox_slm/templates/netbox_slm/object_list.html b/src/netbox_slm/templates/netbox_slm/object_list.html
deleted file mode 100644
index 405dc87..0000000
--- a/src/netbox_slm/templates/netbox_slm/object_list.html
+++ /dev/null
@@ -1,141 +0,0 @@
-{% extends 'base/layout.html' %}
-{% load buttons %}
-{% load helpers %}
-{% load render_table from django_tables2 %}
-{% load static %}
-{% load view_helpers %}
-
-{% block controls %}
-
-
- {% block extra_controls %}{% endblock %}
- {% if permissions.add and 'add' in action_buttons %}
- {% add_button content_type.model_class|plugin_viewname:"add" %}
- {% endif %}
- {% if permissions.add and 'import' in action_buttons %}
- {% import_button content_type.model_class|plugin_viewname:"import" %}
- {% endif %}
- {% if 'export' in action_buttons %}
- {% export_button content_type %}
- {% endif %}
-
-
-{% endblock controls %}
-
-{% block tabs %}
-
- {% block tab_items %}
- -
-
-
- {% if filter_form %}
- -
-
-
- {% endif %}
- {% endblock tab_items %}
-
-{% endblock tabs %}
-
-{% block content-wrapper %}
-
-
- {# Object list #}
-
-
- {# Applied filters #}
- {% if filter_form %}
- {% applied_filters filter_form request.GET %}
- {% endif %}
-
- {# "Select all" form #}
- {% if table.paginator.num_pages > 1 %}
- {% with bulk_edit_url=content_type.model_class|validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|validated_viewname:"bulk_delete" %}
-
- {% endwith %}
- {% endif %}
-
- {# Object table controls #}
- {% include 'inc/table_controls.html' with table_modal="ObjectTable_config" %}
-
-
-
- {# Paginator #}
- {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
-
-
- {# Filter form #}
- {% if filter_form %}
-
- {% include 'inc/filter_list.html' %}
-
- {% endif %}
-
-
- {# Table config form #}
- {% table_config_form table table_name="ObjectTable" %}
-{% endblock content-wrapper %}
\ No newline at end of file
diff --git a/src/netbox_slm/templates/netbox_slm/softwareproduct.html b/src/netbox_slm/templates/netbox_slm/softwareproduct.html
index 6202247..aa3fa97 100644
--- a/src/netbox_slm/templates/netbox_slm/softwareproduct.html
+++ b/src/netbox_slm/templates/netbox_slm/softwareproduct.html
@@ -1,26 +1,21 @@
-{% extends 'netbox_slm/object.html' %}
+{% extends 'generic/object.html' %}
+{% load buttons %}
+{% load static %}
{% load helpers %}
{% load plugins %}
-{% load render_table from django_tables2 %}
-{% load view_helpers %}
-{% load perms %}
-
-{% block extra_controls %}
-{{ block.super }}
-{% endblock %}
{% block content %}
-
-
+
+
-
+
| Name |
- {{ object.name }} |
+ {{ object }} |
| Versions |
@@ -35,42 +30,15 @@
- {% include 'inc/custom_fields_panel.html' %}
-
-
- {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='plugins:netbox_slm:softwareproduct_list' %}
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/tags.html' %}
+{# {% include 'inc/panels/comments.html' %}#}
+ {% plugin_left_page object %}
-
-
-
-
-
-
- | NAME |
- Actions |
-
-
-
- {% for version in versions %}
-
- | {{ version.name|truncatechars:32 }} |
-
- {% if request.user|can_change:object %}
- {% plugin_edit_button version %}
- {% endif %}
- {% if request.user|can_delete:object %}
- {% plugin_delete_button version %}
- {% endif %}
- |
-
- {% endfor %}
-
-
-
-
+ {% plugin_full_width_page object %}
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/src/netbox_slm/templates/netbox_slm/softwareproductinstallation.html b/src/netbox_slm/templates/netbox_slm/softwareproductinstallation.html
index 7ad8300..6611cd2 100644
--- a/src/netbox_slm/templates/netbox_slm/softwareproductinstallation.html
+++ b/src/netbox_slm/templates/netbox_slm/softwareproductinstallation.html
@@ -1,82 +1,49 @@
-{% extends 'netbox_slm/object.html' %}
+{% extends 'generic/object.html' %}
+{% load buttons %}
+{% load static %}
{% load helpers %}
{% load plugins %}
-{% load render_table from django_tables2 %}
-{% load view_helpers %}
-{% load perms %}
-
-{% block extra_controls %}
-{{ block.super }}
-{% endblock %}
{% block content %}
-
-
+
+
-
+
+ {% if object.device %}
- | Installation |
- {{ object }} |
+ Device |
+ {{ object.device }} |
+
+ {% else %}
+
+ | Virtualmachine |
+ {{ object.virtualmachine }} |
+
+ {% endif %}
+
+ | Software Product |
+ {{ object.software_product }} |
- | bla |
-
-
-
-
-
-
- |
+ Version |
+ {{ object.version }} |
- {% include 'inc/custom_fields_panel.html' %}
-
-
- {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='plugins:netbox_slm:softwareproduct_list' %}
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/tags.html' %}
+{# {% include 'inc/panels/comments.html' %}#}
+ {% plugin_left_page object %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
\ No newline at end of file
+
+
+ {% plugin_full_width_page object %}
+
+
+{% endblock %}
diff --git a/src/netbox_slm/templates/netbox_slm/softwareproductversion.html b/src/netbox_slm/templates/netbox_slm/softwareproductversion.html
index ed5db57..ec5cf9f 100644
--- a/src/netbox_slm/templates/netbox_slm/softwareproductversion.html
+++ b/src/netbox_slm/templates/netbox_slm/softwareproductversion.html
@@ -1,21 +1,16 @@
-{% extends 'netbox_slm/object.html' %}
+{% extends 'generic/object.html' %}
+{% load buttons %}
+{% load static %}
{% load helpers %}
{% load plugins %}
-{% load render_table from django_tables2 %}
-{% load view_helpers %}
-{% load perms %}
-
-{% block extra_controls %}
-{{ block.super }}
-{% endblock %}
{% block content %}
-
-
+
+
- {% include 'inc/custom_fields_panel.html' %}
-
-
- {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='plugins:netbox_slm:softwareproduct_list' %}
+ {% include 'inc/panels/custom_fields.html' %}
+ {% include 'inc/panels/tags.html' %}
+{# {% include 'inc/panels/comments.html' %}#}
+ {% plugin_left_page object %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
\ No newline at end of file
+
+
+ {% plugin_full_width_page object %}
+
+
+{% endblock %}
diff --git a/src/netbox_slm/templates/netbox_slm/version.html b/src/netbox_slm/templates/netbox_slm/version.html
deleted file mode 100644
index 7257dd8..0000000
--- a/src/netbox_slm/templates/netbox_slm/version.html
+++ /dev/null
@@ -1,91 +0,0 @@
-{% extends 'netbox_slm/object.html' %}
-{% load helpers %}
-{% load plugins %}
-{% load render_table from django_tables2 %}
-{% load view_helpers %}
-{% load perms %}
-
-{% block extra_controls %}
-{% comment %}
-
- Add Record
-
-{% endcomment %}
-{{ block.super }}
-{% endblock %}
-
-{% block content %}
-
-
-
-
-
-
-
- | Name |
- {{ object.name }} |
-
-
- | Versions |
-
-
- |
-
-
-
-
- {% include 'inc/custom_fields_panel.html' %}
-
-
- {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='plugins:netbox_slm:softwareproduct_list' %}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/src/netbox_slm/templatetags/view_helpers.py b/src/netbox_slm/templatetags/view_helpers.py
deleted file mode 100644
index 358469a..0000000
--- a/src/netbox_slm/templatetags/view_helpers.py
+++ /dev/null
@@ -1,94 +0,0 @@
-from django import template
-from django.urls import NoReverseMatch, reverse
-from django import template
-
-from utilities.templatetags.buttons import _get_viewname
-from utilities.utils import prepare_cloned_fields
-
-register = template.Library()
-
-
-@register.filter()
-def plugin_validated_viewname(model, action):
- """Return the view name for :
- * the given model and action if valid
- * or the given model and action if valid inside a plugin
- * or None if invalid.
- """
- core_viewname = f"{model._meta.app_label}:{model._meta.model_name}_{action}"
- plugin_viewname = (
- f"plugins:{model._meta.app_label}:{model._meta.model_name}_{action}"
- )
- try:
- # Validate and return the view name. We don't return the actual URL yet because many of the templates
- # are written to pass a name to {% url %}.
- reverse(core_viewname)
- return core_viewname
- except NoReverseMatch:
- try:
- reverse(plugin_viewname)
- return plugin_viewname
- except NoReverseMatch:
- return None
-
-
-@register.filter()
-def plugin_viewname(model, action):
- """
- Return the view name for the given model and action. Does not perform any validation.
- """
- return f"plugins:{model._meta.app_label}:{model._meta.model_name}_{action}"
-
-
-#
-# Instance buttons
-#
-
-
-@register.inclusion_tag("buttons/clone.html")
-def plugin_clone_button(instance):
- viewname = _get_viewname(instance, "add")
- url = reverse(f"plugins:{viewname}")
-
- # Populate cloned field values
- param_string = prepare_cloned_fields(instance)
- if param_string:
- url = f"{url}?{param_string}"
-
- return {
- "url": url,
- }
-
-
-@register.inclusion_tag("buttons/edit.html")
-def plugin_edit_button(instance, **kwargs):
- viewname = _get_viewname(instance, "edit")
- url = reverse(f"plugins:{viewname}", kwargs={"pk": instance.pk, **kwargs})
-
- return {
- "url": url,
- }
-
-
-@register.inclusion_tag("buttons/delete.html")
-def plugin_delete_button(instance, **kwargs):
- viewname = _get_viewname(instance, "delete")
- url = reverse(f"plugins:{viewname}", kwargs={"pk": instance.pk, **kwargs})
-
- return {
- "url": url,
- }
-
-
-#
-# List buttons
-#
-
-
-@register.inclusion_tag("buttons/add.html")
-def plugin_add_button(url):
- url = reverse(f"plugins:{url}")
-
- return {
- "add_url": url,
- }
diff --git a/src/netbox_slm/urls.py b/src/netbox_slm/urls.py
index 8adce3e..67a32f7 100644
--- a/src/netbox_slm/urls.py
+++ b/src/netbox_slm/urls.py
@@ -1,5 +1,5 @@
from django.urls import path
-from extras.views import ObjectChangeLogView
+from netbox.views.generic import ObjectChangeLogView
from netbox_slm import views
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation
@@ -9,9 +9,11 @@ urlpatterns = [
path("software-products/add/", views.SoftwareProductEditView.as_view(), name='softwareproduct_add'),
path("software-products/import/", views.SoftwareProductBulkImportView.as_view(), name="softwareproduct_import"),
path("software-products/edit/", views.SoftwareProductBulkEditView.as_view(), name="softwareproduct_bulk_edit"),
- path("software-products/delete/", views.SoftwareProductBulkDeleteView.as_view(), name="softwareproduct_bulk_delete"),
+ path("software-products/delete/", views.SoftwareProductBulkDeleteView.as_view(),
+ name="softwareproduct_bulk_delete"),
path("software-products/
/", views.SoftwareProductView.as_view(), name="softwareproduct"),
- path("software-products//delete/", views.SoftwareProductDeleteView.as_view(), name="softwareproduct_delete"),
+ 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/",
@@ -23,11 +25,14 @@ urlpatterns = [
# Software Product Versions
path("versions/", views.SoftwareProductVersionListView.as_view(), name='softwareproductversion_list'),
path("versions/add/", views.SoftwareProductVersionEditView.as_view(), name='softwareproductversion_add'),
- path("versions/import/", views.SoftwareProductVersionBulkImportView.as_view(), name="softwareproductversion_import"),
+ path("versions/import/", views.SoftwareProductVersionBulkImportView.as_view(),
+ name="softwareproductversion_import"),
path("versions/edit/", views.SoftwareProductVersionBulkEditView.as_view(), name="softwareproductversion_bulk_edit"),
- path("versions/delete/", views.SoftwareProductVersionBulkDeleteView.as_view(), name="softwareproductversion_bulk_delete"),
+ path("versions/delete/", views.SoftwareProductVersionBulkDeleteView.as_view(),
+ name="softwareproductversion_bulk_delete"),
path("versions//", views.SoftwareProductVersionView.as_view(), name="softwareproductversion"),
- path("versions//delete/", views.SoftwareProductVersionDeleteView.as_view(), name="softwareproductversion_delete"),
+ path("versions//delete/", views.SoftwareProductVersionDeleteView.as_view(),
+ name="softwareproductversion_delete"),
path("versions//edit/", views.SoftwareProductVersionEditView.as_view(), name="softwareproductversion_edit"),
path(
"versions//changelog/",
@@ -37,14 +42,22 @@ urlpatterns = [
),
# Software Product Versions
- path("installations/", views.SoftwareProductInstallationListView.as_view(), name='softwareproductinstallation_list'),
- path("installations/add/", views.SoftwareProductInstallationEditView.as_view(), name='softwareproductinstallation_add'),
- path("installations/import/", views.SoftwareProductInstallationBulkImportView.as_view(), name="softwareproductinstallation_import"),
- path("installations/edit/", views.SoftwareProductInstallationBulkEditView.as_view(), name="softwareproductinstallation_bulk_edit"),
- path("installations/delete/", views.SoftwareProductInstallationBulkDeleteView.as_view(), name="softwareproductinstallation_bulk_delete"),
- 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/", views.SoftwareProductInstallationListView.as_view(),
+ name='softwareproductinstallation_list'),
+ path("installations/add/", views.SoftwareProductInstallationEditView.as_view(),
+ name='softwareproductinstallation_add'),
+ path("installations/import/", views.SoftwareProductInstallationBulkImportView.as_view(),
+ name="softwareproductinstallation_import"),
+ path("installations/edit/", views.SoftwareProductInstallationBulkEditView.as_view(),
+ name="softwareproductinstallation_bulk_edit"),
+ path("installations/delete/", views.SoftwareProductInstallationBulkDeleteView.as_view(),
+ name="softwareproductinstallation_bulk_delete"),
+ 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(),
diff --git a/src/netbox_slm/views.py b/src/netbox_slm/views.py
index d8101c5..5c6bc49 100644
--- a/src/netbox_slm/views.py
+++ b/src/netbox_slm/views.py
@@ -19,7 +19,7 @@ class SoftwareProductListView(generic.ObjectListView):
filterset = SoftwareProductFilter
filterset_form = SoftwareProductFilterForm
table = SoftwareProductTable
- template_name = "netbox_slm/object_list.html"
+ # template_name = "netbox_slm/object_list.html"
class SoftwareProductView(generic.ObjectView):
@@ -36,7 +36,7 @@ class SoftwareProductEditView(generic.ObjectEditView):
"""View for editing and creating a SoftwareProduct instance."""
queryset = SoftwareProduct.objects.all()
- model_form = SoftwareProductForm
+ form = SoftwareProductForm
class SoftwareProductDeleteView(generic.ObjectDeleteView):
@@ -70,7 +70,7 @@ class SoftwareProductVersionListView(generic.ObjectListView):
filterset = SoftwareProductVersionFilter
filterset_form = SoftwareProductVersionFilterForm
table = SoftwareProductVersionTable
- template_name = "netbox_slm/object_list.html"
+ # template_name = "netbox_slm/object_list.html"
class SoftwareProductVersionView(generic.ObjectView):
@@ -87,7 +87,7 @@ class SoftwareProductVersionEditView(generic.ObjectEditView):
"""View for editing and creating a SoftwareProductVersion instance."""
queryset = SoftwareProductVersion.objects.all()
- model_form = SoftwareProductVersionForm
+ form = SoftwareProductVersionForm
class SoftwareProductVersionDeleteView(generic.ObjectDeleteView):
@@ -121,7 +121,7 @@ class SoftwareProductInstallationListView(generic.ObjectListView):
filterset = SoftwareProductInstallationFilter
filterset_form = SoftwareProductInstallationFilterForm
table = SoftwareProductInstallationTable
- template_name = "netbox_slm/object_list.html"
+ # template_name = "netbox_slm/object_list.html"
class SoftwareProductInstallationView(generic.ObjectView):
@@ -138,7 +138,7 @@ class SoftwareProductInstallationEditView(generic.ObjectEditView):
"""View for editing and creating a SoftwareProductInstallation instance."""
queryset = SoftwareProductInstallation.objects.all()
- model_form = SoftwareProductInstallationForm
+ form = SoftwareProductInstallationForm
class SoftwareProductInstallationDeleteView(generic.ObjectDeleteView):