99 BaseModel ,
1010 ConfigDict ,
1111 Field ,
12+ model_validator ,
1213)
13- from typing_extensions import Annotated
14+ from typing_extensions import Annotated , Self
1415
1516from stac_pydantic .utils import AutoValueEnum
1617
@@ -126,22 +127,49 @@ class Provider(StacBaseModel):
126127
127128class StacCommonMetadata (StacBaseModel ):
128129 """
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
130131 """
131132
133+ # Basic
132134 title : Optional [str ] = None
133135 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
136138 created : Optional [UtcDatetime ] = None
137139 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
138146 platform : Optional [str ] = None
139147 instruments : Optional [List [str ]] = None
140148 constellation : Optional [str ] = None
141149 mission : Optional [str ] = None
142- providers : Optional [List [Provider ]] = None
143150 gsd : Optional [float ] = Field (None , gt = 0 )
144151
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+
145173
146174class Asset (StacCommonMetadata ):
147175 """
@@ -157,3 +185,10 @@ class Asset(StacCommonMetadata):
157185 model_config = ConfigDict (
158186 populate_by_name = True , use_enum_values = True , extra = "allow"
159187 )
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