fix(rectification): scan chart boundaries in the user's ayanamsa (BUG-1307, BUG-1309)

This commit is contained in:
jesse-ux
2026-10-12 15:36:50 +08:00
committed by Jesse_Chen
parent 74949d0475
commit 0f05c9e26a
12 changed files with 253 additions and 26 deletions
+21 -3
View File
@@ -15,6 +15,23 @@ from scripts import domain_calculation_service, varga
TARGETS = ("D1", "D9", "D10")
BOUNDARY_CHARTS = ("D1", "D2", "D4", "D5", "D7", "D9", "D10", "D11", "D12", "D24", "D30")
VERSION = "rectification-varga-segments-v1"
SEGMENT_AYANAMSAS = frozenset(("raman", "lahiri", "kp", "true_citra", "true_pushya", "fagan_bradley"))
def _segment_ayanamsa(value: Any) -> str:
"""Blank stays Raman. Unknown names raise; they do not fall back."""
if value is None or (isinstance(value, str) and not value.strip()):
return "raman"
if not isinstance(value, str):
raise ValueError("invalid_ayanamsa")
key = value.strip().lower().replace("-", "_")
if key in {"krishnamurti", "krishnamurti_paddhati", "krishnamurti/kp"}:
key = "kp"
elif key == "true_chitra":
key = "true_citra"
if key not in SEGMENT_AYANAMSAS:
raise ValueError("invalid_ayanamsa")
return key
def _number(body, name, low, high):
@@ -47,11 +64,12 @@ def scan_varga_segments(body: dict[str, Any], *, cache_dir: Path | None = None)
or len(set(targets)) != len(targets)):
raise ValueError("invalid_target_charts")
boundary_charts, recorded_time = _boundary_request(body)
ayanamsa = _segment_ayanamsa(body.get("ayanamsa"))
profile = {
"lat": _number(body, "latitude", -90, 90),
"lon": _number(body, "longitude", -180, 180),
"tz": _number(body, "timezone_offset", -14, 14),
"ayanamsa": "raman", "node_mode": "mean",
"ayanamsa": ayanamsa, "node_mode": "mean",
}
if boundary_charts:
profile["boundary_charts"] = list(boundary_charts)
@@ -78,7 +96,7 @@ def scan_varga_segments(body: dict[str, Any], *, cache_dir: Path | None = None)
moment = start + timedelta(minutes=offset)
chart = domain_calculation_service.compute_chart({
"lat": profile["lat"], "lon": profile["lon"], "tz": profile["tz"],
"ayanamsa": "raman", "node_mode": "mean",
"ayanamsa": ayanamsa, "node_mode": "mean",
"year": moment.year, "month": moment.month, "day": moment.day,
"hour": moment.hour, "minute": moment.minute,
})
@@ -106,7 +124,7 @@ def scan_varga_segments(body: dict[str, Any], *, cache_dir: Path | None = None)
payload = {"version": VERSION, "window_key": key, "start_at": body["start_at"], "end_at": body["end_at"],
"window_minutes": width, "target_charts": targets, "minutes": minutes,
"segments": segments, "full_window_unique": {target: len({row['sign'] for row in rows}) == 1 for target, rows in segments.items()},
"ayanamsa": "raman", "node_mode": "mean", "step_minutes": 1}
"ayanamsa": ayanamsa, "node_mode": "mean", "step_minutes": 1}
if boundary_charts:
payload["nearest_boundary"] = _nearest_from_signs(boundary_signs, [row["time"] for row in minutes], recorded_time)
root.mkdir(parents=True, exist_ok=True)