From de463be8828fe4f458537042d185008b51ee5939 Mon Sep 17 00:00:00 2001 From: Novak Zaballa Date: Wed, 6 Mar 2024 11:14:45 -0400 Subject: [PATCH] Correct the Segment serializer to validate if the metadata is required --- api/segments/serializers.py | 36 +++++++++++++++++++++--------------- api/segments/views.py | 11 +---------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/api/segments/serializers.py b/api/segments/serializers.py index e2c91e57d8fd..7bbb762eb245 100644 --- a/api/segments/serializers.py +++ b/api/segments/serializers.py @@ -9,7 +9,7 @@ from rest_framework_recursive.fields import RecursiveField from metadata.models import Metadata -from metadata.serializers import MetadataSerializer +from metadata.serializers import MetadataSerializer, SerializerWithMetadata from projects.models import Project from segments.models import Condition, Segment, SegmentRule @@ -43,7 +43,7 @@ class Meta: fields = ("id", "type", "rules", "conditions", "delete") -class SegmentSerializer(serializers.ModelSerializer): +class SegmentSerializer(serializers.ModelSerializer, SerializerWithMetadata): rules = RuleSerializer(many=True) metadata = MetadataSerializer(required=False, many=True) @@ -52,12 +52,17 @@ class Meta: fields = "__all__" def validate(self, attrs): + attrs = super().validate(attrs) + self.validate_required_metadata(attrs) if not attrs.get("rules"): raise ValidationError( {"rules": "Segment cannot be created without any rules."} ) return attrs + def get_project(self, validated_data: dict = None) -> Project: + return validated_data.get("project") + def create(self, validated_data): project = validated_data["project"] self.validate_project_segment_limit(project) @@ -165,20 +170,21 @@ def _update_or_create_segment_rules( def _update_or_create_metadata( self, metadata_data: typing.Dict, segment: typing.Optional[Segment] = None ) -> None: - for metadata_item in metadata_data: - metadata_id = metadata_item.pop("id", None) - if metadata_item.get("delete"): - Metadata.objects.filter(id=metadata_id).delete() - continue + if metadata_data is not None: + for metadata_item in metadata_data: + metadata_id = metadata_item.pop("id", None) + if metadata_item.get("delete"): + Metadata.objects.filter(id=metadata_id).delete() + continue - Metadata.objects.update_or_create( - id=metadata_id, - defaults={ - **metadata_item, - "content_type": ContentType.objects.get_for_model(Segment), - "object_id": segment.id, - }, - ) + Metadata.objects.update_or_create( + id=metadata_id, + defaults={ + **metadata_item, + "content_type": ContentType.objects.get_for_model(Segment), + "object_id": segment.id, + }, + ) @staticmethod def _update_or_create_segment_rule( diff --git a/api/segments/views.py b/api/segments/views.py index 7ede7331b65b..ec864edf20f6 100644 --- a/api/segments/views.py +++ b/api/segments/views.py @@ -3,7 +3,7 @@ from django.utils.decorators import method_decorator from drf_yasg import openapi from drf_yasg.utils import swagger_auto_schema -from rest_framework import status, viewsets +from rest_framework import viewsets from rest_framework.decorators import action, api_view from rest_framework.generics import get_object_or_404 from rest_framework.response import Response @@ -85,15 +85,6 @@ def get_queryset(self): return queryset - def create(self, request, *args, **kwargs): - serializer = self.get_serializer(data=request.data) - serializer.is_valid(raise_exception=True) - - if "metadata" not in serializer.validated_data: - return Response( - {"error": "Metadata is required"}, status=status.HTTP_400_BAD_REQUEST - ) - @action( detail=True, methods=["GET"],