Skip to content

Commit 475c567

Browse files
authored
Continue refactoring of API #1405 in remaining files (#1842)
* Refactor landing_page api to new style * Refactor openapi view to new style * Refactor remaining core api views * Update tests which reference core apis * Refactor get_config_ from admin api to new style * Refactor remaining admin api views to new style * Remove reference to api function which does not exist This is necessary for subsequent refactorings * Remove now unsed api helper code * Remove APIRequest.with_data * Update APIRequest documentation
1 parent caafad4 commit 475c567

11 files changed

Lines changed: 1376 additions & 1641 deletions

pygeoapi/admin.py

Lines changed: 404 additions & 431 deletions
Large diffs are not rendered by default.

pygeoapi/api/__init__.py

Lines changed: 704 additions & 843 deletions
Large diffs are not rendered by default.

pygeoapi/django_/views.py

Lines changed: 24 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,21 @@
3535

3636
"""Integration module for Django"""
3737

38-
from typing import Tuple, Dict, Mapping, Optional, Union
38+
from typing import Optional, Union
3939

4040
from django.conf import settings
4141
from django.http import HttpRequest, HttpResponse
4242

4343
from pygeoapi.api import API, APIRequest, apply_gzip
44+
import pygeoapi.api as core_api
4445
import pygeoapi.api.coverages as coverages_api
4546
import pygeoapi.api.environmental_data_retrieval as edr_api
4647
import pygeoapi.api.itemtypes as itemtypes_api
4748
import pygeoapi.api.maps as maps_api
4849
import pygeoapi.api.processes as processes_api
4950
import pygeoapi.api.stac as stac_api
5051
import pygeoapi.api.tiles as tiles_api
52+
import pygeoapi.admin as admin_api
5153

5254

5355
def landing_page(request: HttpRequest) -> HttpResponse:
@@ -59,10 +61,7 @@ def landing_page(request: HttpRequest) -> HttpResponse:
5961
:returns: Django HTTP Response
6062
"""
6163

62-
response_ = _feed_response(request, 'landing_page')
63-
response = _to_django_response(*response_)
64-
65-
return response
64+
return execute_from_django(core_api.landing_page, request)
6665

6766

6867
def openapi(request: HttpRequest) -> HttpResponse:
@@ -74,10 +73,7 @@ def openapi(request: HttpRequest) -> HttpResponse:
7473
:returns: Django HTTP Response
7574
"""
7675

77-
response_ = _feed_response(request, 'openapi_')
78-
response = _to_django_response(*response_)
79-
80-
return response
76+
return execute_from_django(core_api.openapi_, request)
8177

8278

8379
def conformance(request: HttpRequest) -> HttpResponse:
@@ -88,11 +84,7 @@ def conformance(request: HttpRequest) -> HttpResponse:
8884
8985
:returns: Django HTTP Response
9086
"""
91-
92-
response_ = _feed_response(request, 'conformance')
93-
response = _to_django_response(*response_)
94-
95-
return response
87+
return execute_from_django(core_api.conformance, request)
9688

9789

9890
def tilematrixsets(request: HttpRequest,
@@ -126,9 +118,8 @@ def collections(request: HttpRequest,
126118
:returns: Django HTTP Response
127119
"""
128120

129-
response_ = _feed_response(request, 'describe_collections', collection_id)
130-
131-
return _to_django_response(*response_)
121+
return execute_from_django(core_api.describe_collections, request,
122+
collection_id)
132123

133124

