from rest_framework import serializers from .models import SplatJob class SplatJobSerializer(serializers.ModelSerializer): class Meta: model = SplatJob fields = [ "id", "status", "current_step", "progress", "retry_count", "error_message", "colmap_points", "queued_at", "started_at", "finished_at", ] read_only_fields = fields class WebhookInputSerializer(serializers.Serializer): """Validates the payload sent by RunPod to POST /jobs/webhook/.""" class OutputSerializer(serializers.Serializer): splat_key = serializers.CharField(required=False, default="") preview_key = serializers.CharField(required=False, default="") splat_file_size = serializers.IntegerField(required=False, allow_null=True) colmap_points = serializers.IntegerField(required=False, allow_null=True) quality_score = serializers.FloatField(required=False, allow_null=True) frame_count = serializers.IntegerField(required=False, allow_null=True) # GeoJSON point [lon, lat] location = serializers.ListField(child=serializers.FloatField(), required=False, allow_null=True) altitude = serializers.FloatField(required=False, allow_null=True) heading = serializers.FloatField(required=False, allow_null=True) # GeoJSON polygon for coverage coverage = serializers.JSONField(required=False, allow_null=True) STATUS_CHOICES = ["succeeded", "failed", "step_complete"] job_id = serializers.CharField() # RunPod job ID status = serializers.ChoiceField(choices=STATUS_CHOICES) step = serializers.CharField(required=False, default="") progress = serializers.IntegerField(min_value=0, max_value=100, required=False, default=0) output = OutputSerializer(required=False, default=dict) error = serializers.CharField(required=False, default="")