From 261edaddb148291996d413ca3351c6658735483d Mon Sep 17 00:00:00 2001 From: jlahovnik Date: Fri, 24 Apr 2026 20:38:03 +0200 Subject: [PATCH 1/2] fix: remove sci:doi from summaries --- eodag/api/collection.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/eodag/api/collection.py b/eodag/api/collection.py index c05b09be14..83dac3d301 100644 --- a/eodag/api/collection.py +++ b/eodag/api/collection.py @@ -140,9 +140,6 @@ class Collection(StacCollection): processing_level: Optional[list[str]] = Field( default=None, alias="processing:level", exclude=True, repr=False ) - sci_doi: Optional[list[str]] = Field( - default=None, alias="sci:doi", exclude=True, repr=False - ) eodag_sensor_type: Optional[list[str]] = Field( default=None, alias="eodag:sensor_type", exclude=True, repr=False ) From f8c7f2abdefe852bbeaa4eecc1f4255927d6350c Mon Sep 17 00:00:00 2001 From: Nicola Dalpasso Date: Mon, 27 Apr 2026 16:20:13 +0200 Subject: [PATCH 2/2] feat: add federation extension with SQLite --- eodag/api/collection.py | 8 +++++++- eodag/databases/base.py | 1 + eodag/databases/sqlite.py | 18 +++++++++++++++++- eodag/types/stac_extensions.py | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/eodag/api/collection.py b/eodag/api/collection.py index 83dac3d301..1f9aed427e 100644 --- a/eodag/api/collection.py +++ b/eodag/api/collection.py @@ -133,6 +133,11 @@ class Collection(StacCollection): default=None, alias="federation:backends" ) + # Federation extension fields + federation: Optional[dict[str, dict[str, Optional[str]]]] = Field( + default=None, alias="federation" + ) + # summaries constellation: Optional[list[str]] = Field(default=None, exclude=True, repr=False) instruments: Optional[list[str]] = Field(default=None, exclude=True, repr=False) @@ -163,7 +168,8 @@ class Collection(StacCollection): # only STAC fields __stac_fields__: ClassVar[list[str]] = list(StacCollection.model_fields.keys()) + [ - "federation_backends" + "federation_backends", + "federation", ] # mandatory STAC fields which are fixed by their default value diff --git a/eodag/databases/base.py b/eodag/databases/base.py index 815dbd1f5e..ed11f0858b 100644 --- a/eodag/databases/base.py +++ b/eodag/databases/base.py @@ -49,6 +49,7 @@ "geometry": "geometry", "content": "content", "federation:backends": "federation_backends", + "federation": "federation", "priority": "priority", } diff --git a/eodag/databases/sqlite.py b/eodag/databases/sqlite.py index 0d3a3e8747..7949a8c1aa 100644 --- a/eodag/databases/sqlite.py +++ b/eodag/databases/sqlite.py @@ -428,6 +428,18 @@ def set_priority(self, name: str, priority: int) -> None: ) self._refresh_collections_denorm([name]) + def set_status(self, status: dict[str, dict[str, Any]]) -> None: + """ + Set the federation status. + + :param status: Dictionary mapping collection IDs to their backend status. + """ + with self._con: + self._executemany( + "UPDATE collections SET federation = ? WHERE id = ? OR internal_id = ?", + [(status, c, c) for c, status in status.items()], + ) + def collections_search( self, geometry: Optional[Union[str, dict[str, float], BaseGeometry]] = None, @@ -501,7 +513,8 @@ def collections_search( sql = ( f'SELECT json(c.content) AS "c.content [collection_dict]", ' - f'json(c.federation_backends) as "c.federation_backends [dict]"{select_score} ' + f'json(c.federation_backends) as "c.federation_backends [dict]", ' + f'json(c.federation) as "c.federation [dict]"{select_score} ' f"{from_clause} WHERE {full_where}{order_by}" ) if limit is not None: @@ -511,6 +524,7 @@ def collections_search( for row in self._execute(sql, tuple(params) or None).fetchall(): coll = row["c.content"] coll["federation:backends"] = row["c.federation_backends"] + coll["federation"] = row["c.federation"] collections_list.append(coll) return collections_list, number_matched @@ -649,6 +663,7 @@ def _adapt_collection(collection: Collection) -> str: data["_id"] = collection._id # remove "federation:backends" from the stored content as it is computed in a separate column del data["federation:backends"] + del data["federation"] return orjson.dumps(data).decode() @@ -814,6 +829,7 @@ def create_collections_table(con: sqlite3.Connection) -> None: END ) STORED, federation_backends {_CONTENT_TYPE}, + federation {_CONTENT_TYPE}, priority INTEGER ); """ diff --git a/eodag/types/stac_extensions.py b/eodag/types/stac_extensions.py index 0a7ad15ca0..bcc6e094de 100644 --- a/eodag/types/stac_extensions.py +++ b/eodag/types/stac_extensions.py @@ -390,6 +390,22 @@ class DatacubeExtension(BaseStacExtension): field_name_prefix: Optional[str] = "cube" +class FederationFields(BaseModel): + """ + https://github.com/Open-EO/openeo-api/tree/master/extensions/federation + """ + + federation: Annotated[dict[str, dict[str, Any]], Field(None)] + + +class FederationExtension(BaseStacExtension): + """STAC federation extension.""" + + FIELDS: type[BaseModel] = FederationFields + + field_name_prefix: Optional[str] = "federation" + + STAC_EXTENSIONS = [ SarExtension(), SatelliteExtension(),