"""Horoskop: pozycje, osie, domy, aspekty i kosmogram (strona główna).""" from __future__ import annotations from fastapi import Form, Request from fastapi.responses import HTMLResponse, RedirectResponse import httpx from app.features import Feature from app.podstawa import (features, app, templates, logic, chartwheel_mod, DEFAULT_LOCATION_LABEL, default_form, rozszerzenia, _perms, _limit_options, _landing, _build_utc, _logic_error, ) # ---------------- Horoskop: pozycje (strona główna) ---------------- @app.get("/", response_class=HTMLResponse) def chart_form(request: Request): # Korzeń jest dostępny dla każdego zalogowanego, ale ekran „Horoskop" już nie. # Bez tego konto bez uprawnienia do horoskopu dostawałoby 404 pod adresem # głównym — czyli wyglądałoby to na zepsuty program, a nie na węższy zestaw. if "chart" not in _perms(request): target = _landing(request) if target: return RedirectResponse(target, status_code=303) # Ta sama odpowiedź co bramka dla trasy bez uprawnienia. Poprzednia treść # mówiła o „przypisanych funkcjach" i o „osobie, która zakładała konto", # czyli wprost: funkcje są komuś przydzielane, jest ktoś, kto to robi, # a twoje konto zostało okrojone. return HTMLResponse("

404 — nie znaleziono

", status_code=404) return templates.TemplateResponse( request, "chart.html", {"result": None, "form": default_form(), "location_label": DEFAULT_LOCATION_LABEL, **rozszerzenia.kontekst_szablonu(request)}, ) @app.post("/", response_class=HTMLResponse) def chart_compute( 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), house_system: str = Form("whole_sign"), house_systems: list[str] = Form([]), # PRE-05: dodatkowe systemy do porównania aspect_orb: float = Form(8.0), # PRE-06: konfigurowalny orb aspektów aspect_luminary_bonus: float = Form(2.0), aspect_minor: bool = Form(False), stations: bool = Form(False), zodiac: str = Form("tropical"), tables: bool = Form(False), wheel_orientation: str = Form(chartwheel_mod.ASC_LEFT), ): 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 # kosmogram (PRE-12), SVG po stronie serwera ctx["wheel_svg"] = chartwheel.render(ctx["result"], orientation=form["wheel_orientation"]) # Rysunki dodatkowe NIE POWSTAJĄ bez uprawnienia — nie chodzi o ukrycie # ich w szablonie, tylko o to, żeby nie było ich nawet w źródle strony. 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, "chart.html", ctx) # ── zgłoszenie do katalogu ───────────────────────────────────────────────── # Ekran zgłasza siebie, swoje trasy i swoje zasoby. Wszystko o tym ekranie jest # w tym pliku — więc obraz bez tego pliku nie wie o nim NIC. features.zarejestruj( ekran=Feature("chart", "Horoskop", "Pozycje, osie, domy, aspekty, kosmogram.", "Ekrany", "/", kolejnosc=10), trasy={("GET", "/"): None, # korzeń przekierowuje na pierwszy dostępny ekran ("POST", "/"): "chart"}, zasoby={"s-chart.css": "chart"}, ) features.zarejestruj(rozszerzenie=Feature( "houses_compare", "Porównanie systemów domów", "Wybór systemu innego niż domyślny i zestawienie kilku obok siebie.", "Rozszerzenia", kolejnosc=10)) features.zarejestruj(rozszerzenie=Feature( "extra_charts", "Wykresy dodatkowe", "Aspektarian, wykres deklinacji, oś antyscji.", "Rozszerzenia", kolejnosc=20)) features.zarejestruj(rozszerzenie=Feature( "advanced_calc", "Obliczenia zaawansowane", "Stacje planet, tabele żywiołów i faz, aspekty poboczne, zodiaki syderyczne.", "Rozszerzenia", kolejnosc=30))