"""Synastria: porównanie dwóch horoskopów.""" from __future__ import annotations from fastapi import Form, Request from fastapi.responses import HTMLResponse import httpx from app.features import Feature from app.podstawa import (features, app, templates, logic, _build_utc, _logic_error) # ---------------- Synastria (technika relacyjna) ---------------- @app.get("/synastry", response_class=HTMLResponse) def synastry_form(request: Request): # domyślne liczby, żeby pola number nie były puste (puste → błąd przy wysyłce) form = {"a_tz_offset": 0, "a_lat": 0, "a_lon": 0, "b_tz_offset": 0, "b_lat": 0, "b_lon": 0, "aspect_orb": 8, "aspect_luminary_bonus": 2} return templates.TemplateResponse(request, "synastry.html", {"result": None, "form": form}) @app.post("/synastry", response_class=HTMLResponse) def synastry_run( request: Request, a_person: str = Form(""), a_date: str = Form(...), a_time: str = Form(...), a_tz_offset: float = Form(0.0), a_lat: float = Form(0.0), a_lon: float = Form(0.0), b_person: str = Form(""), b_date: str = Form(...), b_time: str = Form(...), b_tz_offset: float = Form(0.0), b_lat: float = Form(0.0), b_lon: float = Form(0.0), zodiac: str = Form("tropical"), aspect_orb: float = Form(8.0), aspect_luminary_bonus: float = Form(2.0), aspect_minor: bool = Form(False), ): """Synastria (PRE-04): dwie osoby → aspekty między ich horoskopami.""" form = {"a_person": a_person, "a_date": a_date, "a_time": a_time, "a_tz_offset": a_tz_offset, "a_lat": a_lat, "a_lon": a_lon, "b_person": b_person, "b_date": b_date, "b_time": b_time, "b_tz_offset": b_tz_offset, "b_lat": b_lat, "b_lon": b_lon, "zodiac": zodiac, "aspect_orb": aspect_orb, "aspect_luminary_bonus": aspect_luminary_bonus, "aspect_minor": aspect_minor} ctx: dict = {"form": form, "result": None, "error": None} try: iso_a, _ = _build_utc(a_date, a_time, a_tz_offset) iso_b, _ = _build_utc(b_date, b_time, b_tz_offset) ctx["result"] = logic.synastry( {"when_utc": iso_a, "lat": a_lat, "lon": a_lon}, {"when_utc": iso_b, "lat": b_lat, "lon": b_lon}, zodiac=zodiac, aspect_orb=aspect_orb, aspect_luminary_bonus=aspect_luminary_bonus, aspect_minor=aspect_minor, ) 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, "synastry.html", ctx) features.zarejestruj( ekran=Feature("synastry", "Synastria", "Porównanie dwóch horoskopów.", "Ekrany", "/synastry", kolejnosc=40), trasy={("GET", "/synastry"): "synastry", ("POST", "/synastry"): "synastry"}, zasoby={"s-synastry.css": "synastry"}, )