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 %} - -{% 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 %} - -{% 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" %} -
-
- {% csrf_token %} -
-
- {% if bulk_edit_url and permissions.change %} - - {% endif %} - {% if bulk_delete_url and permissions.delete %} - - {% endif %} -
-
- - -
-
-
-
- {% endwith %} - {% endif %} - - {# Object table controls #} - {% include 'inc/table_controls.html' with table_modal="ObjectTable_config" %} - -
- {% csrf_token %} - - - {# Object table #} -
-
-
- {% render_table table 'inc/table.html' %} -
-
-
- - {# Form buttons #} - {% if permissions.change or permissions.delete %} - {% with bulk_edit_url=content_type.model_class|plugin_validated_viewname:"bulk_edit" bulk_delete_url=content_type.model_class|plugin_validated_viewname:"bulk_delete" %} -
-
- {% block bulk_buttons %}{% endblock %} - {% if bulk_edit_url and permissions.change %} - - {% endif %} - {% if bulk_delete_url and permissions.delete %} - - {% endif %} -
-
- {% endwith %} - {% endif %} - -
- - {# 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 %} -
-
+
+
-
+
Software Product -
+
- + @@ -35,42 +30,15 @@
Name{{ object.name }}{{ object }}
Versions
- {% 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 %}
-
-
Versions
-
- - - - - - - - - {% for version in versions %} - - - - - {% endfor %} - -
NAMEActions
{{ 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 %} -
-
-
+ {% 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 %} -
-
+
+
-
- Software Product -
+
+ Software Product Installation +
+ {% if object.device %} - - + + + + {% else %} + + + + + {% endif %} + + + - - + +
Installation{{ object }}Device{{ object.device }}
Virtualmachine{{ object.virtualmachine }}
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 %} -
-
+
+
-
- Software Product -
+
+ Software Product Version +
@@ -31,48 +26,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 %}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{% 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 %} -
-
-
-
- Zone -
-
- - - - - - - - - -
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):