134125
def collection_schema(request: HttpRequest,
@@ -142,7 +133,7 @@ def collection_schema(request: HttpRequest,
142133
:returns: Django HTTP Response
143134
"""
144135

145-
return execute_from_django(itemtypes_api.get_collection_schema, request,
136+
return execute_from_django(core_api.get_collection_schema, request,
146137
collection_id)
147138

148139

@@ -484,13 +475,13 @@ def admin_config(request: HttpRequest) -> HttpResponse:
484475
"""
485476

486477
if request.method == 'GET':
487-
return _feed_response(request, 'get_admin_config')
478+
return execute_from_django(admin_api.get_config_, request)
488479

489480
elif request.method == 'PUT':
490-
return _feed_response(request, 'put_admin_config')
481+
return execute_from_django(admin_api.put_config, request)
491482

492483
elif request.method == 'PATCH':
493-
return _feed_response(request, 'patch_admin_config')
484+
return execute_from_django(admin_api.patch_config, request)
494485

495486

496487
def admin_config_resources(request: HttpRequest) -> HttpResponse:
@@ -501,10 +492,10 @@ def admin_config_resources(request: HttpRequest) -> HttpResponse:
501492
"""
502493

503494
if request.method == 'GET':
504-
return _feed_response(request, 'get_admin_config_resources')
495+
return execute_from_django(admin_api.get_resources, request)
505496

506497
elif request.method == 'POST':
507-
return _feed_response(request, 'put_admin_config_resources')
498+
return execute_from_django(admin_api.put_resource, request)
508499

509500

510501
def admin_config_resource(request: HttpRequest,
@@ -516,36 +507,20 @@ def admin_config_resource(request: HttpRequest,
516507
"""
517508

518509
if request.method == 'GET':
519-
return _feed_response(request, 'put_admin_config_resource',
520-
resource_id)
510+
return execute_from_django(admin_api.get_resource, request,
511+
resource_id)
521512

522513
elif request.method == 'DELETE':
523-
return _feed_response(request, 'delete_admin_config_resource',
524-
resource_id)
514+
return execute_from_django(admin_api.delete_resource, request,
515+
resource_id)
525516

526517
elif request.method == 'PUT':
527-
return _feed_response(request, 'put_admin_config_resource',
528-
resource_id)
518+
return execute_from_django(admin_api.put_resource, request,
519+
resource_id)
529520

530521
elif request.method == 'PATCH':
531-
return _feed_response(request, 'patch_admin_config_resource',
532-
resource_id)
533-
534-
535-
# TODO: remove this when all views have been refactored
536-
def _feed_response(request: HttpRequest, api_definition: str,
537-
*args, **kwargs) -> Tuple[Dict, int, str]:
538-
"""Use pygeoapi api to process the input request"""
539-
540-
if 'admin' in api_definition and settings.PYGEOAPI_CONFIG['server'].get('admin'): # noqa
541-
from pygeoapi.admin import Admin
542-
api_ = Admin(settings.PYGEOAPI_CONFIG, settings.OPENAPI_DOCUMENT)
543-
else:
544-
api_ = API(settings.PYGEOAPI_CONFIG, settings.OPENAPI_DOCUMENT)
545-
546-
api = getattr(api_, api_definition)
547-
548-
return api(request, *args, **kwargs)
522+
return execute_from_django(admin_api.patch_resource, request,
523+
resource_id)
549524

550525

551526
def execute_from_django(api_function, request: HttpRequest, *args,
@@ -567,15 +542,8 @@ def execute_from_django(api_function, request: HttpRequest, *args,
567542
headers, status, content = api_function(api_, api_request, *args)
568543
content = apply_gzip(headers, content)
569544

570-
return _to_django_response(headers, status, content)
571-
572-
573-
# TODO: inline this to execute_from_django after refactoring
574-
def _to_django_response(headers: Mapping, status_code: int,
575-
content: Union[str, bytes]) -> HttpResponse:
576-
"""Convert API payload to a django response"""
577-
578-
response = HttpResponse(content, status=status_code)
545+
# Convert API payload to a django response
546+
response = HttpResponse(content, status=status)
579547

580548
for key, value in headers.items():
581549
response[key] = value

pygeoapi/flask_app.py

Lines changed: 45 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
3838
send_from_directory, Response, Request)
3939

4040
from pygeoapi.api import API, APIRequest, apply_gzip
41+
import pygeoapi.api as core_api
4142
import pygeoapi.api.coverages as coverages_api
4243
import pygeoapi.api.environmental_data_retrieval as edr_api
4344
import pygeoapi.api.itemtypes as itemtypes_api
4445
import pygeoapi.api.maps as maps_api
4546
import pygeoapi.api.processes as processes_api
4647
import pygeoapi.api.stac as stac_api
4748
import pygeoapi.api.tiles as tiles_api
49+
import pygeoapi.admin as admin_api
4850
from pygeoapi.openapi import load_openapi_document
4951
from pygeoapi.config import get_config
5052
from pygeoapi.util import get_mimetype, get_api_rules
@@ -118,50 +120,39 @@ def schemas(path):
118120
mimetype=get_mimetype(basename_))
119121

120122

121-
# TODO: inline in execute_from_flask when all views have been refactored
122-
def get_response(result: tuple):
123-
"""
124-
Creates a Flask Response object and updates matching headers.
125-
126-
:param result: The result of the API call.
127-
This should be a tuple of (headers, status, content).
128-
129-
:returns: A Response instance
130-
"""
131-
132-
headers, status, content = result
133-
response = make_response(content, status)
134-
135-
if headers:
136-
response.headers = headers
137-
return response
138-
139-
140123
def execute_from_flask(api_function, request: Request, *args,
141-
skip_valid_check=False) -> Response:
124+
skip_valid_check=False,
125+
alternative_api=None
126+
) -> Response:
142127
"""
143128
Executes API function from Flask
144129
145130
:param api_function: API function
146131
:param request: request object
147132
:param *args: variable length additional arguments
148133
:param skip_validity_check: bool
134+
:param alternative_api: specify custom api instance such as Admin
149135
150136
:returns: A Response instance
151137
"""
152138

153-
api_request = APIRequest.from_flask(request, api_.locales)
139+
actual_api = api_ if alternative_api is None else alternative_api
140+
141+
api_request = APIRequest.from_flask(request, actual_api.locales)
154142

155143
content: Union[str, bytes]
156144

157145
if not skip_valid_check and not api_request.is_valid():
158-
headers, status, content = api_.get_format_exception(api_request)
146+
headers, status, content = actual_api.get_format_exception(api_request)
159147
else:
160-
headers, status, content = api_function(api_, api_request, *args)
148+
headers, status, content = api_function(actual_api, api_request, *args)
161149
content = apply_gzip(headers, content)
162-
# handle jsonld too?
163150

164-
return get_response((headers, status, content))
151+
response = make_response(content, status)
152+
153+
if headers:
154+
response.headers = headers
155+
return response
165156

166157

167158
@BLUEPRINT.route('/')
@@ -171,7 +162,7 @@ def landing_page():
171162
172163
:returns: HTTP response
173164
"""
174-
return get_response(api_.landing_page(request))
165+
return execute_from_flask(core_api.landing_page, request)
175166

176167

177168
@BLUEPRINT.route('/openapi')
@@ -182,7 +173,7 @@ def openapi():
182173
:returns: HTTP response
183174
"""
184175

185-
return get_response(api_.openapi_(request))
176+
return execute_from_flask(core_api.openapi_, request)
186177

187178

188179
@BLUEPRINT.route('/conformance')
@@ -193,7 +184,7 @@ def conformance():
193184
:returns: HTTP response
194185
"""
195186

196-
return get_response(api_.conformance(request))
187+
return execute_from_flask(core_api.conformance, request)
197188

198189

199190
@BLUEPRINT.route('/TileMatrixSets/<tileMatrixSetId>')
@@ -232,7 +223,8 @@ def collections(collection_id=None):
232223
:returns: HTTP response
233224
"""
234225

235-
return get_response(api_.describe_collections(request, collection_id))
226+
return execute_from_flask(core_api.describe_collections, request,
227+
collection_id)
236228

237229

238230
@BLUEPRINT.route('/collections/<path:collection_id>/schema')
@@ -245,7 +237,8 @@ def collection_schema(collection_id):
245237
:returns: HTTP response
246238
"""
247239

248-
return get_response(api_.get_collection_schema(request, collection_id))
240+
return execute_from_flask(core_api.get_collection_schema, request,
241+
collection_id)
249242

250243

251244
@BLUEPRINT.route('/collections/<path:collection_id>/queryables')
@@ -466,23 +459,6 @@ def get_job_result(job_id=None):
466459
return execute_from_flask(processes_api.get_job_result, request, job_id)
467460

468461

469-
@BLUEPRINT.route('/jobs/<job_id>/results/<resource>',
470-
methods=['GET'])
471-
def get_job_result_resource(job_id, resource):
472-
"""
473-
OGC API - Processes job result resource endpoint
474-
475-
:param job_id: job identifier
476-
:param resource: job resource
477-
478-
:returns: HTTP response
479-
"""
480-
481-
# TODO: this does not seem to exist?
482-
return get_response(api_.get_job_result_resource(
483-
request, job_id, resource))
484-
485-
486462
@BLUEPRINT.route('/collections/<path:collection_id>/position')
487463
@BLUEPRINT.route('/collections/<path:collection_id>/area')
488464
@BLUEPRINT.route('/collections/<path:collection_id>/cube')
@@ -556,13 +532,16 @@ def admin_config():
556532
"""
557533

558534
if request.method == 'GET':
559-
return get_response(admin_.get_config(request))
535+
return execute_from_flask(admin_api.get_config_, request,
536+
alternative_api=admin_)
560537

561538
elif request.method == 'PUT':
562-
return get_response(admin_.put_config(request))
539+
return execute_from_flask(admin_api.put_config, request,
540+
alternative_api=admin_)
563541

564542
elif request.method == 'PATCH':
565-
return get_response(admin_.patch_config(request))
543+
return execute_from_flask(admin_api.patch_config, request,
544+
alternative_api=admin_)
566545

567546

568547
@ADMIN_BLUEPRINT.route('/admin/config/resources', methods=['GET', 'POST'])
@@ -574,10 +553,12 @@ def admin_config_resources():
574553
"""
575554

576555
if request.method == 'GET':
577-
return get_response(admin_.get_resources(request))
556+
return execute_from_flask(admin_api.get_resources, request,
557+
alternative_api=admin_)
578558

579559
elif request.method == 'POST':
580-
return get_response(admin_.post_resource(request))
560+
return execute_from_flask(admin_api.post_resource, request,
561+
alternative_api=admin_)
581562

582563

583564
@ADMIN_BLUEPRINT.route(
@@ -591,16 +572,24 @@ def admin_config_resource(resource_id):
591572
"""
592573

593574
if request.method == 'GET':
594-
return get_response(admin_.get_resource(request, resource_id))
575+
return execute_from_flask(admin_api.get_resource, request,
576+
resource_id,
577+
alternative_api=admin_)
595578

596579
elif request.method == 'DELETE':
597-
return get_response(admin_.delete_resource(request, resource_id))
580+
return execute_from_flask(admin_api.delete_resource, request,
581+
resource_id,
582+
alternative_api=admin_)
598583

599584
elif request.method == 'PUT':
600-
return get_response(admin_.put_resource(request, resource_id))
585+
return execute_from_flask(admin_api.put_resource, request,
586+
resource_id,
587+
alternative_api=admin_)
601588

602589
elif request.method == 'PATCH':
603-
return get_response(admin_.patch_resource(request, resource_id))
590+
return execute_from_flask(admin_api.patch_resource, request,
591+
resource_id,
592+
alternative_api=admin_)
604593

605594

606595
APP.register_blueprint(BLUEPRINT)

0 commit comments

Comments
 (0)