9
9
BaseModel ,
10
10
ConfigDict ,
11
11
Field ,
12
+ model_validator ,
12
13
)
13
- from typing_extensions import Annotated
14
+ from typing_extensions import Annotated , Self
14
15
15
16
from stac_pydantic .utils import AutoValueEnum
16
17
@@ -126,22 +127,49 @@ class Provider(StacBaseModel):
126
127
127
128
class StacCommonMetadata (StacBaseModel ):
128
129
"""
129
- https://github.com/radiantearth/stac-spec/blob/v1.0.0/item-spec/common-metadata.md#date-and-time-range
130
+ https://github.com/radiantearth/stac-spec/blob/v1.0.0/item-spec/common-metadata.md
130
131
"""
131
132
133
+ # Basic
132
134
title : Optional [str ] = None
133
135
description : Optional [str ] = None
134
- start_datetime : Optional [ UtcDatetime ] = None
135
- end_datetime : Optional [UtcDatetime ] = None
136
+ # Date and Time
137
+ datetime : Optional [UtcDatetime ] = None
136
138
created : Optional [UtcDatetime ] = None
137
139
updated : Optional [UtcDatetime ] = None
140
+ # Date and Time Range
141
+ start_datetime : Optional [UtcDatetime ] = None
142
+ end_datetime : Optional [UtcDatetime ] = None
143
+ # Provider
144
+ providers : Optional [List [Provider ]] = None
145
+ # Instrument
138
146
platform : Optional [str ] = None
139
147
instruments : Optional [List [str ]] = None
140
148
constellation : Optional [str ] = None
141
149
mission : Optional [str ] = None
142
- providers : Optional [List [Provider ]] = None
143
150
gsd : Optional [float ] = Field (None , gt = 0 )
144
151
152
+ @model_validator (mode = "after" )
153
+ def validate_datetime_or_start_end (self ) -> Self :
154
+ # When datetime is null, start_datetime and end_datetime must be specified
155
+ if not self .datetime and (not self .start_datetime or not self .end_datetime ):
156
+ raise ValueError (
157
+ "start_datetime and end_datetime must be specified when datetime is null"
158
+ )
159
+
160
+ return self
161
+
162
+ @model_validator (mode = "after" )
163
+ def validate_start_end (self ) -> Self :
164
+ # Using one of start_datetime or end_datetime requires the use of the other
165
+ if (self .start_datetime and not self .end_datetime ) or (
166
+ not self .start_datetime and self .end_datetime
167
+ ):
168
+ raise ValueError (
169
+ "use of start_datetime or end_datetime requires the use of the other"
170
+ )
171
+ return self
172
+
145
173
146
174
class Asset (StacCommonMetadata ):
147
175
"""
@@ -157,3 +185,10 @@ class Asset(StacCommonMetadata):
157
185
model_config = ConfigDict (
158
186
populate_by_name = True , use_enum_values = True , extra = "allow"
159
187
)
188
+
189
+ @model_validator (mode = "after" )
190
+ def validate_datetime_or_start_end (self ) -> Self :
191
+ # Overriding the parent method to avoid requiring datetime or start/end_datetime
192
+ # Additional fields MAY be added on the Asset object, but are not required.
193
+ # https://github.com/radiantearth/stac-spec/blob/v1.0.0/item-spec/item-spec.md#additional-fields-for-assets
194
+ return self
0 commit comments