Skip to content

Commit 078134a

Browse files
jlahovniksbrunato
andauthored
fix: asset type property and item extensions (#73)
fixes 2 bugs: - `type` in assets was displayed as `product:type` - some stac extensions were missing in items --------- Co-authored-by: Sylvain Brunato <sylvain.brunato@c-s.fr>
1 parent 35903b5 commit 078134a

4 files changed

Lines changed: 26 additions & 11 deletions

File tree

stac_fastapi/eodag/extensions/stac.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ class StorageFields(BaseModel):
237237
platform: Optional[str] = Field(default=None)
238238
region: Optional[str] = Field(default=None)
239239
requester_pays: Optional[bool] = Field(default=None)
240-
tier: Optional[str] = Field(default=None, validation_alias="order:status")
240+
tier: Optional[str] = Field(default=None, validation_alias="storage:tier")
241241

242242
@field_validator("tier")
243243
@classmethod

stac_fastapi/eodag/models/stac_metadata.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from stac_pydantic.api.extensions.sort import SortDirections, SortExtension
4141
from stac_pydantic.api.version import STAC_API_VERSION
4242
from stac_pydantic.item import ItemProperties
43-
from stac_pydantic.shared import Provider
43+
from stac_pydantic.shared import Asset, Provider
4444
from typing_extensions import Self
4545

4646
from eodag.api.product._product import EOProduct
@@ -300,8 +300,7 @@ def create_stac_item(
300300
):
301301
for k, v in product.assets.items():
302302
# TODO: download extension with origin link (make it optional ?)
303-
asset_model = model.model_validate(v)
304-
stac_extensions.update(asset_model.get_conformance_classes())
303+
asset_model = Asset.model_validate(v)
305304
feature["assets"][k] = asset_model.model_dump(exclude_none=True)
306305

307306
if asset_proxy_url:
@@ -342,7 +341,12 @@ def create_stac_item(
342341
},
343342
}
344343

345-
feature_model = model.model_validate({**product.properties, **{"federation:backends": [product.provider]}})
344+
feature_model = model.model_validate(
345+
{
346+
**product.properties,
347+
**{"federation:backends": [product.provider], "storage:tier": product.properties.get("order:status")},
348+
}
349+
)
346350
stac_extensions.update(feature_model.get_conformance_classes())
347351

348352
# filter properties we do not want to expose
@@ -351,10 +355,6 @@ def create_stac_item(
351355
}
352356
feature["properties"].pop("qs", None)
353357

354-
# append order:status property as it was replaced in feature with storage:tier
355-
if order_status := product.properties.get("order:status"):
356-
feature["properties"]["order:status"] = order_status
357-
358358
feature["stac_extensions"] = list(stac_extensions)
359359

360360
if extension_names and product.provider not in auto_order_whitelist:
@@ -390,8 +390,14 @@ def _get_conformance_classes(self) -> list[str]:
390390
"""Extract list of conformance classes from set fields metadata"""
391391
conformance_classes: set[str] = set()
392392

393+
model_fields_by_alias = {
394+
field_info.serialization_alias: field_info
395+
for name, field_info in self.model_fields.items()
396+
if field_info.serialization_alias
397+
}
398+
393399
for f in self.model_fields_set:
394-
mf = self.model_fields.get(f)
400+
mf = model_fields_by_alias.get(f) or self.model_fields.get(f)
395401
if not mf or not isinstance(mf, FieldInfo) or not mf.metadata:
396402
continue
397403
extension = next(

tests/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def mock_search_result():
143143
"eo:snow_cover": None,
144144
"gsd": None,
145145
"end_datetime": "2018-02-16T00:12:14.035Z",
146-
"keyword": [],
146+
"keywords": [],
147147
"product:type": "OCN",
148148
"eodag:download_link": (
149149
"https://peps.cnes.fr/resto/collections/S1/578f1768-e66e-5b86-9363-b19f8931cc7b/download"

tests/test_search.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ async def test_items_response(request_valid, defaults):
146146
res[0]["assets"]["asset1"]["href"]
147147
== f"http://testserver/data/peps/{res[0]['collection']}/{res[0]['id']}/asset1"
148148
)
149+
expected_extensions = [
150+
"https://stac-extensions.github.io/sat/v1.0.0/schema.json",
151+
"https://stac-extensions.github.io/product/v0.1.0/schema.json",
152+
"https://api.openeo.org/extensions/federation/0.1.0",
153+
"https://stac-extensions.github.io/eo/v1.0.0/schema.json",
154+
"https://stac-extensions.github.io/storage/v1.0.0/schema.json",
155+
]
156+
for ext in expected_extensions:
157+
assert ext in res[0]["stac_extensions"]
149158

150159
# check order status and storage tier properties of the "OFFLINE" item when peps is whitelisted
151160
auto_order_whitelist = get_settings().auto_order_whitelist

0 commit comments

Comments
 (0)