Source code for ferrosoft.apps.ticketing.api.serializer

#  Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
from rest_framework import serializers

from ferrosoft.apps.ticketing.api.service import CommentService
from ferrosoft.apps.ticketing.models import Ticket, Comment


[docs] class TaigaWebhookSerializer(serializers.Serializer): type = serializers.CharField() action = serializers.CharField() data = serializers.DictField() change = serializers.DictField()
[docs] def validate_change(self, value): """ Validates the 'change' field for duplicate or internal comments. """ comment = value.get("comment", "") if CommentService.is_duplicate(comment): raise serializers.ValidationError("Duplicate comment detected.") if CommentService.is_internal(comment): raise serializers.ValidationError("Internal comment detected.") return value
[docs] def validate(self, data): """ Validates the overall payload and ensures all required data exists. """ if data.get("type") != "issue" or data.get("action") != "change": raise serializers.ValidationError("Invalid webhook type or action.") ticket_foreign_id = data["data"].get("id") ticket = Ticket.objects.filter(id=ticket_foreign_id).first() if not ticket: raise serializers.ValidationError( "Ticket not found for foreign ID %s" % ticket_foreign_id ) data["ticket"] = ticket return data
[docs] def create(self, validated_data): return Comment.objects.create( ticket=validated_data["ticket"], content=validated_data["change"]["comment"], created_by="Ferrosoft Support Team", )