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

Skip to content
Snippets Groups Projects
Commit 11196a6f authored by Laurent VENIER's avatar Laurent VENIER :speech_balloon:
Browse files

Merge branch 'add_httpheader_ui' into 'main'

Add HTTP Header UI

See merge request !18
parents ca1ea07d 5e8b4880
No related branches found
No related tags found
1 merge request!18Add HTTP Header UI
Pipeline #69481 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