3737
3838from collections import ChainMap
3939from copy import deepcopy
40- from datetime import datetime
40+ import datetime
4141from http import HTTPStatus
4242import logging
4343from typing import Any , Tuple , Union , Optional
@@ -246,9 +246,6 @@ def get_collection_items(
246246 :returns: tuple of headers, status code, content
247247 """
248248
249- if not request .is_valid (PLUGINS ['formatter' ].keys ()):
250- return api .get_format_exception (request )
251-
252249 # Set Content-Language to system locale until provider locale
253250 # has been determined
254251 headers = request .get_response_headers (SYSTEM_LOCALE ,
@@ -357,6 +354,18 @@ def get_collection_items(
357354 err .http_status_code , headers , request .format ,
358355 err .ogc_exception_code , err .message )
359356
357+ LOGGER .debug ('Validating requested format' )
358+ dataset_formatters = {}
359+ for key , value in PLUGINS ['formatter' ].items ():
360+ df2 = load_plugin ('formatter' , {'name' : key })
361+ dataset_formatters [df2 .name ] = df2
362+ for df in collections [dataset ].get ('formatters' , []):
363+ df2 = load_plugin ('formatter' , df )
364+ dataset_formatters [df2 .name ] = df2
365+
366+ if not request .is_valid (dataset_formatters .keys ()):
367+ return api .get_format_exception (request )
368+
360369 crs_transform_spec = None
361370 if provider_type == 'feature' :
362371 # crs query parameter is only available for OGC API - Features
@@ -586,6 +595,14 @@ def get_collection_items(
586595 'href' : f'{ uri } ?f={ F_HTML } { serialized_query_params } '
587596 }])
588597
598+ for key , value in dataset_formatters .items ():
599+ content ['links' ].append ({
600+ 'type' : value .mimetype ,
601+ 'rel' : 'alternate' ,
602+ 'title' : f'This document as { key } ' ,
603+ 'href' : f'{ uri } ?f={ value .name } { serialized_query_params } '
604+ })
605+
589606 next_link = False
590607 prev_link = False
591608
@@ -630,7 +647,7 @@ def get_collection_items(
630647 'href' : '/' .join (uri .split ('/' )[:- 1 ])
631648 })
632649
633- content ['timeStamp' ] = datetime .utcnow ( ).strftime (
650+ content ['timeStamp' ] = datetime .datetime . now ( datetime . UTC ).strftime (
634651 '%Y-%m-%dT%H:%M:%S.%fZ' )
635652
636653 # Set response language to requested provider locale
@@ -661,9 +678,8 @@ def get_collection_items(
661678 'collections/items/index.html' ,
662679 content , request .locale )
663680 return headers , HTTPStatus .OK , content
664- elif request .format == 'csv' : # render
665- formatter = load_plugin ('formatter' ,
666- {'name' : 'CSV' , 'geom' : True })
681+ elif request .format in dataset_formatters : # render
682+ formatter = dataset_formatters [request .format ]
667683
668684 try :
669685 content = formatter .write (
@@ -682,13 +698,14 @@ def get_collection_items(
682698
683699 headers ['Content-Type' ] = formatter .mimetype
684700
685- if p .filename is None :
686- filename = f'{ dataset } .csv'
687- else :
688- filename = f'{ p .filename } '
701+ if formatter .attachment :
702+ if p .filename is None :
703+ filename = f'{ dataset } .{ formatter .extension } '
704+ else :
705+ filename = f'{ p .filename } '
689706
690- cd = f'attachment; filename="{ filename } "'
691- headers ['Content-Disposition' ] = cd
707+ cd = f'attachment; filename="{ filename } "'
708+ headers ['Content-Disposition' ] = cd
692709
693710 return headers , HTTPStatus .OK , content
694711
0 commit comments