Skip to content
This repository was archived by the owner on Apr 2, 2025. It is now read-only.

Commit 6d8cc1e

Browse files
author
Phil Varner
committed
change Order order_parameters to dict, OrderRequest to typed object
1 parent b4cf99a commit 6d8cc1e

File tree

7 files changed

+299
-235
lines changed

7 files changed

+299
-235
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ repos:
1010
- id: trailing-whitespace
1111
- id: no-commit-to-branch
1212
- repo: https://github.com/charliermarsh/ruff-pre-commit
13-
rev: v0.7.3
13+
rev: v0.7.4
1414
hooks:
1515
- id: ruff
1616
args: [--fix, --exit-non-zero-on-fix]

bin/server.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime, timezone
12
from uuid import uuid4
23

34
from fastapi import FastAPI, Request
@@ -16,6 +17,8 @@
1617
OrderCollection,
1718
OrderParameters,
1819
OrderRequest,
20+
OrderStatus,
21+
OrderStatusCode,
1922
)
2023
from stapi_fastapi.models.product import (
2124
Product,
@@ -75,10 +78,17 @@ async def create_order(
7578
geometry=payload.geometry,
7679
properties={
7780
"product_id": product_router.product.id,
78-
"datetime": payload.datetime,
79-
"geometry": payload.geometry,
80-
"filter": payload.filter,
81-
"order_parameters": payload.order_parameters,
81+
"created": datetime.now(timezone.utc),
82+
"status": OrderStatus(
83+
timestamp=datetime.now(timezone.utc),
84+
status_code=OrderStatusCode.accepted,
85+
),
86+
"search_parameters": {
87+
"geometry": payload.geometry,
88+
"datetime": payload.datetime,
89+
"filter": payload.filter,
90+
},
91+
"order_parameters": payload.order_parameters.model_dump(),
8292
"opportunity_properties": {
8393
"datetime": "2024-01-29T12:00:00Z/2024-01-30T12:00:00Z",
8494
"off_nadir": 10,

poetry.lock

Lines changed: 213 additions & 212 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,14 @@ pydantic = "^2.9.2"
1515
geojson-pydantic = "^1.1.1"
1616
pygeofilter = "^0.2.4"
1717
cql2 = "^0.3.1"
18+
ruff = "^0.7.4"
1819

1920
[tool.poetry.group.dev]
2021
optional = true
2122

2223
[tool.poetry.group.dev.dependencies]
2324
pytest = "^8.1.1"
24-
ruff = "^0.3.4"
25+
ruff = "^0.7.4"
2526
uvicorn = "^0.29.0"
2627
pydantic-settings = "^2.2.1"
2728
httpx = "^0.27.0"

src/stapi_fastapi/models/order.py

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
from typing import Any, Generic, Literal, TypeVar
1+
from enum import Enum
2+
from typing import Any, Generic, Literal, Optional, TypeVar
23

34
from geojson_pydantic import Feature, FeatureCollection
45
from geojson_pydantic.geometries import Geometry
5-
from pydantic import BaseModel, ConfigDict, Field, StrictInt, StrictStr
6+
from pydantic import (
7+
AwareDatetime,
8+
BaseModel,
9+
ConfigDict,
10+
Field,
11+
StrictInt,
12+
StrictStr,
13+
)
614

715
from stapi_fastapi.models.opportunity import OpportunityProperties
816
from stapi_fastapi.models.shared import Link
@@ -24,19 +32,42 @@ class OrderRequest(BaseModel, Generic[ORP]):
2432
# TODO: validate the CQL2 filter?
2533
filter: CQL2Filter | None = None
2634

27-
order_parameters: dict[str, Any]
35+
order_parameters: ORP
2836

2937
model_config = ConfigDict(strict=True)
3038

3139

32-
class OrderProperties(BaseModel, Generic[OPP, ORP]):
33-
product_id: str
40+
class OrderStatusCode(str, Enum):
41+
received = "received"
42+
accepted = "accepted"
43+
rejected = "rejected"
44+
completed = "completed"
45+
canceled = "canceled"
46+
47+
48+
class OrderStatus(BaseModel):
49+
timestamp: AwareDatetime
50+
status_code: OrderStatusCode
51+
reason_code: Optional[str] = None
52+
reason_text: Optional[str] = None
53+
links: list[Link] = Field(default_factory=list)
54+
55+
56+
class OrderSearchParameters(BaseModel):
3457
datetime: DatetimeInterval
58+
geometry: Geometry
3559
# TODO: validate the CQL2 filter?
3660
filter: CQL2Filter | None = None
3761

38-
opportunity_properties: OPP
39-
order_parameters: ORP
62+
63+
class OrderProperties(BaseModel, Generic[OPP, ORP]):
64+
product_id: str
65+
created: AwareDatetime
66+
status: OrderStatus
67+
68+
search_parameters: OrderSearchParameters
69+
opportunity_properties: dict[str, Any]
70+
order_parameters: dict[str, Any]
4071

4172
model_config = ConfigDict(extra="allow")
4273

tests/backends.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime, timezone
12
from uuid import uuid4
23

34
from fastapi import Request
@@ -6,7 +7,13 @@
67
from stapi_fastapi.backends.root_backend import RootBackend
78
from stapi_fastapi.exceptions import ConstraintsException, NotFoundException
89
from stapi_fastapi.models.opportunity import Opportunity, OpportunityRequest
9-
from stapi_fastapi.models.order import Order, OrderCollection, OrderRequest
10+
from stapi_fastapi.models.order import (
11+
Order,
12+
OrderCollection,
13+
OrderRequest,
14+
OrderStatus,
15+
OrderStatusCode,
16+
)
1017
from stapi_fastapi.routers.product_router import ProductRouter
1118

1219
from .shared import SpotlightOpportunityProperties, SpotlightOrderParameters
@@ -60,15 +67,24 @@ async def create_order(
6067
Create a new order.
6168
"""
6269
if any(allowed == payload for allowed in self._allowed_payloads):
63-
order = Order[SpotlightOpportunityProperties, SpotlightOrderParameters](
70+
order = Order[
71+
SpotlightOpportunityProperties, SpotlightOrderParameters
72+
](
6473
id=str(uuid4()),
65-
geometry=payload.geometry,
74+
geometry=payload.geometry, # maybe set to a different value by opportunity resolution process
6675
properties={
6776
"product_id": product_router.product.id,
68-
"datetime": payload.datetime,
69-
"geometry": payload.geometry,
70-
"filter": payload.filter,
71-
"order_parameters": payload.order_parameters,
77+
"created": datetime.now(timezone.utc),
78+
"status": OrderStatus(
79+
timestamp=datetime.now(timezone.utc),
80+
status_code=OrderStatusCode.accepted,
81+
),
82+
"search_parameters": {
83+
"geometry": payload.geometry,
84+
"datetime": payload.datetime,
85+
"filter": payload.filter,
86+
},
87+
"order_parameters": payload.order_parameters.model_dump(),
7288
"opportunity_properties": {
7389
"datetime": "2024-01-29T12:00:00Z/2024-01-30T12:00:00Z",
7490
"off_nadir": 10,

tests/order_test.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from stapi_fastapi.models.order import OrderRequest
1111

1212
from .backends import MockProductBackend
13-
from .shared import find_link
13+
from .shared import SpotlightOrderParameters, find_link
1414

1515
NOW = datetime.now(UTC)
1616
START = NOW
@@ -29,7 +29,7 @@ def create_order_allowed_payloads() -> list[OrderRequest]:
2929
datetime.fromisoformat("2024-11-15T18:55:33Z"),
3030
),
3131
filter=None,
32-
order_parameters={"s3_path": "BUCKET"},
32+
order_parameters=SpotlightOrderParameters(s3_path="s3://my-bucket"),
3333
),
3434
]
3535

@@ -86,7 +86,12 @@ def test_get_order_properties(
8686
"coordinates": list(create_order_allowed_payloads[0].geometry.coordinates),
8787
}
8888

89+
assert order["properties"]["search_parameters"]["geometry"] == {
90+
"type": "Point",
91+
"coordinates": list(create_order_allowed_payloads[0].geometry.coordinates),
92+
}
93+
8994
assert (
90-
order["properties"]["datetime"]
95+
order["properties"]["search_parameters"]["datetime"]
9196
== create_order_allowed_payloads[0].model_dump()["datetime"]
9297
)

0 commit comments

Comments
 (0)