diff --git a/openeo_driver/backend.py b/openeo_driver/backend.py index cb1cf0cc..a17cc16f 100644 --- a/openeo_driver/backend.py +++ b/openeo_driver/backend.py @@ -16,11 +16,15 @@ from datetime import datetime from openeo import ImageCollection +from openeo.util import date_to_rfc3339 from openeo_driver.errors import OpenEOApiException, CollectionNotFoundException from openeo_driver.utils import read_json class ServiceMetadata(NamedTuple): + # TODO: move this to openeo-python-client? + # TODO: also add user metadata? + # Required fields (no default) id: str process: dict # TODO: also encapsulate this "process graph with metadata" struct (instead of free-form dict)? @@ -28,6 +32,7 @@ class ServiceMetadata(NamedTuple): type: str enabled: bool attributes: dict + # Optional fields (with default) title: str = None description: str = None @@ -37,6 +42,21 @@ class ServiceMetadata(NamedTuple): costs: float = None budget: float = None + def prepare_for_json(self) -> dict: + """Prepare metadata for JSON serialization""" + d = self._asdict() + d["created"] = date_to_rfc3339(self.created) if self.created else None + return d + + @classmethod + def from_dict(cls, d:dict) -> 'ServiceMetadata': + """Load ServiceMetadata from dict (e.g. parsed JSON dump).""" + created = d.get("created") + if isinstance(created, str): + d = d.copy() + d["created"] = datetime.strptime(created, '%Y-%m-%dT%H:%M:%SZ') + return cls(**d) + class SecondaryServices: """ diff --git a/openeo_driver/views.py b/openeo_driver/views.py index fb34ab54..cfa0c67c 100644 --- a/openeo_driver/views.py +++ b/openeo_driver/views.py @@ -591,8 +591,7 @@ def services_post(): def _service_metadata_to_json(metadata: ServiceMetadata, full=True) -> dict: """API-version-aware conversion of service metadata to jsonable dict""" - d = metadata._asdict() - d["created"] = date_to_rfc3339(metadata.created) if metadata.created else None + d = metadata.prepare_for_json() if not full: d.pop("process") d.pop("attributes")