policies: fix api updating issues

Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
Jens Langhammer 2021-03-31 18:54:36 +02:00
parent c92a2ecbf5
commit 55f68a9197
2 changed files with 37 additions and 9 deletions

View file

@ -1,6 +1,7 @@
"""policy binding API Views""" """policy binding API Views"""
from typing import OrderedDict
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField from rest_framework.serializers import ModelSerializer, PrimaryKeyRelatedField, ValidationError
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from structlog.stdlib import get_logger from structlog.stdlib import get_logger
@ -28,8 +29,8 @@ class PolicyBindingModelForeignKey(PrimaryKeyRelatedField):
# won't return anything. This is because the direct lookup # won't return anything. This is because the direct lookup
# checks the PK of PolicyBindingModel (for example), # checks the PK of PolicyBindingModel (for example),
# but we get given the Primary Key of the inheriting class # but we get given the Primary Key of the inheriting class
for model in self.get_queryset().select_subclasses().all().select_related(): for model in self.get_queryset().select_subclasses().all():
if model.pk == data: if str(model.pk) == data:
return model return model
# as a fallback we still try a direct lookup # as a fallback we still try a direct lookup
return self.get_queryset().get_subclass(pk=data) return self.get_queryset().get_subclass(pk=data)
@ -53,9 +54,9 @@ class PolicyBindingSerializer(ModelSerializer):
required=True, required=True,
) )
policy = PolicySerializer(required=False) policy_obj = PolicySerializer(required=False, read_only=True, source="policy")
group = GroupSerializer(required=False) group_obj = GroupSerializer(required=False, read_only=True, source="group")
user = UserSerializer(required=False) user_obj = UserSerializer(required=False, read_only=True, source="user")
class Meta: class Meta:
@ -65,13 +66,26 @@ class PolicyBindingSerializer(ModelSerializer):
"policy", "policy",
"group", "group",
"user", "user",
"policy_obj",
"group_obj",
"user_obj",
"target", "target",
"enabled", "enabled",
"order", "order",
"timeout", "timeout",
] ]
depth = 2
def validate(self, data: OrderedDict) -> OrderedDict:
"""Check that either policy, group or user is set."""
count = sum([bool(data["policy"]), bool(
data["group"]), bool(data["user"])])
invalid = count > 1
empty = count < 1
if invalid:
raise ValidationError("Only one of 'policy', 'group' or 'user' can be set.")
if empty:
raise ValidationError("One of 'policy', 'group' or 'user' must be set.")
return data
class PolicyBindingViewSet(ModelViewSet): class PolicyBindingViewSet(ModelViewSet):
"""PolicyBinding Viewset""" """PolicyBinding Viewset"""

View file

@ -16006,10 +16006,24 @@ definitions:
format: uuid format: uuid
readOnly: true readOnly: true
policy: policy:
$ref: '#/definitions/Policy' title: Policy
type: string
format: uuid
x-nullable: true
group: group:
$ref: '#/definitions/Group' title: Group
type: string
format: uuid
x-nullable: true
user: user:
title: User
type: integer
x-nullable: true
policy_obj:
$ref: '#/definitions/Policy'
group_obj:
$ref: '#/definitions/Group'
user_obj:
$ref: '#/definitions/User' $ref: '#/definitions/User'
target: target:
title: Target title: Target