Skip to content

Commit 4a26aad

Browse files
authored
Merge pull request #311 from superannotateai/497-8-9-0
Fix 497-8-0
2 parents 9618957 + 1688b0a commit 4a26aad

File tree

4 files changed

+963
-29
lines changed

4 files changed

+963
-29
lines changed

src/superannotate/lib/core/entities/utils.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class Attribute(BaseModel):
8686
id: Optional[int]
8787
group_id: Optional[int] = Field(None, alias="groupId")
8888
name: NotEmptyStr
89-
group_name: NotEmptyStr = Field(None, alias="groupName")
89+
group_name: NotEmptyStr = Field(alias="groupName")
9090

9191

9292
class Tag(BaseModel):
@@ -107,10 +107,10 @@ class BboxPoints(BaseModel):
107107

108108

109109
class TimedBaseModel(BaseModel):
110-
created_at: constr(regex=DATE_REGEX) = Field(None, alias="createdAt")
111-
updated_at: constr(regex=DATE_REGEX) = Field(None, alias="updatedAt")
110+
created_at: Optional[constr(regex=DATE_REGEX)] = Field(None, alias="createdAt")
111+
updated_at: Optional[constr(regex=DATE_REGEX)] = Field(None, alias="updatedAt")
112112

113-
@validator("created_at", "updated_at" , pre=True)
113+
@validator("created_at", "updated_at", pre=True)
114114
def validate_created_at(cls, value):
115115
try:
116116
if value is not None:
@@ -144,7 +144,7 @@ class LastUserAction(BaseModel):
144144

145145
class BaseInstance(TrackableModel, TimedBaseModel):
146146
class_id: Optional[int] = Field(None, alias="classId")
147-
class_name: Optional[NotEmptyStr] = Field(None, alias="className")
147+
class_name: NotEmptyStr = Field(alias="className")
148148

149149

150150
class MetadataBase(BaseModel):
@@ -176,8 +176,6 @@ class Comment(TimedBaseModel, TrackableModel):
176176

177177

178178
class BaseImageInstance(BaseInstance):
179-
class_id: Optional[int] = Field(None, alias="classId")
180-
class_name: NotEmptyStr = Field(alias="className")
181179
visible: Optional[bool]
182180
locked: Optional[bool]
183181
probability: Optional[int] = Field(100)

src/superannotate/lib/core/entities/vector.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from lib.core.entities.utils import VectorAnnotationTypeEnum
1313
from pydantic import conlist
1414
from pydantic import Field
15+
from pydantic import ValidationError
16+
from pydantic.error_wrappers import ErrorWrapper
1517

1618

1719
class AxisPoint(BaseModel):
@@ -24,11 +26,11 @@ class Point(BaseVectorInstance, AxisPoint):
2426

2527

2628
class PolyLine(BaseVectorInstance):
27-
points: List[float]
29+
points: conlist(float, min_items=2)
2830

2931

3032
class Polygon(BaseVectorInstance):
31-
points: List[float]
33+
points: conlist(float, min_items=3)
3234

3335

3436
class Bbox(BaseVectorInstance):
@@ -114,12 +116,22 @@ def return_action(cls, values):
114116
try:
115117
instance_type = values["type"]
116118
except KeyError:
117-
raise ValueError("metadata.type required")
119+
raise ValidationError(
120+
[ErrorWrapper(ValueError("field required"), "type")], cls
121+
)
118122
try:
119123
return ANNOTATION_TYPES[instance_type](**values)
120124
except KeyError:
121-
raise ValueError(
122-
f"invalid type, valid types is {', '.join(ANNOTATION_TYPES.keys())}"
125+
raise ValidationError(
126+
[
127+
ErrorWrapper(
128+
ValueError(
129+
f"invalid type, valid types are {', '.join(ANNOTATION_TYPES.keys())}"
130+
),
131+
"type",
132+
)
133+
],
134+
cls,
123135
)
124136

125137

src/superannotate/lib/core/entities/video_export.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
from lib.core.entities.utils import Tag
1414
from pydantic import conlist
1515
from pydantic import Field
16+
from pydantic import ValidationError
17+
from pydantic.error_wrappers import ErrorWrapper
1618

1719

1820
class VideoType(str, Enum):
@@ -40,7 +42,7 @@ class EventTimeStamp(BaseTimeStamp):
4042

4143
class InstanceMetadata(BaseInstance):
4244
type: VideoType
43-
class_name: Optional[NotEmptyStr] = Field(alias="className")
45+
class_name: Optional[NotEmptyStr] = Field(None, alias="className")
4446
point_labels: Optional[PointLabels] = Field(None, alias="pointLabels")
4547
start: int
4648
end: int
@@ -95,12 +97,22 @@ def return_action(cls, values):
9597
try:
9698
instance_type = values["meta"]["type"]
9799
except KeyError:
98-
raise ValueError("meta.type required")
100+
raise ValidationError(
101+
[ErrorWrapper(ValueError("meta.field required"), "type")], cls
102+
)
99103
try:
100104
return INSTANCES[instance_type](**values)
101105
except KeyError:
102-
raise ValueError(
103-
f"invalid type, valid types is {', '.join(INSTANCES.keys())}"
106+
raise ValidationError(
107+
[
108+
ErrorWrapper(
109+
ValueError(
110+
f"invalid type, valid types are {', '.join(INSTANCES.keys())}"
111+
),
112+
"meta.type",
113+
)
114+
],
115+
cls,
104116
)
105117

106118

0 commit comments

Comments
 (0)