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
@@ -245,9 +245,6 @@ def get_collection_items(
245245 :returns: tuple of headers, status code, content
246246 """
247247
248- if not request .is_valid (PLUGINS ['formatter' ].keys ()):
249- return api .get_format_exception (request )
250-
251248 # Set Content-Language to system locale until provider locale
252249 # has been determined
253250 headers = request .get_response_headers (SYSTEM_LOCALE ,
@@ -356,6 +353,18 @@ def get_collection_items(
356353 err .http_status_code , headers , request .format ,
357354 err .ogc_exception_code , err .message )
358355
356+ LOGGER .debug ('Validating requested format' )
357+ dataset_formatters = {}
358+ for key , value in PLUGINS ['formatter' ].items ():
359+ df2 = load_plugin ('formatter' , {'name' : key })
360+ dataset_formatters [df2 .name ] = df2
361+ for df in collections [dataset ].get ('formatters' , []):
362+ df2 = load_plugin ('formatter' , df )
363+ dataset_formatters [df2 .name ] = df2
364+
365+ if not request .is_valid (dataset_formatters .keys ()):
366+ return api .get_format_exception (request )
367+
359368 crs_transform_spec = None
360369 if provider_type == 'feature' :
361370 # crs query parameter is only available for OGC API - Features
@@ -585,6 +594,14 @@ def get_collection_items(
585594 'href' : f'{ uri } ?f={ F_HTML } { serialized_query_params } '
586595 }])
587596
597+ for key , value in dataset_formatters .items ():
598+ content ['links' ].append ({
599+ 'type' : value .mimetype ,
600+ 'rel' : 'alternate' ,
601+ 'title' : f'This document as { key } ' ,
602+ 'href' : f'{ uri } ?f={ value .name } { serialized_query_params } '
603+ })
604+
588605 next_link = False
589606 prev_link = False
590607
@@ -629,7 +646,7 @@ def get_collection_items(
629646 'href' : '/' .join (uri .split ('/' )[:- 1 ])
630647 })
631648
632- content ['timeStamp' ] = datetime .utcnow ( ).strftime (
649+ content ['timeStamp' ] = datetime .datetime . now ( datetime . UTC ).strftime (
633650 '%Y-%m-%dT%H:%M:%S.%fZ' )
634651
635652 # Set response language to requested provider locale
@@ -660,9 +677,8 @@ def get_collection_items(
660677 'collections/items/index.html' ,
661678 content , request .locale )
662679 return headers , HTTPStatus .OK , content
663- elif request .format == 'csv' : # render
664- formatter = load_plugin ('formatter' ,
665- {'name' : 'CSV' , 'geom' : True })
680+ elif request .format in dataset_formatters : # render
681+ formatter = dataset_formatters [request .format ]
666682
667683 try :
668684 content = formatter .write (
@@ -681,13 +697,14 @@ def get_collection_items(
681697
682698 headers ['Content-Type' ] = formatter .mimetype
683699
684- if p .filename is None :
685- filename = f'{ dataset } .csv'
686- else :
687- filename = f'{ p .filename } '
700+ if formatter .attachment :
701+ if p .filename is None :
702+ filename = f'{ dataset } .{ formatter .extension } '
703+ else :
704+ filename = f'{ p .filename } '
688705
689- cd = f'attachment; filename="{ filename } "'
690- headers ['Content-Disposition' ] = cd
706+ cd = f'attachment; filename="{ filename } "'
707+ headers ['Content-Disposition' ] = cd
691708
692709 return headers , HTTPStatus .OK , content
693710
0 commit comments