Coverage for backend/django/diagnostics/serializers.py: 92%

59 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2026-02-12 01:47 +0000

1"""Serializers for diagnostics models and API views.""" 

2 

3from rest_framework import serializers 

4from diagnostics.models import ( 

5 DiagnosticRun, 

6 DiagnosticEvent, 

7) 

8 

9 

10# Model Serializers 

11class DiagnosticRunSerializer(serializers.ModelSerializer): 

12 """Serializer for detailed DiagnosticRun representation.""" 

13 

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'] 

21 

22 

23class DiagnosticRunListSerializer(serializers.ModelSerializer): 

24 """Serializer for listing DiagnosticRuns (minimal fields).""" 

25 

26 class Meta: 

27 model = DiagnosticRun 

28 fields = ['id', 'diagnostic_status', 'trigger', 'started_at', 'completed_at', 'created_at'] 

29 read_only_fields = fields 

30 

31 

32class DiagnosticEventSerializer(serializers.ModelSerializer): 

33 """Serializer for DiagnosticEvent model.""" 

34 

35 class Meta: 

36 model = DiagnosticEvent 

37 fields = ['id', 'run', 'ts', 'type', 'data'] 

38 read_only_fields = fields 

39 

40 

41# Request/Response Serializers for Views 

42class PreSolveValidationSerializer(serializers.Serializer): 

43 """Request serializer for pre-solve validation.""" 

44 

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() 

50 

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 

55 

56 

57class RunSummarySerializer(serializers.Serializer): 

58 """Response serializer for run summary.""" 

59 

60 run_id = serializers.IntegerField() 

61 status = serializers.CharField() 

62 summary = serializers.JSONField(allow_null=True) 

63 

64 

65class RunEventsSerializer(serializers.Serializer): 

66 """Response serializer for run events.""" 

67 

68 run_id = serializers.IntegerField() 

69 events = DiagnosticEventSerializer(many=True) 

70 

71 

72class FindingSerializer(serializers.Serializer): 

73 """Serializer for a single finding.""" 

74 

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) 

88 

89 

90class RunFindingsSerializer(serializers.Serializer): 

91 """Response serializer for run findings.""" 

92 

93 run_id = serializers.IntegerField() 

94 findings = FindingSerializer(many=True) 

95 ignored_rule_ids = serializers.ListField(child=serializers.CharField()) 

96 

97 

98class PropertyRuleFindingsSerializer(serializers.Serializer): 

99 """Response serializer for property rule findings.""" 

100 

101 object_id = serializers.IntegerField() 

102 findings = FindingSerializer(many=True) 

103 

104 

105class RuleValidateRequestSerializer(serializers.Serializer): 

106 """Request serializer for validating a single property value against rules.""" 

107 

108 object_id = serializers.IntegerField() 

109 property_key = serializers.CharField(allow_blank=False) 

110 value = serializers.FloatField()