Skip to content

Commit

Permalink
Correct the Segment serializer to validate if the metadata is required
Browse files Browse the repository at this point in the history
  • Loading branch information
novakzaballa committed Mar 6, 2024
1 parent fb04bbc commit de463be
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 25 deletions.
36 changes: 21 additions & 15 deletions api/segments/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)

Expand All @@ -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)
Expand Down Expand Up @@ -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(
Expand Down
11 changes: 1 addition & 10 deletions api/segments/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"],
Expand Down

0 comments on commit de463be

Please sign in to comment.