Source code for h2o_dashboard.dashboard


import asyncio
import os

import dotenv
from h2o_wave import main, Q, app, ui, on, data, run_on  # noqa F401

from h2o_dashboard.wave_auth import initialize_client, serve_security
from redis_tools.utils import stop_async_redis, get_async_redis

dotenv.load_dotenv(dotenv.find_dotenv())


[docs] @on('global_notification_bar.dismissed') async def on_global_notification_bar_dismissed(q: Q): # Delete the notification bar q.page['meta'].notification_bar = None await q.page.save()
[docs] async def on_startup(): print("Startup event triggered") await get_async_redis()
[docs] async def on_shutdown(): print("Shutdown event triggered") await stop_async_redis()
[docs] @on('@system.client_disconnect') async def on_client_disconnect(q: Q): print('Client disconnected') # Rest token q.client.initialized = False q.client.async_redis = None q.client.token = None q.client.user = None q.client.user_id = None q.client.email = None q.client.password = None q.client.expires_in = None # Pages Tasks and Events # Todo automate the handling of these to reduce developer error q.client.overview_page_running_event.clear() q.client.okx_dashboard_page_running_event.clear() q.client.documentation_page_running_event.clear() q.client.overview_page_task.cancel() q.client.okx_dashboard_page_task.cancel() q.client.documentation_page_task.cancel() # Redis Listener Tasks and Events q.client.okx_redis_listener_task.cancel() q.client.okx_redis_listener_running_event.clear() await asyncio.sleep(1) print('Client disconnected')
[docs] @app('/', on_startup=on_startup, on_shutdown=on_shutdown) async def serve(q: Q): """Main application handler.""" print("Serving") if not q.client.initialized: print("Initializing") await initialize_client(q) # First check if # are already initialized that way we either clear them or not initialize them again if not isinstance(getattr(q.client, 'overview_page_running_event'), asyncio.Event): q.client.overview_page_running_event = asyncio.Event() if not isinstance(getattr(q.client, 'okx_dashboard_page_running_event'), asyncio.Event): q.client.okx_dashboard_page_running_event = asyncio.Event() if not isinstance(getattr(q.client, 'documentation_page_running_event'), asyncio.Event): q.client.documentation_page_running_event = asyncio.Event() q.client.overview_page_running_event.clear() q.client.okx_dashboard_page_running_event.clear() q.client.documentation_page_running_event.clear() if not q.app.initialized: # TODO this could be instantiated each client? and shut down after each use? await get_async_redis() q.app.initialized = True q.client.async_redis = await get_async_redis() # When already initializd it returns the connection if not (os.getenv('BYPASS_SECURITY') == 'True' and os.getenv('DEVELOPMENT_GOD_MODE') == 'True'): bypass_security = False else: bypass_security = True await serve_security(q, bypass_security=bypass_security), await q.page.save() await run_on(q) print("Served")