Limit map date filter to weeks (mondays)
This commit is contained in:
parent
dcfcd21c96
commit
8878a71c14
|
@ -1,8 +1,9 @@
|
||||||
from gzip import decompress
|
from gzip import decompress
|
||||||
from sqlite3 import connect
|
from sqlite3 import connect
|
||||||
|
from datetime import datetime, time, timedelta
|
||||||
|
|
||||||
import dateutil.parser
|
import dateutil.parser
|
||||||
from sanic.exceptions import Forbidden
|
from sanic.exceptions import Forbidden, InvalidUsage
|
||||||
from sanic.response import raw
|
from sanic.response import raw
|
||||||
|
|
||||||
from sqlalchemy import select, text
|
from sqlalchemy import select, text
|
||||||
|
@ -31,6 +32,24 @@ def get_tile(filename, zoom, x, y):
|
||||||
return content and content[0] or None
|
return content and content[0] or None
|
||||||
|
|
||||||
|
|
||||||
|
def round_date(date, to="weeks", up=False):
|
||||||
|
if to != "weeks":
|
||||||
|
raise ValueError(f"cannot round to {to}")
|
||||||
|
|
||||||
|
midnight = time(0, 0, 0, 0)
|
||||||
|
start_of_day = date.date() # ignore time
|
||||||
|
weekday = date.weekday()
|
||||||
|
|
||||||
|
is_rounded = date.time() == midnight and weekday == 0
|
||||||
|
if is_rounded:
|
||||||
|
return date
|
||||||
|
|
||||||
|
if up:
|
||||||
|
return datetime.combine(start_of_day + timedelta(days=7 - weekday), midnight)
|
||||||
|
else:
|
||||||
|
return datetime.combine(start_of_day - timedelta(days=weekday), midnight)
|
||||||
|
|
||||||
|
|
||||||
# regenerate approx. once each day
|
# regenerate approx. once each day
|
||||||
TILE_CACHE_MAX_AGE = 3600 * 24
|
TILE_CACHE_MAX_AGE = 3600 * 24
|
||||||
|
|
||||||
|
@ -52,6 +71,18 @@ async def tiles(req, zoom: int, x: int, y: str):
|
||||||
start = req.ctx.get_single_arg("start", default=None, convert=parse_date)
|
start = req.ctx.get_single_arg("start", default=None, convert=parse_date)
|
||||||
end = req.ctx.get_single_arg("end", default=None, convert=parse_date)
|
end = req.ctx.get_single_arg("end", default=None, convert=parse_date)
|
||||||
|
|
||||||
|
start = round_date(start, to="weeks", up=False) if start else None
|
||||||
|
end = round_date(end, to="weeks", up=True) if end else None
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logging.info("start end %s %s", start, end)
|
||||||
|
|
||||||
|
if start is not None and end is not None and start >= end:
|
||||||
|
raise InvalidUsage(
|
||||||
|
"end date must be later than start date (note: dates are rounded to weeks)"
|
||||||
|
)
|
||||||
|
|
||||||
tile = await req.ctx.db.scalar(
|
tile = await req.ctx.db.scalar(
|
||||||
text(
|
text(
|
||||||
f"select data from getmvt(:zoom, :x, :y, :user_id, :min_time, :max_time) as b(data, key);"
|
f"select data from getmvt(:zoom, :x, :y, :user_id, :min_time, :max_time) as b(data, key);"
|
||||||
|
|
|
@ -264,6 +264,8 @@ function LayerSidebar({
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Input
|
<Input
|
||||||
type="date"
|
type="date"
|
||||||
|
min="2000-01-03"
|
||||||
|
step="7"
|
||||||
size="small"
|
size="small"
|
||||||
id="filters.startDate"
|
id="filters.startDate"
|
||||||
onChange={(_e, { value }) =>
|
onChange={(_e, { value }) =>
|
||||||
|
@ -279,6 +281,8 @@ function LayerSidebar({
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Input
|
<Input
|
||||||
type="date"
|
type="date"
|
||||||
|
min="2000-01-03"
|
||||||
|
step="7"
|
||||||
size="small"
|
size="small"
|
||||||
id="filters.endDate"
|
id="filters.endDate"
|
||||||
onChange={(_e, { value }) =>
|
onChange={(_e, { value }) =>
|
||||||
|
@ -294,6 +298,8 @@ function LayerSidebar({
|
||||||
<List.Item>
|
<List.Item>
|
||||||
<Input
|
<Input
|
||||||
type="date"
|
type="date"
|
||||||
|
min="2000-01-03"
|
||||||
|
step="7"
|
||||||
size="small"
|
size="small"
|
||||||
id="filters.startDate"
|
id="filters.startDate"
|
||||||
value={startDate ?? null}
|
value={startDate ?? null}
|
||||||
|
|
Loading…
Reference in a new issue