Coverage for backend/django/diagnostics/serializers.py: 92%
59 statements
« prev ^ index » next coverage.py v7.10.7, created at 2026-02-11 21:43 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2026-02-11 21:43 +0000
1"""Serializers for diagnostics models and API views."""
3from rest_framework import serializers
4from diagnostics.models import (
5 DiagnosticRun,
6 DiagnosticEvent,
7)
10# Model Serializers
11class DiagnosticRunSerializer(serializers.ModelSerializer):
12 """Serializer for detailed DiagnosticRun representation."""
14 class Meta:
15 model = DiagnosticRun
16 fields = [
17 'id', 'flowsheet', 'task', 'diagnostic_status', 'trigger', 'summary',
18 'started_at', 'completed_at', 'created_at', 'updated_at'
19 ]
20 read_only_fields = ['id', 'created_at', 'updated_at']
23class DiagnosticRunListSerializer(serializers.ModelSerializer):
24 """Serializer for listing DiagnosticRuns (minimal fields)."""
26 class Meta:
27 model = DiagnosticRun
28 fields = ['id', 'diagnostic_status', 'trigger', 'started_at', 'completed_at', 'created_at']
29 read_only_fields = fields
32class DiagnosticEventSerializer(serializers.ModelSerializer):
33 """Serializer for DiagnosticEvent model."""
35 class Meta:
36 model = DiagnosticEvent
37 fields = ['id', 'run', 'ts', 'type', 'data']
38 read_only_fields = fields
41# Request/Response Serializers for Views
42class PreSolveValidationSerializer(serializers.Serializer):
43 """Request serializer for pre-solve validation."""
45 object_id = serializers.IntegerField()
46 property_id = serializers.IntegerField(required=False, allow_null=True)
47 property_key = serializers.CharField(required=False, allow_blank=False, allow_null=True)
48 property_value_id = serializers.IntegerField(required=False, allow_null=True)
49 new_value = serializers.JSONField()
51 def validate(self, attrs: dict) -> dict:
52 if attrs.get("property_id") is None and not attrs.get("property_key"):
53 raise serializers.ValidationError("Missing property_id or property_key")
54 return attrs
57class RunSummarySerializer(serializers.Serializer):
58 """Response serializer for run summary."""
60 run_id = serializers.IntegerField()
61 status = serializers.CharField()
62 summary = serializers.JSONField(allow_null=True)
65class RunEventsSerializer(serializers.Serializer):
66 """Response serializer for run events."""
68 run_id = serializers.IntegerField()
69 events = DiagnosticEventSerializer(many=True)
72class FindingSerializer(serializers.Serializer):
73 """Serializer for a single finding."""
75 id = serializers.CharField(required=False)
76 severity = serializers.CharField()
77 title = serializers.CharField()
78 description = serializers.CharField()
79 ruleReference = serializers.CharField(required=False)
80 componentName = serializers.CharField(required=False, allow_null=True)
81 componentId = serializers.IntegerField(required=False)
82 propertyKey = serializers.CharField(required=False, allow_null=True)
83 propertyId = serializers.IntegerField(required=False)
84 suggestedFix = serializers.CharField(required=False)
85 suggestedValue = serializers.FloatField(required=False)
86 fixAction = serializers.JSONField(required=False)
87 ignored = serializers.BooleanField(required=False)
90class RunFindingsSerializer(serializers.Serializer):
91 """Response serializer for run findings."""
93 run_id = serializers.IntegerField()
94 findings = FindingSerializer(many=True)
95 ignored_rule_ids = serializers.ListField(child=serializers.CharField())
98class PropertyRuleFindingsSerializer(serializers.Serializer):
99 """Response serializer for property rule findings."""
101 object_id = serializers.IntegerField()
102 findings = FindingSerializer(many=True)
105class RuleValidateRequestSerializer(serializers.Serializer):
106 """Request serializer for validating a single property value against rules."""
108 object_id = serializers.IntegerField()
109 property_key = serializers.CharField(allow_blank=False)
110 value = serializers.FloatField()