admin: add test view for property mappings
This commit is contained in:
parent
ac24fc9ce3
commit
1ab5289e2e
|
@ -0,0 +1,28 @@
|
||||||
|
{% extends 'generic/form.html' %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block above_form %}
|
||||||
|
<h1>{% blocktrans with property_mapping=property_mapping %}Test {{ property_mapping }}{% endblocktrans %}</h1>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block beneath_form %}
|
||||||
|
{% if result %}
|
||||||
|
<div class="pf-c-form__group ">
|
||||||
|
<div class="pf-c-form__group-label">
|
||||||
|
<label class="pf-c-form__label" for="context-1">
|
||||||
|
<span class="pf-c-form__label-text">{% trans 'Result' %}</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="pf-c-form__group-control">
|
||||||
|
<div class="c-form__horizontal-group">
|
||||||
|
<ak-codemirror mode="javascript"><textarea class="pf-c-form-control">{{ result }}</textarea></ak-codemirror>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block action %}
|
||||||
|
{% trans 'Test' %}
|
||||||
|
{% endblock %}
|
|
@ -238,11 +238,6 @@ urlpatterns = [
|
||||||
name="flow-delete",
|
name="flow-delete",
|
||||||
),
|
),
|
||||||
# Property Mappings
|
# Property Mappings
|
||||||
path(
|
|
||||||
"property-mappings/",
|
|
||||||
property_mappings.PropertyMappingListView.as_view(),
|
|
||||||
name="property-mappings",
|
|
||||||
),
|
|
||||||
path(
|
path(
|
||||||
"property-mappings/create/",
|
"property-mappings/create/",
|
||||||
property_mappings.PropertyMappingCreateView.as_view(),
|
property_mappings.PropertyMappingCreateView.as_view(),
|
||||||
|
@ -258,6 +253,11 @@ urlpatterns = [
|
||||||
property_mappings.PropertyMappingDeleteView.as_view(),
|
property_mappings.PropertyMappingDeleteView.as_view(),
|
||||||
name="property-mapping-delete",
|
name="property-mapping-delete",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"property-mappings/<uuid:pk>/test/",
|
||||||
|
property_mappings.PropertyMappingTestView.as_view(),
|
||||||
|
name="property-mapping-test",
|
||||||
|
),
|
||||||
# Users
|
# Users
|
||||||
path("users/", users.UserListView.as_view(), name="users"),
|
path("users/", users.UserListView.as_view(), name="users"),
|
||||||
path("users/create/", users.UserCreateView.as_view(), name="user-create"),
|
path("users/create/", users.UserCreateView.as_view(), name="user-create"),
|
||||||
|
|
|
@ -1,4 +1,12 @@
|
||||||
"""authentik PropertyMapping administration"""
|
"""authentik PropertyMapping administration"""
|
||||||
|
from django.contrib.messages import views
|
||||||
|
from authentik.admin.forms.policies import PolicyTestForm
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from json import dumps
|
||||||
|
from typing import Any
|
||||||
|
from django.db.models import QuerySet
|
||||||
|
from django.views.generic import FormView
|
||||||
|
from django.views.generic.detail import DetailView
|
||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.contrib.auth.mixins import (
|
from django.contrib.auth.mixins import (
|
||||||
PermissionRequiredMixin as DjangoPermissionRequiredMixin,
|
PermissionRequiredMixin as DjangoPermissionRequiredMixin,
|
||||||
|
@ -20,22 +28,6 @@ from authentik.admin.views.utils import (
|
||||||
from authentik.core.models import PropertyMapping
|
from authentik.core.models import PropertyMapping
|
||||||
|
|
||||||
|
|
||||||
class PropertyMappingListView(
|
|
||||||
LoginRequiredMixin,
|
|
||||||
PermissionListMixin,
|
|
||||||
UserPaginateListMixin,
|
|
||||||
SearchListMixin,
|
|
||||||
InheritanceListView,
|
|
||||||
):
|
|
||||||
"""Show list of all property_mappings"""
|
|
||||||
|
|
||||||
model = PropertyMapping
|
|
||||||
permission_required = "authentik_core.view_propertymapping"
|
|
||||||
template_name = "administration/property_mapping/list.html"
|
|
||||||
ordering = "name"
|
|
||||||
search_fields = ["name", "expression"]
|
|
||||||
|
|
||||||
|
|
||||||
class PropertyMappingCreateView(
|
class PropertyMappingCreateView(
|
||||||
SuccessMessageMixin,
|
SuccessMessageMixin,
|
||||||
BackSuccessUrlMixin,
|
BackSuccessUrlMixin,
|
||||||
|
@ -81,3 +73,38 @@ class PropertyMappingDeleteView(
|
||||||
template_name = "generic/delete.html"
|
template_name = "generic/delete.html"
|
||||||
success_url = reverse_lazy("authentik_admin:property-mappings")
|
success_url = reverse_lazy("authentik_admin:property-mappings")
|
||||||
success_message = _("Successfully deleted Property Mapping")
|
success_message = _("Successfully deleted Property Mapping")
|
||||||
|
|
||||||
|
|
||||||
|
class PropertyMappingTestView(LoginRequiredMixin, DetailView, PermissionRequiredMixin, FormView):
|
||||||
|
"""View to test property mappings"""
|
||||||
|
|
||||||
|
model = PropertyMapping
|
||||||
|
form_class = PolicyTestForm
|
||||||
|
permission_required = "authentik_core.view_propertymapping"
|
||||||
|
template_name = "administration/property_mapping/test.html"
|
||||||
|
object = None
|
||||||
|
|
||||||
|
def get_object(self, queryset=None) -> PropertyMapping:
|
||||||
|
return (
|
||||||
|
PropertyMapping.objects.filter(pk=self.kwargs.get("pk")).select_subclasses().first()
|
||||||
|
)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
|
||||||
|
kwargs["property_mapping"] = self.get_object()
|
||||||
|
return super().get_context_data(**kwargs)
|
||||||
|
|
||||||
|
def post(self, *args, **kwargs) -> HttpResponse:
|
||||||
|
self.object = self.get_object()
|
||||||
|
return super().post(*args, **kwargs)
|
||||||
|
|
||||||
|
def form_valid(self, form: PolicyTestForm) -> HttpResponse:
|
||||||
|
mapping = self.get_object()
|
||||||
|
user = form.cleaned_data.get("user")
|
||||||
|
|
||||||
|
context = self.get_context_data(form=form)
|
||||||
|
try:
|
||||||
|
result = mapping.evaluate(user, self.request, **form.cleaned_data.get("context", {}))
|
||||||
|
context["result"] = dumps(result, indent=4)
|
||||||
|
except Exception as exc: # pylint: disable=broad-except
|
||||||
|
context["result"] = str(exc)
|
||||||
|
return self.render_to_response(context)
|
||||||
|
|
|
@ -54,13 +54,19 @@ export class PropertyMappingListPage extends TablePage<PropertyMapping> {
|
||||||
html`
|
html`
|
||||||
<ak-modal-button href="${PropertyMapping.adminUrl(`${item.pk}/update/`)}">
|
<ak-modal-button href="${PropertyMapping.adminUrl(`${item.pk}/update/`)}">
|
||||||
<ak-spinner-button slot="trigger" class="pf-m-secondary">
|
<ak-spinner-button slot="trigger" class="pf-m-secondary">
|
||||||
Edit
|
${gettext("Edit")}
|
||||||
|
</ak-spinner-button>
|
||||||
|
<div slot="modal"></div>
|
||||||
|
</ak-modal-button>
|
||||||
|
<ak-modal-button href="${PropertyMapping.adminUrl(`${item.pk}/test/`)}">
|
||||||
|
<ak-spinner-button slot="trigger" class="pf-m-secondary">
|
||||||
|
${gettext("Test")}
|
||||||
</ak-spinner-button>
|
</ak-spinner-button>
|
||||||
<div slot="modal"></div>
|
<div slot="modal"></div>
|
||||||
</ak-modal-button>
|
</ak-modal-button>
|
||||||
<ak-modal-button href="${PropertyMapping.adminUrl(`${item.pk}/delete/`)}">
|
<ak-modal-button href="${PropertyMapping.adminUrl(`${item.pk}/delete/`)}">
|
||||||
<ak-spinner-button slot="trigger" class="pf-m-danger">
|
<ak-spinner-button slot="trigger" class="pf-m-danger">
|
||||||
Delete
|
${gettext("Delete")}
|
||||||
</ak-spinner-button>
|
</ak-spinner-button>
|
||||||
<div slot="modal"></div>
|
<div slot="modal"></div>
|
||||||
</ak-modal-button>
|
</ak-modal-button>
|
||||||
|
|
Reference in New Issue