fix(prezentacja): offset wzgledem GMT + nazwa lokalizacji po „Tu i teraz”
Dwie pierwsze wskazowki od partnerow biznesowych; pozostale piec zapisane jako wymagania (PRE-21..PRE-24) do zrobienia w kolejnych krokach. PRE-19 — offset wzgledem GMT. Etykieta mowila „Strefa (offset h)”, czyli nie bylo jasne, wzgledem czego liczymy przesuniecie. Teraz „Offset wzgledem GMT (h)” z podpowiedzia. Krok juz byl 15-minutowy (0,25 h) — dolozony zakres −12…+14, zeby nie dalo sie wpisac strefy, ktora nie istnieje. Zmiana w trzech zakladkach, ktore maja to pole (Horoskop, Interpretacje, Kalendarz). PRE-20 — po „Tu i teraz” wspolrzedne i pineska skakaly na biezace polozenie, ale w polu tekstowym zostawala STARA, wczesniej wpisana nazwa. Formularz pokazywal jedno miejsce, a liczyl dla innego — cicha pomylka, nic sie nie wywalalo. Handler zdarzenia astrololo:coords odswieza teraz nazwe przez reverseName. Przy okazji druga strona tego samego bledu: reverseName czysci pole ZANIM wysle zapytanie. Gdyby /reverse nie odpowiedzialo (brak sieci), zostalaby stara nazwa — lepiej puste pole i poprawne wspolrzedne niz nazwa, ktora klamie. Wymagania: PRE-19/20 (zrobione), PRE-21 wspolne dane miedzy zakladkami wraz z polem imie i nazwisko, PRE-22 wiele predykcji okresowych w pamieci sesji, PRE-23 zakladka „Skompiluj”, PRE-24 raport PDF przez LaTeX. Dolozone pytanie otwarte Q-14 o lancuch LaTeX→PDF (gdzie postawic TeX Live, silnik unicode owy pod glify, konwersja SVG) — decyzja wplywa na deploy i rozmiar obrazow. Testy: 12 nowych, strukturalnych na zrodle (JS-a nie uruchomimy, a obie regresje sa ciche). Sprawdzone sabotazem — po cofnieciu kazdej poprawki czerwienieja. Calosc: prezentacja 45 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Binary file not shown.
@@ -47,9 +47,14 @@
|
||||
}
|
||||
|
||||
function reverseName(lat, lon) {
|
||||
// Czyścimy pole OD RAZU. Dopóki nie znamy nazwy nowego punktu, stara jest
|
||||
// po prostu nieprawdziwa — pokazywałaby inne miejsce niż współrzędne obok.
|
||||
// Dotyczy też sytuacji, gdy /reverse nie odpowie (brak sieci): lepiej puste
|
||||
// pole i poprawne współrzędne niż nazwa, która kłamie.
|
||||
if (searchEl) searchEl.value = '';
|
||||
fetch('/reverse?lat=' + lat + '&lon=' + lon)
|
||||
.then(function (r) { return r.ok ? r.json() : null; })
|
||||
.then(function (d) { if (d && d.name) searchEl.value = d.name; })
|
||||
.then(function (d) { if (d && d.name && searchEl) searchEl.value = d.name; })
|
||||
.catch(function () {});
|
||||
}
|
||||
|
||||
@@ -108,9 +113,14 @@
|
||||
});
|
||||
|
||||
// ---- synchronizacja z „Tu i teraz" ----
|
||||
// Poza przesunięciem pineski MUSIMY odświeżyć pole tekstowe: po „Tu i teraz"
|
||||
// zostawała w nim stara, ręcznie wpisana nazwa, więc formularz pokazywał jedno
|
||||
// miejsce, a współrzędne wskazywały już inne. reverseName pyta o nazwę punktu,
|
||||
// na który faktycznie ustawiła się mapa.
|
||||
document.addEventListener('astrololo:coords', function () {
|
||||
marker.setLatLng([curLat(), curLon()]);
|
||||
map.setView([curLat(), curLon()], Math.max(map.getZoom(), 12));
|
||||
reverseName(curLat(), curLon());
|
||||
});
|
||||
});
|
||||
})();
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
<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 title="Przesunięcie czasu lokalnego względem GMT/UTC. Krok 15 minut (0,25 h) — bo część stref ma przesunięcie o pół lub ćwierć godziny, np. Indie +5:30, Nepal +5:45.">Offset względem GMT (h)
|
||||
<input type="number" name="tz_offset" step="0.25" min="-12" max="14"
|
||||
value="{{ form.tz_offset if form.tz_offset is not none else 0 }}">
|
||||
</label>
|
||||
</div>
|
||||
<div class="grid">
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
<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 title="Przesunięcie czasu lokalnego względem GMT/UTC. Krok 15 minut (0,25 h) — bo część stref ma przesunięcie o pół lub ćwierć godziny, np. Indie +5:30, Nepal +5:45.">Offset względem GMT (h)
|
||||
<input type="number" name="tz_offset" step="0.25" min="-12" max="14"
|
||||
value="{{ form.tz_offset if form.tz_offset is not none else 0 }}">
|
||||
</label>
|
||||
<label>Szerokość (lat)
|
||||
<input type="number" name="lat" step="0.0001" value="{{ form.lat if form.lat is not none else 0 }}">
|
||||
|
||||
@@ -13,8 +13,9 @@
|
||||
<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 title="Przesunięcie czasu lokalnego względem GMT/UTC. Krok 15 minut (0,25 h) — bo część stref ma przesunięcie o pół lub ćwierć godziny, np. Indie +5:30, Nepal +5:45.">Offset względem GMT (h)
|
||||
<input type="number" name="tz_offset" step="0.25" min="-12" max="14"
|
||||
value="{{ form.tz_offset if form.tz_offset is not none else 0 }}">
|
||||
</label>
|
||||
<label>Szerokość (lat)
|
||||
<input type="number" name="lat" step="0.0001" value="{{ form.lat if form.lat is not none else 0 }}">
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
"""Poprawki zgłoszone przez partnerów: offset względem GMT i lokalizacja po
|
||||
kliknięciu „Tu i teraz" (PRE-19, PRE-20).
|
||||
|
||||
JS-a tu nie uruchomimy, więc pilnujemy tego strukturalnie — tak samo jak
|
||||
niezmienników klienta HTTP. Obie regresje są ciche (nic się nie wywala, tylko
|
||||
formularz pokazuje nieprawdę), więc test na źródle jest tu wart więcej niż zwykle.
|
||||
"""
|
||||
import pathlib
|
||||
|
||||
import pytest
|
||||
|
||||
APP = pathlib.Path(__file__).resolve().parents[1] / "app"
|
||||
TEMPLATES = APP / "templates"
|
||||
GEO_JS = APP / "static" / "geo.js"
|
||||
|
||||
WITH_OFFSET = ("chart.html", "interpret.html", "timeline.html")
|
||||
|
||||
|
||||
# ───────────────────────────── PRE-19: offset względem GMT ───────────────
|
||||
|
||||
@pytest.mark.parametrize("name", WITH_OFFSET)
|
||||
def test_offset_label_says_relative_to_gmt(name):
|
||||
"""Etykieta musi mówić, WZGLĘDEM CZEGO liczymy przesunięcie."""
|
||||
html = (TEMPLATES / name).read_text(encoding="utf-8")
|
||||
assert "Offset względem GMT" in html, f"{name}: etykieta nie mówi o GMT"
|
||||
|
||||
|
||||
@pytest.mark.parametrize("name", WITH_OFFSET)
|
||||
def test_offset_step_is_quarter_hour(name):
|
||||
"""Krok 15 minut = 0,25 h. Strefy pół- i ćwierćgodzinne (Indie +5:30,
|
||||
Nepal +5:45) są realne — przy kroku 1 h nie dało się ich ustawić."""
|
||||
html = (TEMPLATES / name).read_text(encoding="utf-8")
|
||||
assert 'name="tz_offset" step="0.25"' in html, f"{name}: krok inny niż 15 minut"
|
||||
|
||||
|
||||
@pytest.mark.parametrize("name", WITH_OFFSET)
|
||||
def test_offset_range_covers_real_zones(name):
|
||||
html = (TEMPLATES / name).read_text(encoding="utf-8")
|
||||
assert 'min="-12"' in html and 'max="14"' in html, f"{name}: brak sensownego zakresu stref"
|
||||
|
||||
|
||||
# ──────────────────── PRE-20: „Tu i teraz" odświeża nazwę miejsca ────────
|
||||
|
||||
def _geo_source() -> str:
|
||||
return GEO_JS.read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def _handler_body() -> str:
|
||||
"""Ciało handlera zdarzenia astrololo:coords (wysyłanego przez „Tu i teraz").
|
||||
|
||||
Szukamy KONKRETNIE `addEventListener`, nie samej nazwy zdarzenia — ta pada
|
||||
także w komentarzu nagłówkowym pliku i wtedy wycięlibyśmy komentarz zamiast
|
||||
kodu (test przechodziłby albo padał z niewłaściwego powodu).
|
||||
"""
|
||||
src = _geo_source()
|
||||
start = src.index("addEventListener('astrololo:coords'")
|
||||
end = src.index("});", start)
|
||||
return src[start:end]
|
||||
|
||||
|
||||
def test_now_button_handler_refreshes_place_name():
|
||||
"""REGRESJA: po „Tu i teraz" pineska i współrzędne skakały na nowe miejsce,
|
||||
a w polu tekstowym zostawała stara nazwa — formularz pokazywał jedno miejsce,
|
||||
a liczył dla innego."""
|
||||
assert "reverseName(" in _handler_body(), (
|
||||
"handler astrololo:coords nie odświeża nazwy miejsca (reverseName)"
|
||||
)
|
||||
|
||||
|
||||
def test_reverse_name_clears_field_before_lookup():
|
||||
"""Nazwa jest czyszczona ZANIM przyjdzie odpowiedź. Gdyby /reverse nie
|
||||
odpowiedziało (brak sieci), zostałaby stara nazwa — czyli pole kłamałoby
|
||||
o lokalizacji. Lepiej puste pole niż nieprawdziwe."""
|
||||
src = _geo_source()
|
||||
start = src.index("function reverseName")
|
||||
body = src[start:src.index("\n }", start)]
|
||||
clear_at = body.find("searchEl.value = ''")
|
||||
fetch_at = body.find("fetch(")
|
||||
assert clear_at != -1, "reverseName nie czyści pola nazwy"
|
||||
assert clear_at < fetch_at, "pole czyszczone dopiero po zapytaniu — stara nazwa zdąży zostać"
|
||||
|
||||
|
||||
def test_now_button_still_syncs_map():
|
||||
"""Odświeżenie nazwy nie może zastąpić przesunięcia pineski i widoku mapy."""
|
||||
body = _handler_body()
|
||||
assert "marker.setLatLng" in body and "map.setView" in body
|
||||
Reference in New Issue
Block a user