8ed8d9fb7a
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m4s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 9m56s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 32s
Testy / Kontrola składni wszystkich warstw (push) Successful in 20s
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m9s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 10m15s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 37s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 20s
Komplet wyliczen, ktore astrolog czyta „obok" pozycji: - bilans zywiolow i jakosci w czterech wariantach (7 klasycznych / 10 z nowozytnymi, z Ascendentem i bez) + wykrywanie BRAKUJACYCH zywiolow — klasyczne „no air", podstawa pod scoring sily (LOG-21), - faza Ksiezyca: elongacja, nazwa fazy, procent oswietlenia, przybywa/ubywa, - stopnie krytyczne wg jakosci znaku (kardynalne 0/13/26, stale 8/21, zmienne 4/17) + 29 stopien anaretyczny i 0 stopni wejscia w znak, - dzien i godziny planetarne w porzadku chaldejskim, - syzygia prenatalna (ostatni now albo pelnia przed urodzeniem), - podzialy: dwunastniki (D12) i nawamsa (D9). Dwie rzeczy wymagaly prawdziwego liczenia, nie tabelki: * godziny planetarne sa NIEROWNE — dzien od wschodu do zachodu dzieli sie na 12, noc osobno. Bez faktycznego wschodu/zachodu wynik bylby zmyslony, wiec szukamy ich numerycznie (przejscie wysokosci Slonca przez -0°50', bisekcja jak przy stacjach z LOG-03). Doba planetarna startuje o WSCHODZIE, nie o polnocy. * syzygia prenatalna — szukanie wstecz przejscia elongacji przez 0/180 stopni. Walidacja wobec faktow NIEZALEZNYCH od naszego kodu: - 30.04.1984 to poniedzialek -> wladca dnia Ksiezyc; 5. godzina poniedzialku w porzadku chaldejskim to Slonce (Mo, Sa, Ju, Ma, Su) — zgadza sie, - wschod/zachod dla Krakowa: 03:18 / 17:57 UTC = 5:18 / 19:57 lokalnie — zgodne z rzeczywistoscia dla konca kwietnia, - syzygia: pelnia 15.04.1984 19:10:45 UTC; rzeczywista byla 19:11 — roznica ponizej minuty, - bilans przeliczony recznie: Ogien 4, Ziemia 4, Woda 3, Powietrze 0. UI: checkbox „tabele dodatkowe" na ekranie Horoskop (opt-in, bo szuka numerycznie) i sekcja wynikow. Endpoint: /chart/positions?tables=true. Testy: 28 nowych (w tym noc polarna -> brak godzin planetarnych, oraz sprawdzenie, ze w znalezionej syzygii elongacja FAKTYCZNIE wynosi 0/180). Calosc: 202 passed / 1 skipped + 17 (prezentacja). Zweryfikowane e2e w UI. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
245 lines
10 KiB
HTML
245 lines
10 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Horoskop{% endblock %}
|
|
{% block nav_chart %}active{% endblock %}
|
|
|
|
{% block content %}
|
|
<p class="sub">Wpisz dane momentu i miejsca — program policzy pozycje obiektów, osie i domy (silnik efemeryd warstwy logicznej).</p>
|
|
|
|
<form method="post" action="/">
|
|
<div class="grid">
|
|
<label>Data
|
|
<input type="date" name="date" value="{{ form.date or '' }}" required>
|
|
</label>
|
|
<label>Godzina (lokalna)
|
|
<input type="time" name="time" value="{{ form.time or '' }}" required>
|
|
</label>
|
|
<label>Strefa (offset h)
|
|
<input type="number" name="tz_offset" step="0.25" value="{{ form.tz_offset if form.tz_offset is not none else 0 }}">
|
|
</label>
|
|
</div>
|
|
<div class="grid">
|
|
<label>Szerokość (lat, + N)
|
|
<input type="number" name="lat" step="0.0001" value="{{ form.lat if form.lat is not none else 0 }}">
|
|
</label>
|
|
<label>Długość (lon, + E)
|
|
<input type="number" name="lon" step="0.0001" value="{{ form.lon if form.lon is not none else 0 }}">
|
|
</label>
|
|
<label>System domów
|
|
<select name="house_system">
|
|
{% set hs = form.house_system or 'whole_sign' %}
|
|
<option value="whole_sign" {{ 'selected' if hs == 'whole_sign' else '' }}>Whole Sign</option>
|
|
<option value="equal" {{ 'selected' if hs == 'equal' else '' }}>Equal</option>
|
|
<option value="porphyry" {{ 'selected' if hs == 'porphyry' else '' }}>Porphyry</option>
|
|
</select>
|
|
</label>
|
|
<label>Zodiak
|
|
<select name="zodiac">
|
|
{% set zd = form.zodiac or 'tropical' %}
|
|
<option value="tropical" {{ 'selected' if zd == 'tropical' else '' }}>Tropikalny</option>
|
|
<option value="sidereal_lahiri" {{ 'selected' if zd == 'sidereal_lahiri' else '' }}>Syderyczny (Lahiri)</option>
|
|
<option value="sidereal_fagan_bradley" {{ 'selected' if zd == 'sidereal_fagan_bradley' else '' }}>Syderyczny (Fagan-Bradley)</option>
|
|
<option value="sidereal_krishnamurti" {{ 'selected' if zd == 'sidereal_krishnamurti' else '' }}>Syderyczny (Krishnamurti)</option>
|
|
<option value="draconic" {{ 'selected' if zd == 'draconic' else '' }}>Draconic</option>
|
|
</select>
|
|
</label>
|
|
</div>
|
|
{% include "_location_picker.html" %}
|
|
<div class="opts">
|
|
<label><input type="checkbox" name="stations" value="true" {{ 'checked' if form.stations else '' }}>
|
|
licz stacje planet (wolniejsze)</label>
|
|
<label><input type="checkbox" name="tables" value="true" {{ 'checked' if form.tables else '' }}>
|
|
tabele dodatkowe: żywioły, faza Księżyca, godziny planetarne (wolniejsze)</label>
|
|
</div>
|
|
{% if location_label %}<p class="muted small">Wstępnie wpisano lokalizację: <strong>{{ location_label }}</strong> ({{ form.lat }}, {{ form.lon }}). Zmień pola lub kliknij „Tu i teraz".</p>{% endif %}
|
|
<div class="actions">
|
|
<button type="button" id="nowBtn" class="ghost">Tu i teraz</button>
|
|
<button type="submit">Policz horoskop</button>
|
|
<span id="geoNote" class="muted small"></span>
|
|
</div>
|
|
</form>
|
|
|
|
{% if error %}
|
|
<div class="error">{{ error }}</div>
|
|
{% endif %}
|
|
|
|
{% if result %}
|
|
<div class="meta">
|
|
Silnik: <strong>{{ result.engine }}</strong> ·
|
|
obiektów: {{ result.positions | length }}
|
|
{% if result.house_system %}· domy: {{ result.house_system }}{% endif %}
|
|
{% if result.zodiac %}· zodiak: {{ result.zodiac }}{% if result.ayanamsha is defined %} (ayanamsa {{ '%.4f'|format(result.ayanamsha) }}°){% endif %}{% endif %}
|
|
{% if moment %}· moment: {{ moment }}{% endif %}
|
|
</div>
|
|
|
|
{% if result.angles %}
|
|
<table class="angles">
|
|
<thead><tr><th>Oś</th><th>Znak</th><th>W znaku</th></tr></thead>
|
|
<tbody>
|
|
{% for key in ["Asc", "MC", "Dsc", "IC"] %}
|
|
{% set a = result.angles[key] %}
|
|
<tr><td>{{ a.name }}</td><td>{{ a.sign }}</td><td class="mono">{{ a.in_sign }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Obiekt</th><th>Znak</th><th>W znaku</th><th>Dom</th><th>Kier.</th><th>Prędkość °/d</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for p in result.positions %}
|
|
<tr>
|
|
<td>{{ p.name }}</td>
|
|
<td>{{ p.sign }}</td>
|
|
<td class="mono">{{ p.in_sign }}</td>
|
|
<td>{{ p.house if p.house is defined else '—' }}</td>
|
|
<td class="{{ 'retro' if p.direction == 'Rx' else '' }}">{{ p.direction }}</td>
|
|
<td class="mono">{{ '%+.4f' | format(p.speed) }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
|
|
{% if result.lots %}
|
|
<div class="meta">Lots hermetyczne ({{ result.lots | length }}) · sekta: <strong>{{ result.sect }}</strong></div>
|
|
<table class="angles">
|
|
<thead><tr><th>Lot</th><th>Znak</th><th>W znaku</th><th>Dom</th><th>Formuła</th></tr></thead>
|
|
<tbody>
|
|
{% for l in result.lots %}
|
|
<tr><td>{{ l.name }}</td><td>{{ l.sign }}</td><td class="mono">{{ l.in_sign }}</td><td>{{ l.house }}</td><td class="muted small">{{ l.formula }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% set with_stations = result.positions | selectattr('stations', 'defined') | list %}
|
|
{% if with_stations %}
|
|
<div class="meta">Stacje planet (poprzednia / następna; <span class="badge">blisko</span> = mniej niż 7 dni)</div>
|
|
<table class="angles">
|
|
<thead><tr><th>Planeta</th><th>Poprzednia</th><th>Następna</th></tr></thead>
|
|
<tbody>
|
|
{% for p in with_stations %}
|
|
<tr>
|
|
<td>{{ p.name }}{% if p.stations.station_soon %} <span class="badge">blisko</span>{% endif %}</td>
|
|
<td class="mono">{% if p.stations.prev %}{{ p.stations.prev.type }} · {{ p.stations.prev.date }} · {{ p.stations.prev.degree }} ({{ p.stations.prev.days }} d){% else %}—{% endif %}</td>
|
|
<td class="mono">{% if p.stations.next %}{{ p.stations.next.type }} · {{ p.stations.next.date }} · {{ p.stations.next.degree }} (+{{ p.stations.next.days }} d){% else %}—{% endif %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if result.aspects %}
|
|
<div class="meta">Aspekty główne ({{ result.aspects | length }})</div>
|
|
<table class="angles">
|
|
<thead><tr><th>Obiekt 1</th><th>Aspekt</th><th>Obiekt 2</th><th>Orb</th><th title="A = aplikacyjny (dokładność nastąpi), S = separacyjny (już minęła)">A/S</th></tr></thead>
|
|
<tbody>
|
|
{% for a in result.aspects %}
|
|
<tr><td>{{ a.obj1 }}</td><td>{{ a.aspect }}</td><td>{{ a.obj2 }}</td><td class="mono">{{ '%.2f'|format(a.orb) }}°</td><td>{{ a['as'] if a['as'] is defined else '—' }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
{% if result.tables %}
|
|
{% set tb = result.tables %}
|
|
<div class="meta">Tabele dodatkowe (LOG-23)</div>
|
|
|
|
{% set bal = tb.tally.with_modern_10_plus_asc %}
|
|
<table class="angles">
|
|
<thead><tr><th>Bilans (10 planet + Asc)</th><th colspan="4">Rozkład</th></tr></thead>
|
|
<tbody>
|
|
<tr><td>Żywioły</td>
|
|
{% for e, n in bal.elements.items() %}
|
|
<td>{{ tb.tally.labels.elements[e] }}: <strong>{{ n }}</strong></td>
|
|
{% endfor %}
|
|
</tr>
|
|
<tr><td>Jakości</td>
|
|
{% for q, n in bal.qualities.items() %}
|
|
<td>{{ tb.tally.labels.qualities[q] }}: <strong>{{ n }}</strong></td>
|
|
{% endfor %}
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
{% if tb.tally.missing_elements or tb.tally.missing_qualities %}
|
|
<p class="muted small">Brak:
|
|
{% for e in tb.tally.missing_elements %}<strong>{{ tb.tally.labels.elements[e] }}</strong>{{ ", " if not loop.last }}{% endfor %}
|
|
{% for q in tb.tally.missing_qualities %}<strong>{{ tb.tally.labels.qualities[q] }}</strong>{{ ", " if not loop.last }}{% endfor %}
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if tb.moon_phase %}
|
|
<p class="muted small">
|
|
<strong>Faza Księżyca:</strong> {{ tb.moon_phase.phase_pl }} ·
|
|
elongacja {{ '%.2f'|format(tb.moon_phase.angle) }}° ·
|
|
oświetlenie {{ '%.1f'|format(tb.moon_phase.illumination * 100) }}% ·
|
|
{{ 'przybywa' if tb.moon_phase.waxing else 'ubywa' }}
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if tb.planetary_hours %}
|
|
{% set ph = tb.planetary_hours %}
|
|
<p class="muted small">
|
|
<strong>Godziny planetarne:</strong> władca dnia {{ ph.day_ruler }} ·
|
|
{{ ph.hour_number }}. godzina ({{ ph.period }}), władca {{ ph.hour_ruler }} ·
|
|
godzina trwa {{ ph.hour_length_minutes }} min
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if tb.prenatal_syzygy %}
|
|
{% set s = tb.prenatal_syzygy %}
|
|
<p class="muted small">
|
|
<strong>Syzygia prenatalna:</strong> {{ s.type_pl }} {{ s.when_utc }}
|
|
({{ s.days_before_birth }} dni przed) w {{ s.in_sign }}
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if tb.critical_degrees %}
|
|
<div class="meta">Stopnie krytyczne</div>
|
|
<table class="angles">
|
|
<thead><tr><th>Obiekt</th><th>Pozycja</th><th>Uwaga</th></tr></thead>
|
|
<tbody>
|
|
{% for c in tb.critical_degrees %}
|
|
<tr><td>{{ c.name }}</td><td class="mono">{{ c.in_sign }}</td>
|
|
<td class="muted small">{{ c.flags | join('; ') }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% endif %}
|
|
|
|
<details class="loc">
|
|
<summary>Podziały: dwunastniki (D12) i nawamsa (D9)</summary>
|
|
<table>
|
|
<thead><tr><th>Obiekt</th><th>D12</th><th>D9</th></tr></thead>
|
|
<tbody>
|
|
{% for d in tb.divisional %}
|
|
<tr><td>{{ d.name }}</td><td class="mono">{{ d.d12_in_sign }}</td>
|
|
<td class="mono">{{ d.d9_in_sign }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</details>
|
|
{% endif %}
|
|
|
|
{% if result.cusps %}
|
|
<details class="loc">
|
|
<summary>Cusps domów ({{ result.house_system }})</summary>
|
|
<table>
|
|
<thead><tr><th>Dom</th><th>Znak</th><th>Cusp</th></tr></thead>
|
|
<tbody>
|
|
{% for c in result.cusps %}
|
|
<tr><td>{{ c.house }}</td><td>{{ c.sign }}</td><td class="mono">{{ c.in_sign }}</td></tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</details>
|
|
{% endif %}
|
|
{% endif %}
|
|
|
|
<script src="/static/now.js"></script>
|
|
{% endblock %}
|