fix(ayanamsa): keep a caller-selected mode across import and transit paths (BUG-1269, upstream 23be1807)

This commit is contained in:
jesse-ux
2026-10-07 17:05:18 +08:00
parent 4b9c019814
commit 4e134b9b9f
6 changed files with 183 additions and 24 deletions
+21 -9
View File
@@ -26,7 +26,9 @@ def _compute_chart_from_args(args: Any) -> tuple:
chart, asc_idx, jd, ayanamsa = compute_chart_data(
args.year, args.month, args.day, args.hour, args.minute,
args.lat, args.lon, args.tz, getattr(args, 'node_mode', 'mean'))
args.lat, args.lon, args.tz, getattr(args, 'node_mode', 'mean'),
second=int(getattr(args, 'second', 0) or 0),
ayanamsa_name=getattr(args, 'ayanamsa', None))
if chart is None:
return None, None, None, None, {}, 0, 0, 0
@@ -66,6 +68,14 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
if chart is None:
return {"error": "swisseph未安装"}
applied_ayanamsa = (chart.get('birth_info') or {}).get('ayanamsa_name') if isinstance(chart, dict) else None
def _stamp(payload):
if isinstance(payload, dict):
payload['requested_ayanamsa'] = getattr(args, 'ayanamsa', None)
payload['applied_ayanamsa'] = applied_ayanamsa
return payload
try:
from nakshatra_advanced import (
find_nakshatra, calc_all_tara_balas, calc_sub_lord,
@@ -85,7 +95,7 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
detail[pn] = find_nakshatra(lon)
result_dict = {'planets': detail}
if mode == 'detail':
return result_dict
return _stamp(result_dict)
else:
result_dict = {}
@@ -93,7 +103,7 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
if mode in ('all', 'tara'):
tara = calc_all_tara_balas(moon_nak_idx, planet_lons)
if mode == 'tara':
return {'tara_bala': tara, 'moon_nakshatra_idx': moon_nak_idx}
return _stamp({'tara_bala': tara, 'moon_nakshatra_idx': moon_nak_idx})
result_dict['tara_bala'] = tara
# === mode: 'chandra' (v6.0.22 新增) ===
@@ -107,7 +117,7 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
'chandra': calc_chandra_bala(moon_sign_idx, p_sign),
}
if mode == 'chandra':
return {'chandra_bala': chandra, 'moon_sign_idx': moon_sign_idx}
return _stamp({'chandra_bala': chandra, 'moon_sign_idx': moon_sign_idx})
result_dict['chandra_bala'] = chandra
# === mode: 'combined' (v6.0.22 新增) ===
@@ -115,14 +125,14 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
moon_sign_idx = int(moon_lon / 30) % 12
combined = calc_tara_chandra_combined(moon_nak_idx, moon_sign_idx, planet_lons)
if mode == 'combined':
return {'tara_chandra_combined': combined}
return _stamp({'tara_chandra_combined': combined})
result_dict['tara_chandra_combined'] = combined
# === mode: 'sublord' ===
if mode in ('all', 'sublord'):
sublords = {pn: calc_sub_lord(lon) for pn, lon in planet_lons.items()}
if mode == 'sublord':
return {'sub_lords': sublords}
return _stamp({'sub_lords': sublords})
result_dict['sub_lords'] = sublords
# === mode: 'all' / 'full' — 综合报告 ===
@@ -130,7 +140,7 @@ def cmd_nakshatra_adv(args: Any) -> Dict[str, Any]:
full = nakshatra_full_report(chart)
result_dict.update(full)
return result_dict
return _stamp(result_dict)
def cmd_nakshatra_dasha(args: Any) -> Dict[str, Any]:
@@ -196,7 +206,8 @@ def cmd_nakshatra_dasha(args: Any) -> Dict[str, Any]:
ty, tm, td = map(int, transit_date_str.split('-'))
transit_jd = swe.julday(ty, tm, td, 12.0 - args.tz)
transit_planets, transit_ayanamsa = _calc_sidereal_planets_for_jd(
transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True)
transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True,
ayanamsa_name=getattr(args, 'ayanamsa', None))
transit_lons = {}
for pn, pd in transit_planets.items():
if isinstance(pd, dict) and 'degree' in pd:
@@ -217,7 +228,8 @@ def cmd_nakshatra_dasha(args: Any) -> Dict[str, Any]:
ty, tm, td = map(int, transit_date_str.split('-'))
transit_jd = swe.julday(ty, tm, td, 12.0 - args.tz)
transit_planets, _ = _calc_sidereal_planets_for_jd(
transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True)
transit_jd, node_mode=getattr(args, 'node_mode', 'mean'), include_ketu=True,
ayanamsa_name=getattr(args, 'ayanamsa', None))
transit_lons = {}
for pn, pd in transit_planets.items():
if isinstance(pd, dict) and 'degree' in pd: