"""Skompiluj: zbiorczy raport z policzonych części (PRE-23), wraz z PDF-em.""" from __future__ import annotations from fastapi import Form, Request from fastapi.responses import HTMLResponse, JSONResponse, Response import httpx from app.features import Feature from app.podstawa import (features, app, templates, logic, chartwheel_mod, DEFAULT_LOCATION_LABEL, default_form, _perms, _limit_options, _build_utc, _logic_error, ) # ---------------- Skompiluj: zbiorczy raport (PRE-23) ---------------- @app.get("/compile", response_class=HTMLResponse) def compile_form(request: Request): return templates.TemplateResponse( request, "compile.html", {"result": None, "form": default_form(), "location_label": DEFAULT_LOCATION_LABEL}, ) @app.post("/compile", response_class=HTMLResponse) def compile_build( request: Request, person: str = Form(""), date: str = Form(...), time: str = Form(...), tz_offset: float = Form(0.0), lat: float = Form(0.0), lon: float = Form(0.0), house_system: str = Form("whole_sign"), house_systems: list[str] = Form([]), # PRE-05 — porównanie domów w podsumowaniu aspect_orb: float = Form(8.0), # PRE-06 — te same ustawienia aspektów aspect_luminary_bonus: float = Form(2.0), aspect_minor: bool = Form(False), stations: bool = Form(False), # LOG-03 — stacje też w podsumowaniu zodiac: str = Form("tropical"), tables: bool = Form(False), # LOG-23 — żywioły/faza/godziny w podsumowaniu wheel_orientation: str = Form(chartwheel_mod.ASC_LEFT), # LOG-05 — obrót koła ): """Składa raport: horoskop liczymy TU NA NOWO, a części z przeglądarki (interpretacja natalna i predykcje okresowe) dokłada przeglądarka z magazynu (PRE-22/23). Horoskop liczymy ponownie (czysta funkcja wejścia — tanio powtórzyć, bez trzymania dużego wyniku w przeglądarce), ale z TYMI SAMYMI opcjami, które wybrano przy horoskopie (stacje, tabele, porównanie domów) — inaczej podsumowanie miałoby braki względem tego, co policzono. Opcje wędrują między zakładkami przez formsync. """ form = {"person": person, "date": date, "time": time, "tz_offset": tz_offset, "lat": lat, "lon": lon, "house_system": house_system, "house_systems": house_systems, "aspect_orb": aspect_orb, "aspect_luminary_bonus": aspect_luminary_bonus, "aspect_minor": aspect_minor, "stations": stations, "zodiac": zodiac, "tables": tables, "wheel_orientation": wheel_orientation} form = _limit_options(request, form) ctx: dict = {"form": form, "result": None, "error": None, "moment": None} try: iso_utc, label = _build_utc(date, time, tz_offset) ctx["moment"] = label ctx["result"] = logic.positions( when_utc_iso=iso_utc, lat=lat, lon=lon, house_system=form["house_system"], house_systems=form["house_systems"], aspect_orb=aspect_orb, aspect_luminary_bonus=aspect_luminary_bonus, aspect_minor=form["aspect_minor"], stations=form["stations"], zodiac=form["zodiac"], tables=form["tables"], ) from app import chartwheel ctx["wheel_svg"] = chartwheel.render(ctx["result"], orientation=form["wheel_orientation"]) if "extra_charts" in _perms(request): ctx["aspectarian_svg"] = chartwheel.render_aspectarian(ctx["result"]) # PRE-18 ctx["declination_svg"] = chartwheel.render_declination(ctx["result"]) # LOG-07 ctx["antiscia_svg"] = chartwheel.render_antiscia(ctx["result"]) # LOG-07 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, "compile.html", ctx) features.zarejestruj( ekran=Feature("compile", "Skompiluj", "Złożenie raportu z policzonych części.", "Ekrany", "/compile", kolejnosc=60), trasy={("GET", "/compile"): "compile", ("POST", "/compile"): "compile"}, zasoby={"s-compile.css": "compile", "compile.js": "compile"}, )