88# Ricardo Garcia Silva <ricardo.garcia.silva@geobeyond.it>
99# Bernhard Mallinger <bernhard.mallinger@eox.at>
1010#
11- # Copyright (c) 2025 Tom Kralidis
11+ # Copyright (c) 2026 Tom Kralidis
1212# Copyright (c) 2025 Francesco Bartoli
1313# Copyright (c) 2022 John A Stevenson and Colin Blackburn
1414# Copyright (c) 2023 Ricardo Garcia Silva
3737#
3838# =================================================================
3939
40-
40+ from copy import deepcopy
4141from http import HTTPStatus
4242import logging
4343from typing import Tuple
4949
5050from pygeoapi import l10n
5151from pygeoapi .api import evaluate_limit
52+ from pygeoapi .formatter .base import FormatterSerializationError
5253from pygeoapi .crs import (create_crs_transform_spec , set_content_crs_header )
54+ from pygeoapi .openapi import get_oas_30_parameters
5355from pygeoapi .plugin import load_plugin , PLUGINS
5456from pygeoapi .provider .base import (
5557 ProviderGenericError , ProviderItemNotFoundError )
5658from pygeoapi .util import (
57- filter_providers_by_type , get_provider_by_type , get_typed_value ,
58- render_j2_template , to_json , filter_dict_by_key_value
59+ filter_providers_by_type , get_dataset_formatters , get_provider_by_type ,
60+ get_typed_value , render_j2_template , to_json , filter_dict_by_key_value
5961)
6062
6163from . import (APIRequest , API , F_COVERAGEJSON , F_HTML , F_JSON , F_JSONLD ,
@@ -253,8 +255,6 @@ def get_collection_edr_query(api: API, request: APIRequest,
253255 :returns: tuple of headers, status code, content
254256 """
255257
256- if not request .is_valid (PLUGINS ['formatter' ].keys ()):
257- return api .get_format_exception (request )
258258 headers = request .get_response_headers (api .default_locale ,
259259 ** api .api_headers )
260260 collections = filter_dict_by_key_value (api .config ['resources' ],
@@ -287,6 +287,20 @@ def get_collection_edr_query(api: API, request: APIRequest,
287287 HTTPStatus .BAD_REQUEST , headers , request .format ,
288288 'InvalidParameterValue' , msg )
289289
290+ LOGGER .debug ('Validating requested format' )
291+ dataset_formatters = get_dataset_formatters (collections [dataset ])
292+
293+ if dataset_formatters :
294+ LOGGER .debug (f'Dataset formatters: { dataset_formatters } ' )
295+ request ._format = request ._get_format (
296+ request .get_request_headers (request .headers ),
297+ {v .f : v .mimetype for v in dataset_formatters .values ()})
298+
299+ LOGGER .debug (f'Request format: { request .format } ' )
300+
301+ if not request .is_valid (dataset_formatters .keys ()):
302+ return api .get_format_exception (request )
303+
290304 crs_transform_spec = None
291305 query_crs_uri = request .params .get ('crs' )
292306 if query_crs_uri is not None :
@@ -442,6 +456,30 @@ def get_collection_edr_query(api: API, request: APIRequest,
442456 content = render_j2_template (api .tpl_config , tpl_config ,
443457 'collections/edr/query.html' , data ,
444458 api .default_locale )
459+ elif request .format in [df .f for df in dataset_formatters .values ()]:
460+ formatter = [v for v in dataset_formatters .values () if
461+ v .f == request .format ][0 ]
462+
463+ try :
464+ content = formatter .write (
465+ data = data ,
466+ options = {
467+ 'provider_def' : get_provider_by_type (
468+ collections [dataset ]['providers' ],
469+ 'edr' )
470+ }
471+ )
472+ except FormatterSerializationError :
473+ msg = 'Error serializing output'
474+ return api .get_exception (
475+ HTTPStatus .INTERNAL_SERVER_ERROR , headers , request .format ,
476+ 'NoApplicableCode' , msg )
477+
478+ if formatter .attachment :
479+ filename = f'{ dataset } .{ formatter .extension } '
480+ cd = f'attachment; filename="{ filename } "'
481+ headers ['Content-Disposition' ] = cd
482+
445483 else :
446484 content = to_json (data , api .pretty_print )
447485
@@ -515,6 +553,12 @@ def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str,
515553 spatial_parameter = {
516554 '$ref' : f"{ OPENAPI_YAML ['oaedr' ]} /parameters/{ eqe ['qt' ]} Coords.yaml" # noqa
517555 }
556+
557+ dataset_formatters = get_dataset_formatters (v )
558+ coll_f_parameter = deepcopy (get_oas_30_parameters (cfg , locale ))['f' ] # noqa
559+ for key , value in dataset_formatters .items ():
560+ coll_f_parameter ['schema' ]['enum' ].append (value .f )
561+
518562 paths [eqe ['path' ]] = {
519563 'get' : {
520564 'summary' : f"query { description } by { eqe ['qt' ]} " ,
@@ -527,7 +571,7 @@ def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str,
527571 {'$ref' : f"{ OPENAPI_YAML ['oaedr' ]} /parameters/parameter-name.yaml" }, # noqa
528572 {'$ref' : f"{ OPENAPI_YAML ['oaedr' ]} /parameters/z.yaml" }, # noqa
529573 {'$ref' : '#/components/parameters/crs' },
530- { '$ref' : '#/components/parameters/f' }
574+ coll_f_parameter ,
531575 ],
532576 'responses' : {
533577 '200' : {
0 commit comments