Skip to content

Commit fe06a97

Browse files
committed
add schema $id in DGGS-JSON response if single collection
1 parent 3ce1eda commit fe06a97

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

pydggsapi/models/ogc_dggs/data_retrieval.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from pydggsapi.dependencies.collections_providers.abstract_collection_provider import AbstractCollectionProvider, DatetimeNotDefinedError
1515
from pydggsapi.dependencies.api.utils import getCQLAttributes
1616

17+
from starlette.requests import Request
1718
from fastapi.responses import FileResponse, Response
1819
from numcodecs import Blosc
1920
from typing import Any, List, Dict, Optional, Union, cast
@@ -33,7 +34,9 @@
3334

3435
logger = logging.getLogger()
3536

37+
3638
def query_zone_data(
39+
request: Request,
3740
zoneId: str | int,
3841
base_level: int,
3942
relative_levels: List[int],
@@ -268,13 +271,19 @@ def query_zone_data(
268271
return FileResponse(tmpfile[1], headers={'content-type': 'application/zarr+zip'})
269272
if (returntype == 'application/geo+json'):
270273
return ZonesDataGeoJson(type='FeatureCollection', features=features)
271-
link = [k.href for k in dggrs_desc.links if (k.rel == '[ogc-rel:dggrs-definition]')][0]
274+
col_schema_id = None
275+
if len(collection) == 1: # no schema applicable if the response is a multi-collection aggregation
276+
col_id = list(collection.keys())[0]
277+
col_data_url = request.url.replace(query=None, fragment=None)
278+
col_desc_url = str(col_data_url).rsplit(f'/{col_id}/', 1)[0]
279+
col_schema_id = f"{col_desc_url}/{col_id}/schema"
280+
dggrs_link = [k.href for k in dggrs_desc.links if (k.rel == '[ogc-rel:dggrs-definition]')][0]
272281
relative_levels = [rl - base_level for rl in relative_levels]
273282
return_ = cast(ZonesDataDggsJsonResponse | Dict[str, Any], {
274-
'dggrs': link,
283+
'dggrs': dggrs_link,
275284
'zoneId': str(zoneId),
276285
'depths': relative_levels,
277-
'schema': Schema(properties=properties),
286+
'schema': Schema(properties=properties, id_=col_schema_id),
278287
'values': values,
279288
})
280289
if zone_level_dims:

pydggsapi/routers/dggs_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ async def dggrs_zones_data(
525525
detail=f"f'{__name__} zone id {zoneId} with relative depth: {depth} is over refinement for all collections")
526526
filtered_collections = {k: v for k, v in collection.items() if (k not in skip_collection)}
527527
try:
528-
result = query_zone_data(zoneId, base_level, relative_levels, dggrs_description,
528+
result = query_zone_data(req, zoneId, base_level, relative_levels, dggrs_description,
529529
dggrs_provider, filtered_collections, collection_providers, returntype,
530530
returngeometry, filter, include_datetime, include_properties, exclude_properties)
531531
if (result is None):

0 commit comments

Comments
 (0)