@@ -10,3 +10,52 @@ class TaskRun(models.Model):
1010 started_at = models .DateTimeField (auto_now_add = True )
1111 finished_at = models .DateTimeField (null = True , blank = True )
1212 result = models .JSONField (blank = True , null = True )
13+
14+ @staticmethod
15+ def extract_message (result : dict | None ) -> str | None :
16+ if not isinstance (result , dict ):
17+ return None
18+
19+ for key in (
20+ "message" ,
21+ "summary" ,
22+ "statusMessage" ,
23+ "status_message" ,
24+ "failureReason" ,
25+ "failure_reason" ,
26+ "error" ,
27+ ):
28+ value = result .get (key )
29+ if isinstance (value , str ) and value .strip ():
30+ return value
31+
32+ return None
33+
34+ @staticmethod
35+ def extract_failure_count (result : dict | None ) -> int | None :
36+ if not isinstance (result , dict ):
37+ return None
38+
39+ for key in ("failure_count" , "failureCount" ):
40+ value = result .get (key )
41+
42+ if isinstance (value , bool ):
43+ continue
44+ if isinstance (value , int ):
45+ return value
46+ if isinstance (value , float ) and value .is_integer ():
47+ return int (value )
48+ if isinstance (value , str ):
49+ normalized = value .strip ()
50+ if normalized .lstrip ("-" ).isdigit ():
51+ return int (normalized )
52+
53+ return None
54+
55+ @property
56+ def message (self ) -> str | None :
57+ return self .extract_message (self .result )
58+
59+ @property
60+ def failure_count (self ) -> int | None :
61+ return self .extract_failure_count (self .result )
0 commit comments