Skip to content

Commit 107f776

Browse files
authored
prevent HTML templating override persistence (#1943)
* prevent HTML templating override persistence * use self.tpl_config
1 parent b1d4e94 commit 107f776

File tree

9 files changed

+78
-68
lines changed

9 files changed

+78
-68
lines changed

pygeoapi/admin.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ def get_config_(
176176

177177
if request.format == F_HTML:
178178
content = render_j2_template(
179-
admin.config, 'admin/index.html', cfg, request.locale
179+
admin.tpl_config, admin.config['server']['templates'],
180+
'admin/index.html', cfg, request.locale
180181
)
181182
else:
182183
content = to_json(cfg, admin.pretty_print)
@@ -316,10 +317,8 @@ def get_resources(
316317

317318
if request.format == F_HTML:
318319
content = render_j2_template(
319-
admin.config,
320-
'admin/index.html',
321-
cfg['resources'],
322-
request.locale,
320+
admin.tpl_config, admin.config['server']['templates'],
321+
'admin/index.html', cfg['resources'], request.locale
323322
)
324323
else:
325324
content = to_json(cfg['resources'], admin.pretty_print)
@@ -422,7 +421,8 @@ def get_resource(
422421

423422
if request.format == F_HTML:
424423
content = render_j2_template(
425-
admin.config, 'admin/index.html', resource, request.locale
424+
admin.tpl_config, admin.config['server']['templates'],
425+
'admin/index.html', resource, request.locale
426426
)
427427
else:
428428
content = to_json(resource, admin.pretty_print)

pygeoapi/api/__init__.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,8 @@ def get_exception(self, status, headers, format_, code,
595595
if format_ == F_HTML:
596596
headers['Content-Type'] = FORMAT_TYPES[F_HTML]
597597
content = render_j2_template(
598-
self.config, 'exception.html', exception, SYSTEM_LOCALE)
598+
self.tpl_config, self.config['server']['templates'],
599+
'exception.html', exception, SYSTEM_LOCALE)
599600
else:
600601
content = to_json(exception, self.pretty_print)
601602

@@ -619,12 +620,13 @@ def get_format_exception(self, request) -> Tuple[dict, int, str]:
619620
HTTPStatus.BAD_REQUEST, headers,
620621
request.format, 'InvalidParameterValue', msg)
621622

622-
def get_collections_url(self):
623+
def get_collections_url(self) -> str:
623624
return f"{self.base_url}/collections"
624625

625-
def set_dataset_templates(self, dataset):
626-
if 'templates' in self.config['resources'][dataset]:
627-
self.tpl_config['server']['templates'] = self.config['resources'][dataset]['templates'] # noqa
626+
def get_dataset_templates(self, dataset) -> dict:
627+
templates = self.config['resources'][dataset].get('templates')
628+
629+
return templates or self.tpl_config['server']['templates']
628630

629631
@staticmethod
630632
def _create_crs_transform_spec(
@@ -829,8 +831,10 @@ def landing_page(api: API,
829831
'type', 'collection'):
830832
fcm['collection'] = True
831833

832-
content = render_j2_template(api.tpl_config, 'landing_page.html',
833-
fcm, request.locale)
834+
content = render_j2_template(
835+
api.tpl_config, api.config['server']['templates'],
836+
'landing_page.html', fcm, request.locale)
837+
834838
return headers, HTTPStatus.OK, content
835839

836840
if request.format == F_JSONLD:
@@ -860,8 +864,10 @@ def openapi_(api: API, request: APIRequest) -> Tuple[dict, int, str]:
860864
data = {
861865
'openapi-document-path': path
862866
}
863-
content = render_j2_template(api.tpl_config, template, data,
864-
request.locale)
867+
content = render_j2_template(
868+
api.tpl_config, api.config['server']['templates'], template, data,
869+
request.locale)
870+
865871
return headers, HTTPStatus.OK, content
866872

867873
headers['Content-Type'] = 'application/vnd.oai.openapi+json;version=3.0' # noqa
@@ -908,8 +914,10 @@ def conformance(api, request: APIRequest) -> Tuple[dict, int, str]:
908914

909915
headers = request.get_response_headers(**api.api_headers)
910916
if request.format == F_HTML: # render
911-
content = render_j2_template(api.tpl_config, 'conformance.html',
912-
conformance, request.locale)
917+
content = render_j2_template(
918+
api.tpl_config, api.config['server']['templates'],
919+
'conformance.html', conformance, request.locale)
920+
913921
return headers, HTTPStatus.OK, content
914922

915923
return headers, HTTPStatus.OK, to_json(conformance, api.pretty_print)
@@ -1336,14 +1344,14 @@ def describe_collections(api: API, request: APIRequest,
13361344
if request.format == F_HTML: # render
13371345
fcm['collections_path'] = api.get_collections_url()
13381346
if dataset is not None:
1339-
api.set_dataset_templates(dataset)
1340-
content = render_j2_template(api.tpl_config,
1347+
tpl_config = api.get_dataset_templates(dataset)
1348+
content = render_j2_template(api.tpl_config, tpl_config,
13411349
'collections/collection.html',
13421350
fcm, request.locale)
13431351
else:
1344-
content = render_j2_template(api.tpl_config,
1345-
'collections/index.html',
1346-
fcm, request.locale)
1352+
content = render_j2_template(
1353+
api.tpl_config, api.config['server']['templates'],
1354+
'collections/index.html', fcm, request.locale)
13471355

13481356
return headers, HTTPStatus.OK, content
13491357

@@ -1428,14 +1436,14 @@ def get_collection_schema(api: API, request: Union[APIRequest, Any],
14281436
schema['properties'][k]['x-ogc-role'] = 'primary-instant'
14291437

14301438
if request.format == F_HTML: # render
1431-
api.set_dataset_templates(dataset)
1439+
tpl_config = api.get_dataset_templates(dataset)
14321440
schema['title'] = l10n.translate(
14331441
api.config['resources'][dataset]['title'], request.locale)
14341442

14351443
schema['collections_path'] = api.get_collections_url()
14361444
schema['dataset_path'] = f'{api.get_collections_url()}/{dataset}'
14371445

1438-
content = render_j2_template(api.tpl_config,
1446+
content = render_j2_template(api.tpl_config, tpl_config,
14391447
'collections/schema.html',
14401448
schema, request.locale)
14411449

pygeoapi/api/environmental_data_retrieval.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ def get_collection_edr_instances(api: API, request: APIRequest, dataset,
173173
}])
174174

175175
if request.format == F_HTML: # render
176-
api.set_dataset_templates(dataset)
176+
tpl_config = api.get_dataset_templates(dataset)
177177

178178
serialized_query_params = ''
179179
for k, v in request.params.items():
@@ -224,8 +224,8 @@ def get_collection_edr_instances(api: API, request: APIRequest, dataset,
224224
'href': f'{uri}?f={F_JSONLD}{serialized_query_params}'
225225
}]
226226

227-
content = render_j2_template(api.tpl_config, template, data,
228-
api.default_locale)
227+
content = render_j2_template(api.tpl_config, tpl_config, template,
228+
data, api.default_locale)
229229
else:
230230
content = to_json(data, api.pretty_print)
231231

@@ -381,7 +381,7 @@ def get_collection_edr_query(api: API, request: APIRequest,
381381
err.ogc_exception_code, err.message)
382382

383383
if request.format == F_HTML: # render
384-
api.set_dataset_templates(dataset)
384+
tpl_config = api.get_dataset_templates(dataset)
385385

386386
uri = f'{api.get_collections_url()}/{dataset}/{query_type}'
387387
serialized_query_params = ''
@@ -413,7 +413,7 @@ def get_collection_edr_query(api: API, request: APIRequest,
413413
'href': f'{uri}?f={F_JSONLD}{serialized_query_params}'
414414
}]
415415

416-
content = render_j2_template(api.tpl_config,
416+
content = render_j2_template(api.tpl_config, tpl_config,
417417
'collections/edr/query.html', data,
418418
api.default_locale)
419419
else:

pygeoapi/api/itemtypes.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ def get_collection_queryables(api: API, request: Union[APIRequest, Any],
177177
queryables['properties'][k]['x-ogc-role'] = 'primary-instant' # noqa
178178

179179
if request.format == F_HTML: # render
180-
api.set_dataset_templates(dataset)
180+
tpl_config = api.get_dataset_templates(dataset)
181181

182182
queryables['title'] = l10n.translate(
183183
api.config['resources'][dataset]['title'], request.locale)
184184

185185
queryables['collections_path'] = api.get_collections_url()
186186
queryables['dataset_path'] = f'{api.get_collections_url()}/{dataset}'
187187

188-
content = render_j2_template(api.tpl_config,
188+
content = render_j2_template(api.tpl_config, tpl_config,
189189
'collections/queryables.html',
190190
queryables, request.locale)
191191

@@ -591,7 +591,7 @@ def get_collection_items(
591591
l10n.set_response_language(headers, prv_locale, request.locale)
592592

593593
if request.format == F_HTML: # render
594-
api.set_dataset_templates(dataset)
594+
tpl_config = api.get_dataset_templates(dataset)
595595
# For constructing proper URIs to items
596596

597597
content['items_path'] = uri
@@ -608,7 +608,7 @@ def get_collection_items(
608608
request.locale)
609609
# If title exists, use it as id in html templates
610610
content['id_field'] = content['title_field']
611-
content = render_j2_template(api.tpl_config,
611+
content = render_j2_template(api.tpl_config, tpl_config,
612612
'collections/items/index.html',
613613
content, request.locale)
614614
return headers, HTTPStatus.OK, content
@@ -909,7 +909,7 @@ def get_collection_item(api: API, request: APIRequest,
909909
l10n.set_response_language(headers, prv_locale, request.locale)
910910

911911
if request.format == F_HTML: # render
912-
api.set_dataset_templates(dataset)
912+
tpl_config = api.get_dataset_templates(dataset)
913913
content['title'] = l10n.translate(collections[dataset]['title'],
914914
request.locale)
915915
content['id_field'] = p.id_field
@@ -920,7 +920,7 @@ def get_collection_item(api: API, request: APIRequest,
920920
request.locale)
921921
content['collections_path'] = api.get_collections_url()
922922

923-
content = render_j2_template(api.tpl_config,
923+
content = render_j2_template(api.tpl_config, tpl_config,
924924
'collections/items/item.html',
925925
content, request.locale)
926926
return headers, HTTPStatus.OK, content

pygeoapi/api/processes.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,14 @@ def describe_processes(api: API, request: APIRequest,
211211

212212
if request.format == F_HTML: # render
213213
if process is not None:
214-
api.set_dataset_templates(process)
215-
response = render_j2_template(api.tpl_config,
214+
tpl_config = api.get_dataset_templates(process)
215+
response = render_j2_template(api.tpl_config, tpl_config,
216216
'processes/process.html',
217217
response, request.locale)
218218
else:
219-
response = render_j2_template(api.tpl_config,
220-
'processes/index.html', response,
221-
request.locale)
219+
response = render_j2_template(
220+
api.tpl_config, api.config['server']['templates'],
221+
'processes/index.html', response, request.locale)
222222

223223
return headers, HTTPStatus.OK, response
224224

@@ -394,8 +394,10 @@ def get_jobs(api: API, request: APIRequest,
394394
'offset': offset,
395395
'now': datetime.now(timezone.utc).strftime(DATETIME_FORMAT)
396396
}
397-
response = render_j2_template(api.tpl_config, j2_template, data,
398-
request.locale)
397+
response = render_j2_template(
398+
api.tpl_config, api.config['server']['templates'], j2_template,
399+
data, request.locale)
400+
399401
return headers, HTTPStatus.OK, response
400402

401403
return headers, HTTPStatus.OK, to_json(serialized_jobs,
@@ -586,8 +588,8 @@ def get_job_result(api: API, request: APIRequest,
586588
'result': job_output
587589
}
588590
content = render_j2_template(
589-
api.config, 'jobs/results/index.html',
590-
data, request.locale)
591+
api.config, api.config['server']['templates'],
592+
'jobs/results/index.html', data, request.locale)
591593

592594
return headers, HTTPStatus.OK, content
593595

pygeoapi/api/stac.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,10 @@ def get_stac_root(api: API, request: APIRequest) -> Tuple[dict, int, str]:
106106
})
107107

108108
if request.format == F_HTML: # render
109-
content = render_j2_template(api.tpl_config,
110-
'stac/collection.html',
111-
content, request.locale)
109+
content = render_j2_template(
110+
api.tpl_config, api.config['server']['templates'],
111+
'stac/collection.html', content, request.locale)
112+
112113
return headers, HTTPStatus.OK, content
113114

114115
return headers, HTTPStatus.OK, to_json(content, api.pretty_print)
@@ -187,18 +188,13 @@ def get_stac_path(api: API, request: APIRequest,
187188
if 'assets' in content: # item view
188189
if content['type'] == 'Collection':
189190
content = render_j2_template(
190-
api.tpl_config,
191+
api.tpl_config, api.config['server']['templates'],
191192
'stac/collection_base.html',
192-
content,
193-
request.locale
194-
)
193+
content, request.locale)
195194
elif content['type'] == 'Feature':
196195
content = render_j2_template(
197-
api.tpl_config,
198-
'stac/item.html',
199-
content,
200-
request.locale
201-
)
196+
api.tpl_config, api.config['server']['templattes'],
197+
'stac/item.html', content, request.locale)
202198
else:
203199
msg = f'Unknown STAC type {content.type}'
204200
return api.get_exception(
@@ -208,9 +204,9 @@ def get_stac_path(api: API, request: APIRequest,
208204
'NoApplicableCode',
209205
msg)
210206
else:
211-
content = render_j2_template(api.tpl_config,
212-
'stac/catalog.html',
213-
content, request.locale)
207+
content = render_j2_template(
208+
api.tpl_config, api.config['server']['templates'],
209+
'stac/catalog.html', content, request.locale)
214210

215211
return headers, HTTPStatus.OK, content
216212

pygeoapi/api/tiles.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def get_collection_tiles(api: API, request: APIRequest,
176176
tiles['tilesets'].append(tile_matrix)
177177

178178
if request.format == F_HTML: # render
179-
api.set_dataset_templates(dataset)
179+
tpl_config = api.get_dataset_templates(dataset)
180180
tiles['id'] = dataset
181181
tiles['title'] = l10n.translate(
182182
api.config['resources'][dataset]['title'], SYSTEM_LOCALE)
@@ -189,7 +189,7 @@ def get_collection_tiles(api: API, request: APIRequest,
189189
tiles['collections_path'] = api.get_collections_url()
190190
tiles['tile_type'] = p.tile_type
191191

192-
content = render_j2_template(api.tpl_config,
192+
content = render_j2_template(api.tpl_config, tpl_config,
193193
'collections/tiles/index.html', tiles,
194194
request.locale)
195195

@@ -322,8 +322,8 @@ def get_collection_tiles_metadata(
322322
language=prv_locale)
323323

324324
if request.format == F_HTML: # render
325-
api.set_dataset_templates(dataset)
326-
content = render_j2_template(api.tpl_config,
325+
tpl_config = api.get_dataset_templates(dataset)
326+
content = render_j2_template(api.tpl_config, tpl_config,
327327
'collections/tiles/metadata.html',
328328
tiles_metadata, request.locale)
329329

@@ -384,7 +384,7 @@ def tilematrixsets(api: API,
384384
}]
385385

386386
if request.format == F_HTML: # render
387-
content = render_j2_template(api.tpl_config,
387+
content = render_j2_template(api.tpl_config, api.tpl_config,
388388
'tilematrixsets/index.html',
389389
tms, request.locale)
390390
return headers, HTTPStatus.OK, content
@@ -432,7 +432,7 @@ def tilematrixset(api: API,
432432
}
433433

434434
if request.format == F_HTML: # render
435-
content = render_j2_template(api.tpl_config,
435+
content = render_j2_template(api.tpl_config, api.tpl_config,
436436
'tilematrixsets/tilematrixset.html',
437437
tms, request.locale)
438438
return headers, HTTPStatus.OK, content

pygeoapi/linked_data.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,10 @@ def geojson2jsonld(cls, data: dict, dataset: str,
253253
else:
254254
# Render jsonld template for single item with template configured
255255
LOGGER.debug(f'Rendering JSON-LD template: {template}')
256-
content = render_j2_template(cls.config, template, ldjsonData)
256+
content = render_j2_template(
257+
cls.config, cls.config['server']['templates'],
258+
template, ldjsonData)
259+
257260
ldjsonData = json.loads(content)
258261
return ldjsonData
259262

0 commit comments

Comments
 (0)