2 Commits
7 changed files with 21 additions and 12 deletions
+3 -3
View File
@@ -9,7 +9,7 @@ Software Lifecycle Management
Installation Guide Installation Guide
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
WARNING: This plugin requires Netbox 3.1.X or higher! WARNING: This plugin is only tested with Netbox 3.2 at this time.
When using the Docker version of Netbox, first follow the `netbox-docker When using the Docker version of Netbox, first follow the `netbox-docker
quickstart <https://github.com/netbox-community/netbox-docker#quickstart>`__ quickstart <https://github.com/netbox-community/netbox-docker#quickstart>`__
@@ -22,13 +22,13 @@ to install the Netbox SLM plugin:
1. Add ``netbox_slm`` to the ``PLUGINS`` list in 1. Add ``netbox_slm`` to the ``PLUGINS`` list in
``configuration/extra.py``. ``configuration/extra.py``.
2. Create a ``plugin_requirements.txt`` with ``netbox-slm==0.95`` as 2. Create a ``plugin_requirements.txt`` with ``netbox-slm==0.97`` as
contents. contents.
3. Create a ``Dockerfile-SLM`` with contents: 3. Create a ``Dockerfile-SLM`` with contents:
.. code:: dockerfile .. code:: dockerfile
FROM netboxcommunity/netbox:v3.X.X FROM netboxcommunity/netbox:v3.2.X
COPY ./plugin_requirements.txt / COPY ./plugin_requirements.txt /
RUN /opt/netbox/venv/bin/pip install --no-warn-script-location -r /plugin_requirements.txt RUN /opt/netbox/venv/bin/pip install --no-warn-script-location -r /plugin_requirements.txt
+1 -1
View File
@@ -5,7 +5,7 @@ class SLMConfig(PluginConfig):
name = 'netbox_slm' name = 'netbox_slm'
verbose_name = 'Software Lifecycle Management' verbose_name = 'Software Lifecycle Management'
description = 'Software Lifecycle Management' description = 'Software Lifecycle Management'
version = '0.96' version = '0.97'
author = 'Hedde van der Heide' author = 'Hedde van der Heide'
author_email = 'hedde.vanderheide@ictu.nl' author_email = 'hedde.vanderheide@ictu.nl'
base_url = 'slm' base_url = 'slm'
-6
View File
@@ -17,7 +17,6 @@ class SoftwareProduct(NetBoxModel):
manufacturer = models.ForeignKey( manufacturer = models.ForeignKey(
to='dcim.Manufacturer', to='dcim.Manufacturer',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='software_products',
null=True, blank=True null=True, blank=True
) )
@@ -42,7 +41,6 @@ class SoftwareProductVersion(NetBoxModel):
software_product = models.ForeignKey( software_product = models.ForeignKey(
to='netbox_slm.SoftwareProduct', to='netbox_slm.SoftwareProduct',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='softwareproduct_versions'
) )
name = models.CharField(max_length=64) name = models.CharField(max_length=64)
@@ -67,26 +65,22 @@ class SoftwareProductInstallation(NetBoxModel):
device = models.ForeignKey( device = models.ForeignKey(
to='dcim.Device', to='dcim.Device',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='softwareproduct_installations',
null=True, null=True,
blank=True blank=True
) )
virtualmachine = models.ForeignKey( virtualmachine = models.ForeignKey(
to='virtualization.VirtualMachine', to='virtualization.VirtualMachine',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='softwareproduct_installations',
null = True, null = True,
blank = True blank = True
) )
software_product = models.ForeignKey( software_product = models.ForeignKey(
to='netbox_slm.SoftwareProduct', to='netbox_slm.SoftwareProduct',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='software_products'
) )
version = models.ForeignKey( version = models.ForeignKey(
to='netbox_slm.SoftwareProductVersion', to='netbox_slm.SoftwareProductVersion',
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='softwareproduct_versions'
) )
objects = RestrictedQuerySet.as_manager() objects = RestrictedQuerySet.as_manager()
+13
View File
@@ -1,5 +1,6 @@
import django_tables2 as tables import django_tables2 as tables
from django.db.models import Count
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation from netbox_slm.models import SoftwareProduct, SoftwareProductVersion, SoftwareProductInstallation
from netbox.tables import NetBoxTable, ChoiceFieldColumn, ToggleColumn, columns from netbox.tables import NetBoxTable, ChoiceFieldColumn, ToggleColumn, columns
@@ -45,6 +46,12 @@ class SoftwareProductTable(NetBoxTable):
"installations", "installations",
) )
def order_installations(self, queryset, is_descending):
queryset = queryset.annotate(
count=Count('softwareproductinstallation__id')
).order_by(("-" if is_descending else "") + "count")
return queryset, True
class SoftwareProductVersionTable(NetBoxTable): class SoftwareProductVersionTable(NetBoxTable):
"""Table for displaying SoftwareProductVersion objects.""" """Table for displaying SoftwareProductVersion objects."""
@@ -90,6 +97,12 @@ class SoftwareProductVersionTable(NetBoxTable):
"installations", "installations",
) )
def order_installations(self, queryset, is_descending):
queryset = queryset.annotate(
count=Count('softwareproductinstallation__id')
).order_by(("-" if is_descending else "") + "count")
return queryset, True
class SoftwareProductInstallationTable(NetBoxTable): class SoftwareProductInstallationTable(NetBoxTable):
"""Table for displaying SoftwareProductInstallation objects.""" """Table for displaying SoftwareProductInstallation objects."""
@@ -24,6 +24,8 @@
<a href="{% url 'plugins:netbox_slm:softwareproductversion' pk=version.pk %}"> <a href="{% url 'plugins:netbox_slm:softwareproductversion' pk=version.pk %}">
<span class="badge" style="color: #ffffff; background-color: #9e9e9e">{{ version }}</span> <span class="badge" style="color: #ffffff; background-color: #9e9e9e">{{ version }}</span>
</a> </a>
{% empty %}
n/a
{% endfor %} {% endfor %}
</td> </td>
</tr> </tr>
+1 -1
View File
@@ -28,7 +28,7 @@ class SoftwareProductView(generic.ObjectView):
queryset = SoftwareProduct.objects.all() queryset = SoftwareProduct.objects.all()
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
versions = instance.softwareproduct_versions.all() versions = instance.softwareproductversion_set.all()
return {"versions": versions} return {"versions": versions}
+1 -1
View File
@@ -1,6 +1,6 @@
[metadata] [metadata]
name = netbox-slm name = netbox-slm
version = 0.96 version = 0.97
description = Software Lifecycle Management Netbox Plugin. description = Software Lifecycle Management Netbox Plugin.
# long_description = file: README.rst # long_description = file: README.rst
# long_description_content_type='text/x-rst' # long_description_content_type='text/x-rst'