diff --git a/geonode/layers/api/serializers.py b/geonode/layers/api/serializers.py index 3d39fdefe20..864e2af1c73 100644 --- a/geonode/layers/api/serializers.py +++ b/geonode/layers/api/serializers.py @@ -17,7 +17,7 @@ # ######################################################################### from rest_framework import serializers - +from rest_framework.exceptions import ValidationError, ParseError from urllib.parse import urlparse from django.conf import settings @@ -195,6 +195,37 @@ class Meta: featureinfo_custom_template = FeatureInfoTemplateField() + def update(self, instance, validated_data): + super().update(instance, validated_data) + + # Handle updates to attribute_set + allowed_fields = ["pk", "description", "attribute_label", "visible", "display_order"] + if "blob" in validated_data and "attribute_set" in validated_data["blob"]: + attributes = validated_data["blob"]["attribute_set"] + + for attribute in attributes: + for field, _ in attribute.items(): + if field not in allowed_fields: + raise ValidationError( + f"{field} is not one of the fields that could be edited directly. \ + Only {str(allowed_fields)} are allowed" + ) + + for attribute in attributes: + try: + if "pk" in attribute: + attribute_instance = Attribute.objects.get(pk=attribute["pk"], dataset=instance) + for field, value in attribute.items(): + setattr(attribute_instance, field, value) + attribute_instance.save() + else: + raise Exception("Primary key of the attribute to be patched not specified") + except Exception as e: + logger.error(e) + raise ParseError(str(e)) + + return instance + class DatasetListSerializer(DatasetSerializer): class Meta(DatasetSerializer.Meta):