feat(weather): add weather location search

This commit is contained in:
2026-04-22 12:58:56 +03:00
parent 3dd0a5410c
commit 94870a5c86
32 changed files with 550 additions and 152 deletions

View File

@@ -7,8 +7,6 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from gallery.easel.core import AppRequest
from gallery.sketch.weather.catalog import BUNDLE
from gallery.sketch.weather.mock import WEATHER_MOCK_DATA
from gallery.sketch.weather.model import WeatherResponse
from gallery.version import __version__
@@ -41,16 +39,15 @@ def mount(app: FastAPI):
)
@app.get("/weather", response_class=HTMLResponse)
async def get_weather_list(request: AppRequest):
async def get_weather_index(request: AppRequest, query: str | None = None):
weather_api = request.app.state.api.weather
locations = await weather_api.get_locations()
locations_data = BUNDLE.select_items(locations)
locations = (await weather_api.find_locations(query)) if query else []
return templates.TemplateResponse(
request=request,
name="index.html",
context={
"version": __version__,
"locations": locations_data,
"locations": locations,
},
)
@@ -58,16 +55,6 @@ def mount(app: FastAPI):
async def get_weather_default(location: str):
return RedirectResponse(f"{location}/tag/today")
@app.get("/weather/{location}/day/mock", response_class=HTMLResponse)
async def get_weather_day_mock(request: AppRequest):
response = WEATHER_MOCK_DATA.get_response("day")
return build_weather_response(request, response)
@app.get("/weather/{location}/days/mock", response_class=HTMLResponse)
async def get_weather_days_mock(request: AppRequest):
response = WEATHER_MOCK_DATA.get_response("days")
return build_weather_response(request, response)
@app.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

View File

@@ -12,9 +12,24 @@
{% block header %}Погода{% endblock %}
{% block content %}
<form action=""
method="get"
style="margin: 0 auto 1rem;">
<input id="query"
name="query">
<button type="submit">Search</button>
</form>
<ul class="app-list">
{% for location in locations %}
<li><a href="weather/{{location.id}}">{{location.name}}</a></li>
<li>
<a href="weather/{{location.id}}">
<span>{{location.name}}</span>
<span style="font-size: 70%; margin-left: 0.5rem;">
{{location.country}}, {{location.district}}, {{location.subdistrict}}
</span>
<span></span>
</a>
</li>
{% endfor %}
</ul>
{% endblock %}