core: fix form not showing general errors

This commit is contained in:
Jens Langhammer 2020-06-01 19:07:10 +02:00
parent 82d12ecfdf
commit fe1ff7fc76
4 changed files with 24 additions and 8 deletions

View File

@ -2,6 +2,13 @@
{% load i18n %} {% load i18n %}
{% csrf_token %} {% csrf_token %}
{% if form.non_field_errors %}
<div class="pf-c-form__group has-error">
<p class="pf-c-form__helper-text pf-m-error">
{{ form.non_field_errors }}
</p>
</div>
{% endif %}
{% for field in form %} {% for field in form %}
<div class="pf-c-form__group {% if field.errors %} has-error {% endif %}"> <div class="pf-c-form__group {% if field.errors %} has-error {% endif %}">
{% if field.field.widget|fieldtype == 'RadioSelect' %} {% if field.field.widget|fieldtype == 'RadioSelect' %}

View File

@ -1,6 +1,6 @@
"""passbook expression policy evaluator""" """passbook expression policy evaluator"""
import re import re
from typing import TYPE_CHECKING, Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.http import HttpRequest from django.http import HttpRequest
@ -10,14 +10,12 @@ from jinja2.nativetypes import NativeEnvironment
from requests import Session from requests import Session
from structlog import get_logger from structlog import get_logger
from passbook.core.models import User
from passbook.flows.planner import PLAN_CONTEXT_SSO from passbook.flows.planner import PLAN_CONTEXT_SSO
from passbook.flows.views import SESSION_KEY_PLAN from passbook.flows.views import SESSION_KEY_PLAN
from passbook.lib.utils.http import get_client_ip from passbook.lib.utils.http import get_client_ip
from passbook.policies.types import PolicyRequest, PolicyResult from passbook.policies.types import PolicyRequest, PolicyResult
if TYPE_CHECKING:
from passbook.core.models import User
LOGGER = get_logger() LOGGER = get_logger()
@ -43,6 +41,7 @@ class Evaluator:
self._env.globals["pb_message"] = self.jinja2_func_message self._env.globals["pb_message"] = self.jinja2_func_message
self._context = { self._context = {
"pb_is_group_member": Evaluator.jinja2_func_is_group_member, "pb_is_group_member": Evaluator.jinja2_func_is_group_member,
"pb_user_by": Evaluator.jinja2_func_user_by,
"pb_logger": get_logger(), "pb_logger": get_logger(),
"requests": Session(), "requests": Session(),
} }
@ -64,7 +63,15 @@ class Evaluator:
return re.sub(regex, repl, value) return re.sub(regex, repl, value)
@staticmethod @staticmethod
def jinja2_func_is_group_member(user: "User", group_name: str) -> bool: def jinja2_func_user_by(**filters) -> Optional[User]:
"""Get user by filters"""
users = User.objects.filter(**filters)
if users:
return users.first()
return None
@staticmethod
def jinja2_func_is_group_member(user: User, group_name: str) -> bool:
"""Check if `user` is member of group with name `group_name`""" """Check if `user` is member of group with name `group_name`"""
return user.groups.filter(name=group_name).exists() return user.groups.filter(name=group_name).exists()
@ -126,4 +133,4 @@ class Evaluator:
self._env.from_string(expression) self._env.from_string(expression)
return True return True
except TemplateSyntaxError as exc: except TemplateSyntaxError as exc:
raise ValidationError("Expression Syntax Error") from exc raise ValidationError(f"Expression Syntax Error: {str(exc)}") from exc

View File

@ -39,4 +39,6 @@ class PolicyResult:
self.messages = messages self.messages = messages
def __str__(self): def __str__(self):
return f"<PolicyResult passing={self.passing}>" if self.messages:
return f"PolicyResult passing={self.passing} messages={self.messages}"
return f"PolicyResult passing={self.passing}"

View File

@ -64,4 +64,4 @@ class PromptForm(forms.Form):
engine.build() engine.build()
result = engine.result result = engine.result
if not result.passing: if not result.passing:
raise forms.ValidationError(result.messages) raise forms.ValidationError(list(result.messages))