1
1
from typing import Any , Dict , List , Union , Optional
2
2
3
- from pydantic import BaseModel , ConfigDict , model_validator , Field
3
+ from pydantic import BaseModel , ConfigDict , model_validator , Field , model_serializer
4
4
from labelbox .data .mixins import ConfidenceMixin , CustomMetric , CustomMetricsMixin
5
5
from labelbox .data .serialization .ndjson .base import DataRow , NDAnnotation
6
6
@@ -26,19 +26,13 @@ def must_set_one(self):
26
26
27
27
return self
28
28
29
- def dict (self , * args , ** kwargs ):
30
- res = super ().dict (* args , ** kwargs )
31
- if 'name' in res and res ['name' ] is None :
32
- res .pop ('name' )
33
- if 'schemaId' in res and res ['schemaId' ] is None :
34
- res .pop ('schemaId' )
35
- if self .classifications is None or len (self .classifications ) == 0 :
36
- res .pop ('classifications' )
37
- else :
38
- res ['classifications' ] = [
39
- c .dict (* args , ** kwargs ) for c in self .classifications
40
- ]
41
- return res
29
+ @model_serializer (mode = "wrap" )
30
+ def serialize (self , serialization_handler , serialization_config ):
31
+ serialized = serialization_handler (self , serialization_config )
32
+ if len (serialized ['classifications' ]) == 0 :
33
+ serialized .pop ('classifications' )
34
+
35
+ return serialized
42
36
43
37
model_config = ConfigDict (populate_by_name = True , alias_generator = camel_case )
44
38
@@ -79,6 +73,14 @@ def from_common(cls, text: Text, name: str,
79
73
custom_metrics = text .custom_metrics ,
80
74
)
81
75
76
+ @model_serializer (mode = "wrap" )
77
+ def serialize (self , serialization_handler , serialization_config ):
78
+ serialized = serialization_handler (self , serialization_config )
79
+ if len (serialized ['classifications' ]) == 0 :
80
+ serialized .pop ('classifications' )
81
+
82
+ return serialized
83
+
82
84
83
85
class NDChecklistSubclass (NDAnswer ):
84
86
answer : List [NDAnswer ] = Field (..., alias = 'answers' )
@@ -114,14 +116,16 @@ def from_common(cls, checklist: Checklist, name: str,
114
116
name = name ,
115
117
schema_id = feature_schema_id )
116
118
117
- def dict (self , * args , ** kwargs ):
118
- res = super ().dict (* args , ** kwargs )
119
- if kwargs .get ('by_alias' , False ):
120
- key = 'answers'
121
- else :
122
- key = 'answer'
123
- res [key ] = [a .dict (* args , ** kwargs ) for a in self .answer ]
124
- return res
119
+ @model_serializer (mode = "wrap" )
120
+ def serialize (self , serialization_handler , serialization_config ):
121
+ serialized = serialization_handler (self , serialization_config )
122
+ if 'answers' in serialized and serialization_config .by_alias :
123
+ serialized ['answer' ] = serialized .pop ('answers' )
124
+ if len (serialized ['classifications' ]
125
+ ) == 0 : # no classifications on a question level
126
+ serialized .pop ('classifications' )
127
+
128
+ return serialized
125
129
126
130
127
131
class NDRadioSubclass (NDAnswer ):
@@ -152,10 +156,13 @@ def from_common(cls, radio: Radio, name: str,
152
156
name = name ,
153
157
schema_id = feature_schema_id )
154
158
155
- def dict (self , * args , ** kwargs ):
156
- res = super ().dict (* args , ** kwargs )
157
- res ['answer' ] = self .answer .dict (* args , ** kwargs )
158
- return res
159
+ @model_serializer (mode = "wrap" )
160
+ def serialize (self , serialization_handler , serialization_config ):
161
+ serialized = serialization_handler (self , serialization_config )
162
+ if len (serialized ['classifications' ]) == 0 :
163
+ serialized .pop ('classifications' )
164
+
165
+ return serialized
159
166
160
167
161
168
# ====== End of subclasses
0 commit comments