Skip to content

Commit fa52d19

Browse files
committed
update
1 parent 1ec0c8f commit fa52d19

4 files changed

Lines changed: 46 additions & 11 deletions

File tree

pygeoapi/api/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@
6868
TEMPLATESDIR, UrlPrefetcher, dategetter,
6969
filter_dict_by_key_value, filter_providers_by_type, get_api_rules,
7070
get_base_url, get_provider_by_type, get_provider_default, get_typed_value,
71-
render_j2_template, to_json, get_choice_from_headers, get_from_headers
71+
render_j2_template, to_json, get_choice_from_headers, get_from_headers,
72+
get_dataset_formatters
7273
)
7374

7475
LOGGER = logging.getLogger(__name__)
@@ -1042,6 +1043,14 @@ def describe_collections(api: API, request: APIRequest,
10421043
'href': f'{api.get_collections_url()}/{k}/items?f={F_HTML}' # noqa
10431044
})
10441045

1046+
for key, value in get_dataset_formatters(v).items():
1047+
collection['links'].append({
1048+
'type': value.mimetype,
1049+
'rel': 'items',
1050+
'title': l10n.translate(f'Items as {key}', request.locale), # noqa
1051+
'href': f'{api.get_collections_url()}/{k}/items?f={value.f}' # noqa
1052+
})
1053+
10451054
# OAPIF Part 2 - list supported CRSs and StorageCRS
10461055
if collection_data_type in ['edr', 'feature']:
10471056
collection['crs'] = get_supported_crs_list(collection_data)

pygeoapi/api/itemtypes.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,15 @@
5555
set_content_crs_header)
5656
from pygeoapi.formatter.base import FormatterSerializationError
5757
from pygeoapi.linked_data import geojson2jsonld
58+
from pygeoapi.openapi import get_oas_30_parameters
5859
from pygeoapi.plugin import load_plugin, PLUGINS
5960
from pygeoapi.provider.base import (
6061
ProviderGenericError, ProviderTypeError, SchemaType)
6162

6263
from 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

6668
from . import (
6769
APIRequest, API, SYSTEM_LOCALE, F_JSON, FORMAT_TYPES, F_HTML, F_JSONLD,
@@ -350,13 +352,7 @@ def get_collection_items(
350352
err.ogc_exception_code, err.message)
351353

352354
LOGGER.debug('Validating requested format')
353-
dataset_formatters = {}
354-
for key, value in PLUGINS['formatter'].items():
355-
df2 = load_plugin('formatter', {'name': key})
356-
dataset_formatters[df2.name] = df2
357-
for df in collections[dataset].get('formatters', []):
358-
df2 = load_plugin('formatter', df)
359-
dataset_formatters[df2.name] = df2
355+
dataset_formatters = get_dataset_formatters(collections[dataset])
360356

361357
if not request.is_valid(dataset_formatters.keys()):
362358
return api.get_format_exception(request)
@@ -1090,14 +1086,19 @@ def get_oas_30(cfg: dict, locale: str) -> tuple[list[dict[str, str]], dict[str,
10901086
v.get('limits', {})
10911087
)
10921088

1089+
dataset_formatters = get_dataset_formatters(v)
1090+
coll_f_parameter = deepcopy(get_oas_30_parameters(cfg, locale))['f'] # noqa
1091+
for key, value in dataset_formatters.items():
1092+
coll_f_parameter['schema']['enum'].append(key)
1093+
10931094
paths[items_path] = {
10941095
'get': {
10951096
'summary': f'Get {title} items',
10961097
'description': description,
10971098
'tags': [k],
10981099
'operationId': f'get{k.capitalize()}Features',
10991100
'parameters': [
1100-
{'$ref': '#/components/parameters/f'},
1101+
coll_f_parameter,
11011102
{'$ref': '#/components/parameters/lang'},
11021103
{'$ref': '#/components/parameters/bbox'},
11031104
coll_limit,

pygeoapi/formatter/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def __init__(self, formatter_def: dict):
3939
"""
4040
Initialize object
4141
42-
:param formatter_def: formatter definition
42+
param formatter_def: formatter definition
4343
4444
:returns: pygeoapi.formatter.base.BaseFormatter
4545
"""

pygeoapi/util.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
from pygeoapi import __version__
6565
from pygeoapi import l10n
6666
from pygeoapi.models import config as config_models
67+
from pygeoapi.plugin import load_plugin, PLUGINS
6768
from pygeoapi.provider.base import ProviderTypeError
6869

6970

@@ -764,3 +765,27 @@ def get_choice_from_headers(headers: dict,
764765

765766
# Return one or all choices
766767
return sorted_choices if all else sorted_choices[0]
768+
769+
770+
def get_dataset_formatters(dataset: dict) -> dict:
771+
"""
772+
Helper function to derive all formatters for an itemtype
773+
774+
:param dataset: `dict` of dataset resource definition
775+
776+
:returns: `dict` of formatters
777+
"""
778+
779+
dataset_formatters = {}
780+
781+
print(dataset)
782+
for key, value in PLUGINS['formatter'].items():
783+
print("PLUGINS")
784+
df2 = load_plugin('formatter', {'name': key})
785+
dataset_formatters[df2.name] = df2
786+
for df in dataset.get('formatters', []):
787+
print("CUSTOM")
788+
df2 = load_plugin('formatter', df)
789+
dataset_formatters[df2.name] = df2
790+
791+
return dataset_formatters

0 commit comments

Comments
 (0)