5555 set_content_crs_header )
5656from pygeoapi .formatter .base import FormatterSerializationError
5757from pygeoapi .linked_data import geojson2jsonld
58+ from pygeoapi .openapi import get_oas_30_parameters
5859from pygeoapi .plugin import load_plugin , PLUGINS
5960from pygeoapi .provider .base import (
6061 ProviderGenericError , ProviderTypeError , SchemaType )
6162
6263from pygeoapi .util import (filter_providers_by_type , to_json ,
6364 filter_dict_by_key_value , str2bool ,
64- get_provider_by_type , render_j2_template )
65+ get_provider_by_type , render_j2_template ,
66+ get_dataset_formatters )
6567
6668from . import (
6769 APIRequest , API , SYSTEM_LOCALE , F_JSON , FORMAT_TYPES , F_HTML , F_JSONLD ,
@@ -241,9 +243,6 @@ def get_collection_items(
241243 :returns: tuple of headers, status code, content
242244 """
243245
244- if not request .is_valid (PLUGINS ['formatter' ].keys ()):
245- return api .get_format_exception (request )
246-
247246 # Set Content-Language to system locale until provider locale
248247 # has been determined
249248 headers = request .get_response_headers (SYSTEM_LOCALE ,
@@ -352,6 +351,12 @@ def get_collection_items(
352351 err .http_status_code , headers , request .format ,
353352 err .ogc_exception_code , err .message )
354353
354+ LOGGER .debug ('Validating requested format' )
355+ dataset_formatters = get_dataset_formatters (collections [dataset ])
356+
357+ if not request .is_valid (dataset_formatters .keys ()):
358+ return api .get_format_exception (request )
359+
355360 crs_transform_spec = None
356361 if provider_type == 'feature' :
357362 # crs query parameter is only available for OGC API - Features
@@ -581,6 +586,14 @@ def get_collection_items(
581586 'href' : f'{ uri } ?f={ F_HTML } { serialized_query_params } '
582587 }])
583588
589+ for key , value in dataset_formatters .items ():
590+ content ['links' ].append ({
591+ 'type' : value .mimetype ,
592+ 'rel' : 'alternate' ,
593+ 'title' : f'This document as { key } ' ,
594+ 'href' : f'{ uri } ?f={ value .name } { serialized_query_params } '
595+ })
596+
584597 next_link = False
585598 prev_link = False
586599
@@ -656,9 +669,9 @@ def get_collection_items(
656669 'collections/items/index.html' ,
657670 content , request .locale )
658671 return headers , HTTPStatus .OK , content
659- elif request .format == 'csv' : # render
660- formatter = load_plugin ( 'formatter' ,
661- { 'name' : 'CSV' , 'geom' : True })
672+ elif request .format in [ df . f for df in dataset_formatters . values ()]:
673+ formatter = [ v for k , v in dataset_formatters . items () if
674+ v . f == request . format ][ 0 ]
662675
663676 try :
664677 content = formatter .write (
@@ -677,13 +690,14 @@ def get_collection_items(
677690
678691 headers ['Content-Type' ] = formatter .mimetype
679692
680- if p .filename is None :
681- filename = f'{ dataset } .csv'
682- else :
683- filename = f'{ p .filename } '
693+ if formatter .attachment :
694+ if p .filename is None :
695+ filename = f'{ dataset } .{ formatter .extension } '
696+ else :
697+ filename = f'{ p .filename } '
684698
685- cd = f'attachment; filename="{ filename } "'
686- headers ['Content-Disposition' ] = cd
699+ cd = f'attachment; filename="{ filename } "'
700+ headers ['Content-Disposition' ] = cd
687701
688702 return headers , HTTPStatus .OK , content
689703
@@ -1073,14 +1087,19 @@ def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str,
10731087 v .get ('limits' , {})
10741088 )
10751089
1090+ dataset_formatters = get_dataset_formatters (v )
1091+ coll_f_parameter = deepcopy (get_oas_30_parameters (cfg , locale ))['f' ] # noqa
1092+ for key , value in dataset_formatters .items ():
1093+ coll_f_parameter ['schema' ]['enum' ].append (value .f )
1094+
10761095 paths [items_path ] = {
10771096 'get' : {
10781097 'summary' : f'Get { title } items' ,
10791098 'description' : description ,
10801099 'tags' : [k ],
10811100 'operationId' : f'get{ k .capitalize ()} Features' ,
10821101 'parameters' : [
1083- { '$ref' : '#/components/parameters/f' } ,
1102+ coll_f_parameter ,
10841103 {'$ref' : '#/components/parameters/lang' },
10851104 {'$ref' : '#/components/parameters/bbox' },
10861105 coll_limit ,
0 commit comments