Add lean mode (overpass source and no map view in frontend)

This commit is contained in:
Paul Bienkowski 2022-02-18 13:42:32 +01:00
parent d10b91804c
commit 3ef6dcf5d9
5 changed files with 45 additions and 21 deletions

View file

@ -4,6 +4,7 @@ DEBUG = True
VERBOSE = False
AUTO_RESTART = True
SECRET = "!!!!!!!!!!!!CHANGE ME!!!!!!!!!!!!"
LEAN_MODE = True
POSTGRES_URL = "postgresql+asyncpg://obs:obs@postgres/obs"
POSTGRES_POOL_SIZE = 20
POSTGRES_MAX_OVERFLOW = 2 * POSTGRES_POOL_SIZE

View file

@ -7,6 +7,11 @@ DEBUG = False
VERBOSE = DEBUG
AUTO_RESTART = DEBUG
# Turn on lean mode to simplify the setup. Lots of features will be
# unavailable, but you will not need to manage OpenStreetMap data. Please make
# sure to configure the OBS_FACE_CACHE_DIR correctly for lean mode.
LEAN_MODE = False
# Required to encrypt or sign sessions, cookies, tokens, etc.
SECRET = "!!!<<<CHANGEME>>>!!!"

View file

@ -25,7 +25,7 @@ from obs.face.filter import (
RequiredFieldsFilter,
)
from obs.face.osm import DataSource, DatabaseTileSource
from obs.face.osm import DataSource, DatabaseTileSource, OverpassTileSource
from obs.api.db import OvertakingEvent, Track, make_session
from obs.api.app import app
@ -33,6 +33,20 @@ from obs.api.app import app
log = logging.getLogger(__name__)
def get_data_source():
"""
Creates a data source based on the configuration of the portal. In *lean*
mode, the OverpassTileSource is used to fetch data on demand. In normal
mode, the roads database is used.
"""
if app.config.LEAN_MODE:
tile_source = OverpassTileSource(cache_dir=app.config.OBS_FACE_CACHE_DIR)
else:
tile_source = DatabaseTileSource()
return DataSource(tile_source)
async def process_tracks_loop(delay):
while True:
try:
@ -50,9 +64,7 @@ async def process_tracks_loop(delay):
await asyncio.sleep(delay)
continue
tile_source = DatabaseTileSource()
data_source = DataSource(tile_source)
data_source = get_data_source()
await process_track(session, track, data_source)
except BaseException:
log.exception("Failed to process track. Will continue.")
@ -66,8 +78,7 @@ async def process_tracks(tracks):
:param tracks: A list of strings which
"""
tile_source = DatabaseTileSource()
data_source = DataSource(tile_source)
data_source = get_data_source()
async with make_session() as session:
for track_id_or_slug in tracks:

View file

@ -6,6 +6,7 @@ from sanic.exceptions import NotFound
from obs.api.app import app
if app.config.FRONTEND_CONFIG:
@app.get("/config.json")
def get_frontend_config(req):
result = {
@ -13,18 +14,22 @@ if app.config.FRONTEND_CONFIG:
**req.app.config.FRONTEND_CONFIG,
"apiUrl": f"{req.ctx.api_url}/api",
"loginUrl": f"{req.ctx.api_url}/login",
"obsMapSource": {
"type": "vector",
"tiles": [
req.ctx.api_url
+ req.app.url_for("tiles", zoom="000", x="111", y="222.pbf")
.replace("000", "{z}")
.replace("111", "{x}")
.replace("222", "{y}")
],
"minzoom": 12,
"maxzoom": 14,
},
"obsMapSource": (
None
if app.config.LEAN_MODE
else {
"type": "vector",
"tiles": [
req.ctx.api_url
+ req.app.url_for("tiles", zoom="000", x="111", y="222.pbf")
.replace("000", "{z}")
.replace("111", "{x}")
.replace("222", "{y}")
],
"minzoom": 12,
"maxzoom": 14,
}
),
}
return response.json(result)

View file

@ -59,6 +59,8 @@ const App = connect((state) => ({login: state.login}))(function App({login}) {
const config = useConfig()
const apiVersion = useObservable(() => from(api.get('/info')).pipe(pluck('version')))
const hasMap = Boolean(config?.obsMapSource)
React.useEffect(() => {
api.loadUser()
}, [])
@ -72,7 +74,7 @@ const App = connect((state) => ({login: state.login}))(function App({login}) {
OpenBikeSensor
</Link>
{config?.obsMapSource && (
{hasMap && (
<Link component={MenuItemForLink} to="/map" as="a">
Map
</Link>
@ -110,9 +112,9 @@ const App = connect((state) => ({login: state.login}))(function App({login}) {
<Route path="/" exact>
<HomePage />
</Route>
<Route path="/map" exact>
{hasMap && <Route path="/map" exact>
<MapPage />
</Route>
</Route>}
<Route path="/tracks" exact>
<TracksPage />
</Route>