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

Skip to content
Snippets Groups Projects
Verified Commit 5795bfbd 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
No related merge requests found
Pipeline #69330 passed
Showing
with 117 additions and 55 deletions
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
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