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