from __future__ import annotations from os import environ from gibil.classes.env_loader import EnvLoader from gibil.classes.weather.sample_data import WeatherSampleData from gibil.classes.weather.store import WeatherStore, WeatherStoreConfigurationError from gibil.classes.weather.display import WeatherDisplay from gibil.classes.oracle.display import OracleDisplay from gibil.classes.oracle.quality_display import OracleQualityDisplay class WebUI: """Composes Astrape web modules into a small control panel.""" def __init__(self) -> None: self.weather_display = WeatherDisplay() self.oracle_display = OracleDisplay() self.oracle_quality_display = OracleQualityDisplay() def render_page(self, page: str = "oracle") -> str: current_page = page if page in {"oracle", "weather", "quality"} else "oracle" return f""" Astrape

Astrape

Gibil control panel

{self._nav(current_page)}
{self._page_body(current_page)}
""" def _nav(self, current_page: str) -> str: pages = [ ("oracle", "/oracle", "Oracle"), ("weather", "/weather", "Weather"), ("quality", "/quality", "Quality"), ] links = [ f'{label}' for key, href, label in pages ] return f"" def _page_body(self, page: str) -> str: if page == "weather": return self.weather_display.render() if page == "quality": return self.oracle_quality_display.render() return self.oracle_display.render() def weather_payload(self) -> str: EnvLoader().load() if environ.get("ASTRAPE_WEB_SAMPLE_DATA") == "1": return self.weather_display.data_payload(WeatherSampleData().build()) try: dataset = WeatherStore.from_env().load_display_dataset() except WeatherStoreConfigurationError: dataset = None return self.weather_display.data_payload(dataset) def oracle_payload(self) -> str: EnvLoader().load() return self.oracle_display.data_payload() def oracle_quality_payload(self, lookback_hours: float = 168) -> str: EnvLoader().load() return self.oracle_quality_display.data_payload(lookback_hours=lookback_hours)