Skip to content

Commit 00bf936

Browse files
author
Sean Sullivan
committed
WIP moving params to pydantic with default values
1 parent bf00330 commit 00bf936

File tree

3 files changed

+53
-6
lines changed

3 files changed

+53
-6
lines changed

elastic_datashader/main.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from asyncio import create_task
22

33
from fastapi import FastAPI
4-
4+
from fastapi.middleware.cors import CORSMiddleware
55
import urllib3
66

77
from .cache import background_cache_cleanup
@@ -30,6 +30,19 @@
3030
app.include_router(legend.router)
3131
app.include_router(tms.router)
3232

33+
34+
35+
36+
origins = ["*"]
37+
38+
app.add_middleware(
39+
CORSMiddleware,
40+
allow_origins=origins,
41+
allow_credentials=True,
42+
allow_methods=["*"],
43+
allow_headers=["*"],
44+
)
45+
3346
@app.on_event("startup")
3447
async def app_startup():
3548
create_task(background_cache_cleanup())

elastic_datashader/parameters.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@
1818
from .logger import logger
1919
from .timeutil import quantize_time_range, convert_kibana_time
2020

21+
from pydantic import BaseModel, Field
22+
23+
class SearchParams(BaseModel):
24+
geopoint_field: str
25+
params: dict
26+
cmap: str = Field(default="bym")
27+
resolution:str = Field(default="finest")
28+
span_range:str = Field(default="auto", alias='span')
29+
spread:str = Field(default="auto") # Point Size
30+
timeOverlap:bool = Field(default=False)
31+
timeOverlapSize:str = Field(default="auto")
32+
timestamp_field:str = Field(default="@timestamp")
33+
search_nautical_miles: int = Field(default=50)
34+
geofield_type: str = Field(default='geo_point')
35+
bucket_max: float = Field(default=100, ge=0, le=100)
36+
bucket_min: float = Field(default=0, ge=0, le=1)
2137

2238
def create_default_params() -> Dict[str, Any]:
2339
return {
@@ -287,7 +303,7 @@ def extract_parameters(headers: Dict[Any, Any], query_params: Dict[Any, Any]) ->
287303
params["highlight"] = query_params.get("highlight")
288304
params["spread"] = normalize_spread(query_params.get("spread"))
289305
params["resolution"] = query_params.get("resolution", params["resolution"])
290-
params["use_centroid"] = query_params.get("use_centroid", default=params["use_centroid"])
306+
params["use_centroid"] = query_params.get("use_centroid", params["use_centroid"])
291307
params["cmap"] = get_cmap(query_params.get("cmap", None), category_field)
292308
params["span_range"] = query_params.get("span", "auto")
293309
params["geopoint_field"] = query_params.get("geopoint_field", params["geopoint_field"])

elastic_datashader/routers/tms.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
from typing import Optional
44
import time
55
import uuid
6+
import json
67
from elasticsearch import Elasticsearch
78
from elasticsearch.exceptions import NotFoundError
89
from elasticsearch_dsl import Document
910
from fastapi import APIRouter, BackgroundTasks, HTTPException, Request, Response
10-
from fastapi.responses import RedirectResponse
11+
from fastapi.responses import RedirectResponse, JSONResponse
1112
from starlette.datastructures import URL
1213

1314
from ..cache import (
@@ -26,7 +27,7 @@
2627
from ..drawing import generate_x_tile
2728
from ..elastic import get_es_headers, get_search_base
2829
from ..logger import logger
29-
from ..parameters import extract_parameters, merge_generated_parameters
30+
from ..parameters import extract_parameters, merge_generated_parameters, SearchParams
3031
from ..tilegen import (
3132
TILE_HEIGHT_PX,
3233
TILE_WIDTH_PX,
@@ -281,7 +282,7 @@ def generate_tile_to_cache(idx: str, x: int, y: int, z: int, params, parameter_h
281282
logger.debug("Releasing cache placeholder %s", rendering_tile_name(idx, x, y, z, parameter_hash))
282283
release_cache_placeholder(config.cache_path, rendering_tile_name(idx, x, y, z, parameter_hash))
283284

284-
async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks):
285+
async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks,post_params={}):
285286
check_proxy_key(request.headers.get('tms-proxy-key'))
286287

287288
es = Elasticsearch(
@@ -292,7 +293,9 @@ async def fetch_or_render_tile(already_waited: int, idx: str, x: int, y: int, z:
292293

293294
# Get hash and parameters
294295
try:
295-
parameter_hash, params = extract_parameters(request.headers, request.query_params)
296+
print(request.query_params)
297+
print(post_params)
298+
parameter_hash, params = extract_parameters(request.headers, {**request.query_params,**post_params})
296299
# try to build the dsl object bad filters cause exceptions that are then retried.
297300
# underlying elasticsearch_dsl doesn't support the elasticsearch 8 api yet so this causes requests to thrash
298301
# If the filters are bad or elasticsearch_dsl cannot build the request will never be completed so serve X tile
@@ -344,3 +347,18 @@ async def get_tms(idx: str, x: int, y: int, z: int, request: Request, background
344347
@router.get("/{already_waited}/{idx}/{z}/{x}/{y}.png")
345348
async def get_tms_after_wait(already_waited: int, idx: str, x: int, y: int, z: int, request: Request, background_tasks: BackgroundTasks):
346349
return await fetch_or_render_tile(already_waited, idx, x, y, z, request, background_tasks)
350+
351+
352+
@router.post("/{idx}/{z}/{x}/{y}.png")
353+
async def post_tile(already_waited: int,idx: str, x: int, y: int, z: int, request: Request,params: SearchParams, background_tasks: BackgroundTasks):
354+
params = params.dict()
355+
params["params"] = json.dumps(params["params"])
356+
response = await fetch_or_render_tile(0, idx, x, y, z, request, background_tasks,post_params=params)
357+
if isinstance(response,RedirectResponse):
358+
print(response.headers)
359+
return JSONResponse(status_code=200, content={"retry-after":response.headers['retry-after']})
360+
return response
361+
362+
363+
364+

0 commit comments

Comments
 (0)