From f711b2d77b0296ffc3c0378f369926c4281d1eb4 Mon Sep 17 00:00:00 2001 From: shmyga Date: Fri, 26 Jul 2024 11:37:10 +0300 Subject: [PATCH] feat(app/view): improve cloudnes icons filter --- Dockerfile | 11 +++++-- weather/route/view/__init__.py | 21 +++++++++---- weather/route/view/filters.py | 38 ++++++++++++++--------- weather/route/view/static/style.css | 8 +++++ weather/route/view/templates/weather.html | 4 ++- 5 files changed, 58 insertions(+), 24 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3811d1c..aa74792 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"] diff --git a/weather/route/view/__init__.py b/weather/route/view/__init__.py index 400bfe3..9205f08 100644 --- a/weather/route/view/__init__.py +++ b/weather/route/view/__init__.py @@ -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", diff --git a/weather/route/view/filters.py b/weather/route/view/filters.py index f36be69..cc01ae5 100644 --- a/weather/route/view/filters.py +++ b/weather/route/view/filters.py @@ -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 diff --git a/weather/route/view/static/style.css b/weather/route/view/static/style.css index d90bd10..3b209c1 100644 --- a/weather/route/view/static/style.css +++ b/weather/route/view/static/style.css @@ -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; } diff --git a/weather/route/view/templates/weather.html b/weather/route/view/templates/weather.html index d4b15e1..558e215 100644 --- a/weather/route/view/templates/weather.html +++ b/weather/route/view/templates/weather.html @@ -44,7 +44,9 @@ {% for value in response.values %} - {{value.cloudness | cloudness_icon}} + {% for icon in value.cloudness | cloudness_icon %} +
{{icon}}
+ {% endfor %} {% endfor %}