From 4b81d08ec6fdb0c81fbb2ff92fb5de6e7b690677 Mon Sep 17 00:00:00 2001 From: Vincent Simonin <vincent.simonin@ext.ec.europa.eu> Date: Tue, 4 Jul 2023 18:54:19 +0200 Subject: [PATCH] Add navigation helper * Journal is available for Mapping and HTTP Header * Add some navigation helper in tables --- .../netbox_rps_plugin/models.py | 3 ++ .../netbox_rps_plugin/tables.py | 13 ++++++--- .../netbox_rps_plugin/httpheader.html | 29 +++++++++++++++++++ .../netbox_rps_plugin/urls.py | 10 ++++++- .../netbox_rps_plugin/views.py | 17 ++++++++++- 5 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 plugins/netbox-rps-plugin/netbox_rps_plugin/templates/netbox_rps_plugin/httpheader.html diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py index c678b16..d3d8d0e 100644 --- a/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/models.py @@ -104,3 +104,6 @@ class HttpHeader(NetBoxModel): def __str__(self): return self.name + + def get_absolute_url(self): + return reverse('plugins:netbox_rps_plugin:httpheader', args=[self.pk]) diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/tables.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/tables.py index de29258..8dcc4ee 100644 --- a/plugins/netbox-rps-plugin/netbox_rps_plugin/tables.py +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/tables.py @@ -1,24 +1,29 @@ import django_tables2 as tables -from netbox.tables import NetBoxTable, ChoiceFieldColumn +from netbox.tables import NetBoxTable, ChoiceFieldColumn, columns from .models import Mapping, HttpHeader class MappingTable(NetBoxTable): authentication = ChoiceFieldColumn() source = tables.Column(linkify=True) + httpheader_count = columns.LinkedCountColumn( + viewname='plugins:netbox_rps_plugin:httpheader_list', + url_params={'mapping_id': 'pk'}, + verbose_name='HTTP Headers count' + ) class Meta(NetBoxTable.Meta): model = Mapping fields = ( - 'pk', 'id', 'source', 'target', 'authentication', 'testingpage', 'webdav', 'Comment' + 'pk', 'id', 'source', 'target', 'authentication', 'testingpage', 'webdav', 'Comment', 'httpheader_count' ) default_columns = ( - 'source', 'target', 'authentication', 'Comment' + 'source', 'target', 'authentication', 'Comment', 'httpheader_count' ) class HttpHeaderTable(NetBoxTable): - mapping = tables.Column( + name = tables.Column( linkify=True ) diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/templates/netbox_rps_plugin/httpheader.html b/plugins/netbox-rps-plugin/netbox_rps_plugin/templates/netbox_rps_plugin/httpheader.html new file mode 100644 index 0000000..3bfad69 --- /dev/null +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/templates/netbox_rps_plugin/httpheader.html @@ -0,0 +1,29 @@ +{% extends 'generic/object.html' %} + +{% block content %} + <div class="row mb-3"> + <div class="col col-md-6"> + <div class="card"> + <h5 class="card-header">HEADERS</h5> + <div class="card-body"> + <table class="table table-hover attr-table"> + <tr> + <th scope="row">Name</th> + <td>{{ object.name }}</td> + </tr> + <tr> + <th scope="row">Value</th> + <td>{{ object.value }}</td> + </tr> + <tr> + <th scope="row">Apply To</th> + <td>{{ object.apply_to }}</td> + </tr> + </table> + </div> + </div> + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + </div> + </div> +{% endblock content %} diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/urls.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/urls.py index 47afe99..dbe1e7d 100644 --- a/plugins/netbox-rps-plugin/netbox_rps_plugin/urls.py +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/urls.py @@ -1,6 +1,6 @@ from django.urls import path from netbox_rps_plugin import views, models -from netbox.views.generic import ObjectChangeLogView +from netbox.views.generic import ObjectChangeLogView, ObjectJournalView urlpatterns = ( @@ -17,13 +17,21 @@ urlpatterns = ( path('mappings/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='mapping_changelog', kwargs={ 'model': models.Mapping }), + path('mappings/<int:pk>/journal/', ObjectJournalView.as_view(), name='mapping_journal', kwargs={ + 'model': models.Mapping + }), # HTTP Headers + path('http-headers/', views.HttpHeaderListView.as_view(), name='httpheader_list'), path('http-headers/add/', views.HttpHeaderEditView.as_view(), name='httpheader_add'), path('http-headers/delete/', views.HttpHeaderBulkDeleteView.as_view(), name='httpheaders_bulk_delete'), + path('http-headers/<int:pk>/', views.HttpHeaderView.as_view(), name='httpheader'), path('http-headers/<int:pk>/edit/', views.HttpHeaderEditView.as_view(), name='httpheader_edit'), path('http-headers/<int:pk>/delete/', views.HttpHeaderDeleteView.as_view(), name='httpheader_delete'), path('http-headers/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='httpheader_changelog', kwargs={ 'model': models.HttpHeader }), + path('http-headers/<int:pk>/journal/', ObjectJournalView.as_view(), name='httpheader_journal', kwargs={ + 'model': models.Mapping + }), ) diff --git a/plugins/netbox-rps-plugin/netbox_rps_plugin/views.py b/plugins/netbox-rps-plugin/netbox_rps_plugin/views.py index 5211b30..063c3ee 100644 --- a/plugins/netbox-rps-plugin/netbox_rps_plugin/views.py +++ b/plugins/netbox-rps-plugin/netbox_rps_plugin/views.py @@ -4,12 +4,16 @@ from netbox_rps_plugin import forms, tables, filtersets, models from utilities.views import ViewTab, register_model_view from django.utils.translation import gettext as _ + class MappingView(generic.ObjectView): queryset = models.Mapping.objects.all().prefetch_related('http_headers') class MappingListView(generic.ObjectListView): - queryset = models.Mapping.objects.all() + #queryset = models.Mapping.objects.all() + queryset = models.Mapping.objects.annotate( + httpheader_count=count_related(models.HttpHeader, 'mapping') + ) table = tables.MappingTable filterset = filtersets.MappingFilterSet filterset_form = forms.MappingFilterForm @@ -54,6 +58,17 @@ class MappingHttpHeadersView(generic.ObjectChildrenView): return parent.http_headers +class HttpHeaderView(generic.ObjectView): + queryset = models.HttpHeader.objects.all() + + +class HttpHeaderListView(generic.ObjectListView): + queryset = models.HttpHeader.objects.all() + table = tables.HttpHeaderTable + filterset = filtersets.HttpHeaderFilterSet + filterset_form = forms.HttpHeaderForm + + class HttpHeaderEditView(generic.ObjectEditView): queryset = models.HttpHeader.objects.all() form = forms.HttpHeaderForm -- GitLab