import datetime from pathlib import Path from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from gismeteo import datehelp from gismeteo.location import LOCATION_BUNDLE from gismeteo.mock import MOCK_DATA from weather.model import WeatherResponse from .filters import cloudness_icon, wind_direction_icon def mount(app: FastAPI): base_dir = Path(__file__).parent app.mount("/static", StaticFiles(directory=base_dir / "static"), name="static") templates = Jinja2Templates(directory=base_dir / "templates") templates.env.filters["wind_direction_icon"] = wind_direction_icon templates.env.filters["cloudness_icon"] = cloudness_icon def build_weather_response(request: Request, response: WeatherResponse): return templates.TemplateResponse( request=request, name="weather.html", context={ "datetime": datetime, "response": response, }, ) @app.get("/", response_class=RedirectResponse) async def get_weather_root(): return RedirectResponse("weather") @app.get("/weather", response_class=HTMLResponse) async def get_weather_list(request: Request): return templates.TemplateResponse( request=request, name="index.html", context={ "locations": LOCATION_BUNDLE._values, }, ) @app.get("/weather/{location}", response_class=RedirectResponse) async def get_weather_default(location: str): return RedirectResponse(f"{location}/{datetime.date.today()}") @app.get("/weather/{location}/mock", response_class=HTMLResponse) async def get_weather_mock(request: Request): response = MOCK_DATA.response return build_weather_response(request, response) # @app.get("/weather/{location}/{day}", response_class=HTMLResponse) async def get_weather_day(request: Request, location: str, day: datehelp.Day): date = datehelp.parse(day) response = await request.app.state.weather_api.get_day(location, date) return build_weather_response(request, response) @app.get("/weather/{location}/{date}", response_class=HTMLResponse) async def get_weather(request: Request, location: str, date: datetime.date): response = await request.app.state.weather_api.get_day(location, date) return build_weather_response(request, response)