feat(app/view): improve cloudnes icons filter

This commit is contained in:
2024-07-26 11:37:10 +03:00
parent 848b6bd9ba
commit f711b2d77b
5 changed files with 58 additions and 24 deletions

View File

@@ -10,9 +10,14 @@ RUN poetry install --with app
FROM python:3.12-slim
ENV PATH="/app/.venv/bin:$PATH"
WORKDIR /app
RUN apt update && apt install -y locales
RUN locale-gen ru_RU.UTF-8 && dpkg-reconfigure locales
RUN apt update && \
apt install -y locales && \
sed -i -e 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/' /etc/locale.gen && \
dpkg-reconfigure --frontend=noninteractive locales
ENV LANG=ru_RU.UTF-8
ENV LC_ALL=ru_RU.UTF-8
COPY --from=builder /app ./
COPY gismeteo gismeteo/
COPY weather weather/
CMD ["uvicorn", "gismeteo.app:app", "--host", "0.0.0.0", "--port", "80"]
CMD ["uvicorn", "weather.app:app", "--host", "0.0.0.0", "--port", "80"]

View File

@@ -23,12 +23,21 @@ def mount(app: FastAPI):
async def get_weather_default(location: str):
return RedirectResponse(f"{location}/{datetime.date.today()}")
@app.get("/weather/{location}/{date}", response_class=HTMLResponse)
async def get_weather(request: Request, location: str, date: datetime.date):
if date == "mock":
response = MOCK_DATA.response
else:
response = await get_api().get_day(location, date)
@app.get("/weather/{location}/mock", response_class=HTMLResponse)
async def get_weather_mock(request: Request):
response = MOCK_DATA.response
return templates.TemplateResponse(
request=request,
name="weather.html",
context={
"datetime": datetime,
"response": response,
},
)
@app.get("/weather/{location}/{date}", response_class=HTMLResponse)
async def get_weather(request: Request, location: str, date: datetime.date):
response = await get_api().get_day(location, date)
return templates.TemplateResponse(
request=request,
name="weather.html",

View File

@@ -12,17 +12,27 @@ def wind_direction_icon(wind_direction: str) -> str:
}.get(wind_direction, wind_direction)
def cloudness_icon(cloudness: str) -> str:
return {
"Ясно": "☀️",
"Малооблачно, без осадков": "🌤️",
"Облачно, без осадков": "",
"Малооблачно, небольшой дождь": "🌦️",
"Пасмурно, без осадков": "☁️",
"Облачно, небольшой дождь": "🌧️",
"Облачно, дождь": "🌧",
"Облачно, небольшой дождь, гроза": "",
"Малооблачно, дождь": "🌦️",
"Пасмурно, небольшой дождь": "🌧",
"Облачно, дождь, гроза": "",
}.get(cloudness, cloudness)
def cloudness_icon(cloudness: str) -> list[str]:
icons = []
values = {item.strip().lower() for item in cloudness.split(",")}
if "дымка" in values:
icons.append("🌫️")
values.remove("дымка")
icons = [
{
frozenset(["ясно"]): "",
frozenset(["малооблачно", "без осадков"]): "🌤",
frozenset(["облачно", "без осадков"]): "",
frozenset(["малооблачно", "небольшой дождь"]): "🌦",
frozenset(["пасмурно", "без осадков"]): "",
frozenset(["облачно", "небольшой дождь"]): "🌧️",
frozenset(["облачно", "дождь"]): "🌧️",
frozenset(["облачно", "небольшой дождь", "гроза"]): "⛈️",
frozenset(["малооблачно", "дождь"]): "🌦️",
frozenset(["пасмурно", "небольшой дождь"]): "🌧️",
frozenset(["облачно", "дождь", "гроза"]): "⛈️",
frozenset(["пасмурно", "дождь"]): "🌧️",
frozenset(["пасмурно", "дождь", "гроза"]): "⛈️",
}.get(frozenset(values), "|".join(values))
] + icons
return icons

View File

@@ -49,7 +49,15 @@ td {
background: rgba(0, 128, 255, 0.2);
}
.cloudness {
vertical-align: top;
}
.cloudness .icon {
font-size: 1rem;
}
.cloudness .icon:first-child {
font-size: 2rem;
}

View File

@@ -44,7 +44,9 @@
<tr>
{% for value in response.values %}
<td class="cloudness">
<span class="icon">{{value.cloudness | cloudness_icon}}</span>
{% for icon in value.cloudness | cloudness_icon %}
<div class="icon">{{icon}}</div>
{% endfor %}
</td>
{% endfor %}
</tr>