Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Verified Commit 5e8b4880 authored by Vincent SIMONIN's avatar Vincent SIMONIN
Browse files

Add HTTP Header UI

* Add HTTP Header for a Mapping
* Remove / edit HTTP Header
parent ca1ea07d
No related branches found
No related tags found
1 merge request!18Add HTTP Header UI
Pipeline #69331 passed
Showing
with 119 additions and 57 deletions
......@@ -5,7 +5,7 @@ class NetBoxRpsConfig(PluginConfig):
name = 'netbox_rps_plugin'
verbose_name = 'NetBox RPS'
description = 'A Netbox plugin to add RPS resources'
version = '0.7.1'
version = '0.8.0'
author = "Vincent Simonin"
author_email = "vincent.simonin@ext.ec.europa.eu"
base_url = 'rps'
......
from netbox.filtersets import NetBoxModelFilterSet
from .models import Mapping
from .models import Mapping, HttpHeader
from django.db.models import Q
class MappingFilterSet(NetBoxModelFilterSet):
......@@ -9,5 +9,20 @@ class MappingFilterSet(NetBoxModelFilterSet):
fields = ('id', 'authentication', 'source', 'target', 'Comment')
def search(self, queryset, name, value):
return queryset.filter( Q(source__icontains=value) | Q(target__icontains=value)
return queryset.filter( Q(source__icontains=value) | Q(target__icontains=value)
| Q(authentication__icontains=value) | Q(Comment__icontains=value))
class HttpHeaderFilterSet(NetBoxModelFilterSet):
class Meta:
model = HttpHeader
fields = ('id', 'name', 'value', 'apply_to')
def search(self, queryset, name, value):
"""Perform the filtered search."""
if not value.strip():
return queryset
qs_filter = (
Q(name__icontains=value)
)
return queryset.filter(qs_filter)
from django import forms
from django.utils.translation import gettext as _
from netbox.forms import NetBoxModelForm, NetBoxModelFilterSetForm, NetBoxModelImportForm
from .models import Mapping, AuthenticationChoices
from .models import Mapping, AuthenticationChoices, HttpHeader
class MappingForm(NetBoxModelForm):
......@@ -33,3 +33,18 @@ class MappingImportForm(NetBoxModelImportForm):
class Meta:
model = Mapping
fields = ('source', 'target', 'authentication', 'testingpage', 'webdav')
class HttpHeaderForm(NetBoxModelForm):
class Meta:
model = HttpHeader
fields = (
'mapping', 'name', 'value', 'apply_to'
)
labels = {
'mapping': 'Mapping',
'name': 'Name',
'value': 'Value',
'apply_to': 'Apply to',
}
......@@ -101,3 +101,6 @@ class HttpHeader(NetBoxModel):
class Meta:
unique_together = ['mapping', 'name', 'apply_to']
ordering = ['name']
def __str__(self):
return self.name
......@@ -32,4 +32,3 @@ menu = (
icon_class='mdi mdi-graph-outline'
)
)
......@@ -21,11 +21,12 @@ class HttpHeaderTable(NetBoxTable):
mapping = tables.Column(
linkify=True
)
class Meta(NetBoxTable.Meta):
model = HttpHeader
fields = (
'pk', 'id', 'name', 'value', 'apply_to', 'mapping'
)
default_columns = (
'name', 'value'
'name', 'value', 'apply_to'
)
{% extends 'generic/object.html' %}
{% load render_table from django_tables2 %}
{% block content %}
<div class="row mb-3">
<div class="col col-md-6">
<div class="card">
<h5 class="card-header">Access List</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">Default Action</th>
<td>{{ object.get_default_action_display }}</td>
</tr>
<tr>
<th scope="row">Rules</th>
<td>{{ object.rules.count }}</td>
</tr>
</table>
</div>
</div>
{% include 'inc/panels/custom_fields.html' %}
</div>
<div class="col col-md-6">
{% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %}
</div>
</div>
<div class="row">
<div class="col col-md-12">
<div class="card">
<h5 class="card-header">Rules</h5>
<div class="card-body table-responsive">
{% render_table rules_table %}
</div>
</div>
</div>
</div>
{% endblock content %}
{% extends 'generic/object.html' %}
{% load helpers %}
{% load render_table from django_tables2 %}
{% load perms %}
{% block extra_controls %}
<a href="{% url 'plugins:netbox_rps_plugin:httpheader_add' %}?mapping={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-primary">
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add HTTP Header
</a>
{% endblock %}
{% block content %}
{% include 'inc/table_controls_htmx.html' with table_modal="HttpHeaderTable_config" %}
<form method="post">
{% csrf_token %}
<input type="hidden" name="return_url" value="{% if return_url %}{{ return_url }}{% else %}{{ request.path }}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}{% endif %}" />
<div class="card">
<div class="card-body htmx-container table-responsive" id="object_list">
{% include 'htmx/table.html' %}
</div>
</div>
<div class="noprint bulk-buttons">
<div class="bulk-button-group">
{% if 'bulk_delete' in actions %}
<button type="submit" name="_delete" formaction="{% url 'plugins:netbox_rps_plugin:httpheaders_bulk_delete' %}?return_url={% url 'plugins:netbox_rps_plugin:mapping_httpheader' pk=object.pk %}" class="btn btn-danger btn-sm">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
</button>
{% endif %}
</div>
</div>
</form>
{% endblock %}
{% block modals %}
{{ block.super }}
{% table_config_form table %}
{% endblock modals %}
{% extends 'generic/object.html' %}
{% block extra_controls %}
<a href="{% url 'plugins:netbox_rps_plugin:httpheader_add' %}?mapping={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-sm btn-primary">
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add HTTP Header
</a>
{% endblock %}
{% block content %}
<div class="row mb-3">
<div class="col col-md-6">
......
......@@ -19,5 +19,11 @@ urlpatterns = (
}),
# HTTP Headers
#path('http-headers/', views.MappingHttpHeadersView.as_view(), name='httpheaders_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>/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
}),
)
......@@ -5,7 +5,7 @@ from utilities.views import ViewTab, register_model_view
from django.utils.translation import gettext as _
class MappingView(generic.ObjectView):
queryset = models.Mapping.objects.all()
queryset = models.Mapping.objects.all().prefetch_related('http_headers')
class MappingListView(generic.ObjectListView):
......@@ -35,14 +35,35 @@ class MappingBulkDeleteView(generic.BulkDeleteView):
table = tables.MappingTable
#@register_model_view(models.Mapping, 'HTTP Headers', path='http-headers')
@register_model_view(models.Mapping, 'httpheader')
class MappingHttpHeadersView(generic.ObjectChildrenView):
queryset = models.Mapping.objects.all()
queryset = models.Mapping.objects.all().prefetch_related('http_headers')
child_model = models.HttpHeader
table = tables.HttpHeaderTable
filterset = filtersets.HttpHeaderFilterSet
template_name = "netbox_rps_plugin/httpheader/child.html"
hide_if_empty = False
tab = ViewTab(
label=_('HTTP Headers')
label=_('HTTP Headers'),
badge=lambda obj: obj.http_headers.count(),
hide_if_empty=False,
)
def get_children(self, request, parent):
return models.HttpHeader.objects.restrict(request.user, 'view').filter(mapping=parent)
return parent.http_headers
class HttpHeaderEditView(generic.ObjectEditView):
queryset = models.HttpHeader.objects.all()
form = forms.HttpHeaderForm
class HttpHeaderDeleteView(generic.ObjectDeleteView):
queryset = models.HttpHeader.objects.all()
class HttpHeaderBulkDeleteView(generic.BulkDeleteView):
queryset = models.HttpHeader.objects.all()
filterset = filtersets.HttpHeaderFilterSet
table = tables.HttpHeaderTable
......@@ -2,7 +2,7 @@ from setuptools import find_packages, setup
setup(
name='netbox-rps-plugin',
version='0.7.1',
version='0.8.0',
description='A Netbox plugin to add RPS resources',
install_requires=[],
packages=find_packages(),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment