"""Kalendarz: oś czasu z technik wraz z interpretacjami.""" from __future__ import annotations from fastapi import Depends, Form, Request from fastapi.responses import HTMLResponse import httpx from app.features import Feature from app.podstawa import (features, app, templates, logic, DEFAULT_LOCATION_LABEL, default_form, rozszerzenia, _build_utc, _dozwolona_akcja, _logic_error, ) # ---------------- Kalendarz (oś czasu z technik + interpretacje) ---------------- @app.get("/timeline", response_class=HTMLResponse) def timeline_form(request: Request): return templates.TemplateResponse( request, "timeline.html", {"result": None, "form": default_form(), "location_label": DEFAULT_LOCATION_LABEL, **rozszerzenia.kontekst_szablonu(request)}, ) @app.post("/timeline", response_class=HTMLResponse) def timeline_run( request: Request, person: str = Form(""), # imie i nazwisko — do naglowka raportu (PRE-21/24) date: str = Form(...), time: str = Form(...), tz_offset: float = Form(0.0), lat: float = Form(0.0), lon: float = Form(0.0), from_date: str = Form(...), to_date: str = Form(...), action: str = Form("timeline"), # Pola wnoszone przez moduły opcjonalne. FastAPI czyta pola z sygnatury, a ta # nie może ich wymieniać — w obrazie bez modułu byłyby nazwą nieistniejącej # funkcji wpisaną w kod. Zależność przenosi deklarację do modułu. dodatki: dict = Depends(rozszerzenia.pola_formularza()), ): form = {"person": person, "date": date, "time": time, "tz_offset": tz_offset, "lat": lat, "lon": lon, "from_date": from_date, "to_date": to_date, **dodatki} action = _dozwolona_akcja(request, action, "timeline") ctx: dict = {"form": form, "result": None, "error": None, "moment": None, **rozszerzenia.kontekst_szablonu(request)} try: iso_utc, label = _build_utc(date, time, tz_offset) ctx["moment"] = label wynik = rozszerzenia.obsluz(action, profil="period", iso_utc=iso_utc, lat=lat, lon=lon, dodatki=dodatki, od=from_date, do=to_date) if wynik is not None: ctx["wynik_dodatku"] = wynik else: ctx["result"] = logic.timeline( when_utc_iso=iso_utc, lat=lat, lon=lon, from_date=from_date, to_date=to_date, interpret=True, ) except httpx.HTTPError as e: ctx["error"] = _logic_error(e) except ValueError as e: ctx["error"] = f"Niepoprawne dane wejściowe: {e}" return templates.TemplateResponse(request, "timeline.html", ctx) features.zarejestruj( ekran=Feature("timeline", "Kalendarz", "Predykcje na wybrany zakres dat.", "Ekrany", "/timeline", kolejnosc=30), trasy={("GET", "/timeline"): "timeline", ("POST", "/timeline"): "timeline"}, zasoby={"s-timeline.css": "timeline"}, )