policies: add policy_obj to Binding API

This commit is contained in:
Jens Langhammer 2020-11-29 13:57:35 +01:00
parent 66b3635648
commit 2417d5a59e
3 changed files with 43 additions and 25 deletions

View file

@ -65,7 +65,10 @@ class FlowImporter:
return value
for key, value in attrs.items():
if isinstance(value, (list, dict)):
if isinstance(value, dict):
for idx, _inner_key in enumerate(value):
value[_inner_key] = updater(value[_inner_key])
elif isinstance(value, list):
for idx, _inner_value in enumerate(value):
attrs[key][idx] = updater(_inner_value)
else:
@ -97,6 +100,10 @@ class FlowImporter:
# Because a model might have multiple unique columns, we chain all identifiers together
# to create an OR query.
updated_identifiers = self.__update_pks_for_attrs(entry.identifiers)
for key, value in list(updated_identifiers.items()):
if isinstance(value, dict) and "pk" in value:
del updated_identifiers[key]
updated_identifiers[f"{key}"] = value["pk"]
existing_models = model.objects.filter(
self.__query_from_identifier(updated_identifiers)
)

View file

@ -41,30 +41,6 @@ class PolicyBindingModelForeignKey(PrimaryKeyRelatedField):
return correct_model.pk
class PolicyBindingSerializer(ModelSerializer):
"""PolicyBinding Serializer"""
# Because we're not interested in the PolicyBindingModel's PK but rather the subclasses PK,
# we have to manually declare this field
target = PolicyBindingModelForeignKey(
queryset=PolicyBindingModel.objects.select_subclasses(),
required=True,
)
class Meta:
model = PolicyBinding
fields = ["pk", "policy", "target", "enabled", "order", "timeout"]
class PolicyBindingViewSet(ModelViewSet):
"""PolicyBinding Viewset"""
queryset = PolicyBinding.objects.all()
serializer_class = PolicyBindingSerializer
filterset_fields = ["policy", "target", "enabled", "order", "timeout"]
class PolicySerializer(ModelSerializer):
"""Policy Serializer"""
@ -74,10 +50,17 @@ class PolicySerializer(ModelSerializer):
"""Get object type so that we know which API Endpoint to use to get the full object"""
return obj._meta.object_name.lower().replace("policy", "")
def to_representation(self, instance: Policy):
# pyright: reportGeneralTypeIssues=false
if instance.__class__ == Policy:
return super().to_representation(instance)
return instance.serializer(instance=instance).data
class Meta:
model = Policy
fields = ["pk"] + GENERAL_FIELDS + ["__type__"]
depth = 3
class PolicyViewSet(ReadOnlyModelViewSet):
@ -88,3 +71,29 @@ class PolicyViewSet(ReadOnlyModelViewSet):
def get_queryset(self):
return Policy.objects.select_subclasses()
class PolicyBindingSerializer(ModelSerializer):
"""PolicyBinding Serializer"""
# Because we're not interested in the PolicyBindingModel's PK but rather the subclasses PK,
# we have to manually declare this field
target = PolicyBindingModelForeignKey(
queryset=PolicyBindingModel.objects.select_subclasses(),
required=True,
)
policy_obj = PolicySerializer(read_only=True, source="policy")
class Meta:
model = PolicyBinding
fields = ["pk", "policy", "policy_obj", "target", "enabled", "order", "timeout"]
class PolicyBindingViewSet(ModelViewSet):
"""PolicyBinding Viewset"""
queryset = PolicyBinding.objects.all()
serializer_class = PolicyBindingSerializer
filterset_fields = ["policy", "target", "enabled", "order", "timeout"]

View file

@ -7058,6 +7058,8 @@ definitions:
title: Policy
type: string
format: uuid
policy_obj:
$ref: '#/definitions/Policy'
target:
title: Target
type: string