Skip to content

Commit beaea85

Browse files
committed
fixup! fixup! WIP: Enrich UserDefinedProcesses API
1 parent cd88bec commit beaea85

File tree

3 files changed

+39
-7
lines changed

3 files changed

+39
-7
lines changed

openeo_driver/backend.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from openeo_driver.users.oidc import OidcProvider
3838
from openeo_driver.util.date_math import simple_job_progress_estimation
3939
from openeo_driver.util.logging import just_log_exceptions
40+
from openeo_driver.util.pagination import PaginationRequest
4041
from openeo_driver.utils import read_json, dict_item, EvalEnv, extract_namedtuple_fields_from_dict, \
4142
get_package_versions
4243

@@ -497,6 +498,7 @@ def get_job_info(self, job_id: str, user_id: str) -> BatchJobMetadata:
497498
def get_user_jobs(
498499
self,
499500
user_id: str,
501+
# TODO #377 migrate this to `PaginationRequest`
500502
limit: Optional[int] = None,
501503
request_parameters: Optional[dict] = None,
502504
# TODO #332 settle on returning just `JobListing` and eliminate other options/code paths.
@@ -692,16 +694,15 @@ def get_for_user(self, user_id: str) -> List[UserDefinedProcessMetadata]:
692694
List user's UDPs
693695
https://openeo.org/documentation/1.0/developers/api/reference.html#operation/list-custom-processes
694696
"""
695-
# TODO remove this deprecated API when unused
697+
# TODO remove this deprecated API when unused (replaced by `list_for_user`)
696698
raise NotImplementedError
697699

698700
def list_for_user(
699701
self,
700702
user_id: str,
701-
# TODO: encapsulate limit and request_parameters in a pagination object?
702-
limit: Optional[int] = None,
703-
request_parameters: Optional[dict] = None,
703+
pagination: Optional[PaginationRequest] = None,
704704
) -> UserDefinedProcessesListing:
705+
# TODO: remove this adapter implementation once `get_for_user` is removed
705706
udps = self.get_for_user(user_id=user_id)
706707
return UserDefinedProcessesListing(udps=udps)
707708

openeo_driver/util/pagination.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import flask
2+
from typing import Union, Optional
3+
4+
import dataclasses
5+
6+
7+
@dataclasses.dataclass(frozen=True)
8+
class PaginationRequest:
9+
"""
10+
Representation of pagination related request parameters.
11+
12+
The openEO API just defines a request parameter `limit`
13+
as a trigger to enable pagination.
14+
Additional request parameters or URL patterns
15+
to encode page numbers/offsets are not defined in the API,
16+
and open for backends to choose.
17+
"""
18+
19+
limit: Union[None, int]
20+
request_parameters: dict
21+
22+
@classmethod
23+
def from_request(cls, request: flask.Request):
24+
limit = request.args.get("limit", default=None, type=int)
25+
request_parameters = flask.request.args.to_dict()
26+
return cls(limit=limit, request_parameters=request_parameters)
27+
28+
def __bool__(self):
29+
return self.limit is not None

openeo_driver/views.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
from openeo_driver.users.auth import HttpAuthHandler
6363
from openeo_driver.util.geometry import BoundingBox, reproject_geometry
6464
from openeo_driver.util.logging import FlaskRequestCorrelationIdLogging, ExtraLoggingFilter
65+
from openeo_driver.util.pagination import PaginationRequest
6566
from openeo_driver.utils import EvalEnv, smart_bool, generate_unique_id, filter_supported_kwargs
6667

6768
_log = logging.getLogger(__name__)
@@ -937,7 +938,8 @@ def list_jobs(user: User):
937938
# TODO: openEO API currently prescribes no pagination by default (unset limit)
938939
# This is however not very scalable, so we might want to set a default limit here.
939940
# Also see https://github.com/Open-EO/openeo-api/issues/550
940-
limit = flask.request.args.get("limit", type=int)
941+
# TODO #377 migrate this to `PaginationRequest`
942+
limit = flask.request.args.get("limit", default=None, type=int)
941943
request_parameters = flask.request.args
942944

943945
# TODO #332 settle on receiving just `JobListing` here and eliminate other options/code paths.
@@ -1762,8 +1764,8 @@ def udp_get(process_graph_id: str, user: User):
17621764
@blueprint.route('/process_graphs', methods=['GET'])
17631765
@auth_handler.requires_bearer_auth
17641766
def udp_list_for_user(user: User):
1765-
# TODO #377 pagination support
1766-
udps = backend_implementation.user_defined_processes.list_for_user(user_id=user.user_id)
1767+
pagination = PaginationRequest.from_request(request=flask.request)
1768+
udps = backend_implementation.user_defined_processes.list_for_user(user_id=user.user_id, pagination=pagination)
17671769
return jsonify(udps.to_response_dict())
17681770

17691771
@api_endpoint

0 commit comments

Comments
 (0)