88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
import datetime
|
|
from pathlib import Path
|
|
|
|
from fastapi import APIRouter, FastAPI
|
|
from fastapi.responses import HTMLResponse, RedirectResponse
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from gallery.easel.core import AppRequest
|
|
from gallery.sketch.weather.model import WeatherResponse
|
|
from gallery.version import __version__
|
|
|
|
from ..common.util import TagType, TagUtil
|
|
from ..translation import _
|
|
from .filters import cloudness_icon, wind_direction_icon
|
|
|
|
|
|
base_dir = Path(__file__).parent
|
|
templates = Jinja2Templates(
|
|
directory=[
|
|
base_dir.parent / "common/templates",
|
|
base_dir / "templates",
|
|
]
|
|
)
|
|
templates.env.globals.update({"_": _})
|
|
templates.env.filters["wind_direction_icon"] = wind_direction_icon
|
|
templates.env.filters["cloudness_icon"] = cloudness_icon
|
|
|
|
|
|
def build_weather_response(request: AppRequest, response: WeatherResponse):
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="weather.html",
|
|
context={
|
|
"version": __version__,
|
|
"tag_util": TagUtil,
|
|
"datetime": datetime,
|
|
"response": response,
|
|
},
|
|
)
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("/weather", response_class=HTMLResponse)
|
|
async def get_weather_index(request: AppRequest, query: str | None = None):
|
|
weather_api = request.app.state.api.weather
|
|
locations = (await weather_api.find_locations(query)) if query else []
|
|
return templates.TemplateResponse(
|
|
request=request,
|
|
name="index.html",
|
|
context={
|
|
"version": __version__,
|
|
"locations": locations,
|
|
},
|
|
)
|
|
|
|
|
|
@router.get("/weather/{location}", response_class=RedirectResponse)
|
|
async def get_weather_default(location: str):
|
|
return RedirectResponse(f"{location}/tag/today")
|
|
|
|
|
|
@router.get("/weather/{location}/day/{date}", response_class=HTMLResponse)
|
|
async def get_weather_day(request: AppRequest, location: str, date: datetime.date):
|
|
weather_api = request.app.state.api.weather
|
|
response = await weather_api.get_day(location, date)
|
|
return build_weather_response(request, response)
|
|
|
|
|
|
@router.get("/weather/{location}/days/{days}", response_class=HTMLResponse)
|
|
async def get_weather_days(request: AppRequest, location: str, days: int):
|
|
weather_api = request.app.state.api.weather
|
|
response = await weather_api.get_days(location, days)
|
|
return build_weather_response(request, response)
|
|
|
|
|
|
@router.get("/weather/{location}/tag/{tag}", response_class=HTMLResponse)
|
|
async def get_weather_tag(request: AppRequest, location: str, tag: str):
|
|
tag_value = TagUtil.parse_tag(tag)
|
|
weather_api = request.app.state.api.weather
|
|
if tag_value.type == TagType.DAY:
|
|
response = await weather_api.get_day(location, tag_value.date)
|
|
elif tag_value.type == TagType.DAYS:
|
|
response = await weather_api.get_days(location, tag_value.days)
|
|
else:
|
|
raise ValueError(tag)
|
|
return build_weather_response(request, response)
|