sky_natus_data: return stored sky_chart_data (preserves correct asc)
sky_save was re-fetching from PySwiss using sky_birth_dt, which was
stored as local time treated as UTC — giving a different (wrong) asc
than the chart computed by sky_preview. sky_natus_data then served this
wrong chart, rotating the applet wheel by the timezone offset.
Fix: sky_save stores body.get('chart_data') directly (client _lastChartData
is already enriched from sky_preview with correct UTC). sky_natus_data
returns the stored chart with fresh distinctions — no PySwiss call needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -327,40 +327,19 @@ def sky_save(request):
|
||||
|
||||
user = request.user
|
||||
birth_dt_str = body.get('birth_dt', '')
|
||||
birth_dt_utc = None
|
||||
if birth_dt_str:
|
||||
try:
|
||||
naive = datetime.fromisoformat(birth_dt_str.replace('Z', '+00:00'))
|
||||
user.sky_birth_dt = naive if naive.tzinfo else naive.replace(
|
||||
tzinfo=zoneinfo.ZoneInfo('UTC')
|
||||
)
|
||||
birth_dt_utc = user.sky_birth_dt.astimezone(zoneinfo.ZoneInfo('UTC'))
|
||||
except ValueError:
|
||||
user.sky_birth_dt = None
|
||||
user.sky_birth_lat = body.get('birth_lat')
|
||||
user.sky_birth_lon = body.get('birth_lon')
|
||||
user.sky_birth_place = body.get('birth_place', '')
|
||||
user.sky_house_system = body.get('house_system', 'O')
|
||||
|
||||
lat_str = body.get('birth_lat')
|
||||
lon_str = body.get('birth_lon')
|
||||
if birth_dt_utc and lat_str is not None and lon_str is not None:
|
||||
try:
|
||||
dt_iso = birth_dt_utc.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||
resp = http_requests.get(
|
||||
settings.PYSWISS_URL + '/api/chart/',
|
||||
params={'dt': dt_iso, 'lat': str(lat_str), 'lon': str(lon_str)},
|
||||
timeout=5,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
enriched = resp.json()
|
||||
if 'elements' in enriched and 'Earth' in enriched['elements']:
|
||||
enriched['elements']['Stone'] = enriched['elements'].pop('Earth')
|
||||
user.sky_chart_data = enriched
|
||||
except Exception:
|
||||
user.sky_chart_data = body.get('chart_data')
|
||||
else:
|
||||
user.sky_chart_data = body.get('chart_data')
|
||||
user.sky_chart_data = body.get('chart_data')
|
||||
|
||||
user.save(update_fields=[
|
||||
'sky_birth_dt', 'sky_birth_lat', 'sky_birth_lon',
|
||||
@@ -372,27 +351,11 @@ def sky_save(request):
|
||||
@login_required(login_url="/")
|
||||
def sky_natus_data(request):
|
||||
user = request.user
|
||||
if not user.sky_birth_lat or not user.sky_birth_lon or not user.sky_birth_dt:
|
||||
if not user.sky_chart_data:
|
||||
return HttpResponse(status=404)
|
||||
|
||||
try:
|
||||
utc_dt = user.sky_birth_dt.astimezone(zoneinfo.ZoneInfo('UTC'))
|
||||
dt_iso = utc_dt.strftime('%Y-%m-%dT%H:%M:%SZ')
|
||||
resp = http_requests.get(
|
||||
settings.PYSWISS_URL + '/api/chart/',
|
||||
params={
|
||||
'dt': dt_iso,
|
||||
'lat': str(user.sky_birth_lat),
|
||||
'lon': str(user.sky_birth_lon),
|
||||
},
|
||||
timeout=5,
|
||||
)
|
||||
resp.raise_for_status()
|
||||
except Exception:
|
||||
return HttpResponse(status=502)
|
||||
|
||||
data = resp.json()
|
||||
if 'elements' in data and 'Earth' in data['elements']:
|
||||
data['elements']['Stone'] = data['elements'].pop('Earth')
|
||||
data['distinctions'] = _compute_distinctions(data['planets'], data['houses'])
|
||||
data = dict(user.sky_chart_data)
|
||||
data['distinctions'] = _compute_distinctions(
|
||||
data.get('planets', {}), data.get('houses', {})
|
||||
)
|
||||
return JsonResponse(data)
|
||||
|
||||
Reference in New Issue
Block a user