authentik.lib.validators

Serializer validators

 1"""Serializer validators"""
 2
 3from django.utils.translation import gettext_lazy as _
 4from rest_framework.exceptions import ValidationError
 5from rest_framework.serializers import Serializer
 6from rest_framework.utils.representation import smart_repr
 7
 8
 9class RequiredTogetherValidator:
10    """Serializer-level validator that ensures all fields in `fields` are only
11    used together"""
12
13    fields: list[str]
14    requires_context = True
15    message = _("The fields {field_names} must be used together.")
16
17    def __init__(self, fields: list[str], message: str | None = None) -> None:
18        self.fields = fields
19        self.message = message or self.message
20
21    def __call__(self, attrs: dict, serializer: Serializer):
22        """Check that if any of the fields in `self.fields` are set, all of them must be set"""
23        if any(field in attrs for field in self.fields) and not all(
24            field in attrs for field in self.fields
25        ):
26            field_names = ", ".join(self.fields)
27            message = self.message.format(field_names=field_names)
28            raise ValidationError(message, code="required")
29
30    def __repr__(self):
31        return f"<{self.__class__.__name__}(fields={smart_repr(self.fields)})>"
class RequiredTogetherValidator:
10class RequiredTogetherValidator:
11    """Serializer-level validator that ensures all fields in `fields` are only
12    used together"""
13
14    fields: list[str]
15    requires_context = True
16    message = _("The fields {field_names} must be used together.")
17
18    def __init__(self, fields: list[str], message: str | None = None) -> None:
19        self.fields = fields
20        self.message = message or self.message
21
22    def __call__(self, attrs: dict, serializer: Serializer):
23        """Check that if any of the fields in `self.fields` are set, all of them must be set"""
24        if any(field in attrs for field in self.fields) and not all(
25            field in attrs for field in self.fields
26        ):
27            field_names = ", ".join(self.fields)
28            message = self.message.format(field_names=field_names)
29            raise ValidationError(message, code="required")
30
31    def __repr__(self):
32        return f"<{self.__class__.__name__}(fields={smart_repr(self.fields)})>"

Serializer-level validator that ensures all fields in fields are only used together

RequiredTogetherValidator(fields: list[str], message: str | None = None)
18    def __init__(self, fields: list[str], message: str | None = None) -> None:
19        self.fields = fields
20        self.message = message or self.message
fields: list[str]
requires_context = True
message = 'The fields {field_names} must be used together.'