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",
)