reformatting payload

This commit is contained in:
Matthew Ryan Dillon 2025-06-13 06:31:09 -04:00
parent b35bbe2d1c
commit fc964d3ac4

83
main.py
View file

@ -42,19 +42,6 @@ def format_datetime(dt):
return f"{format_date(dt)} {format_time(dt)}"
def pollen_desc(index):
if index < 2.5:
return f"{index} l"
elif index < 4.9:
return f"{index} l-m"
elif index < 7.3:
return f"{index} m"
elif index < 9.7:
return f"{index} m-h"
else:
return f"{index} h"
def relative_day_to_date(rel_dt):
dt = datetime.now()
day = timedelta(days=1)
@ -69,6 +56,24 @@ def relative_day_to_date(rel_dt):
return passthrough
def build_daily_data(date, pollen_periods, weather_periods):
daily_data = {}
if date in pollen_periods:
daily_data["pollen"] = pollen_periods[date]["index"]
if date in weather_periods:
weather_data = weather_periods[date]
daily_data.update({
"low": weather_data["low"],
"high": weather_data["high"],
"desc": weather_data["desc"],
"humidity": weather_data["humidity"],
"sunrise": weather_data["sunrise"],
"sunset": weather_data["sunset"],
"pressure": weather_data["pressure"],
})
return daily_data
def fallback_handler(func):
@functools.wraps(func)
async def wrapper(*args, **kwargs):
@ -106,10 +111,11 @@ async def fetch_pollen(zipcode):
),
"periods": [
{
"index": pollen_desc(d["Index"]),
"index": int(d["Index"] / 12. * 100),
"period": relative_day_to_date(d["Type"]),
}
for d in data["Location"]["periods"]
if d["Type"].lower().strip() in ["today", "tomorrow"]
],
}
]
@ -122,7 +128,7 @@ async def fetch_weather(lat, lon, weather_api_key):
response = await client.get(url)
response.raise_for_status()
data = response.json()
current, periods = data["current"], data["daily"][:3]
current, periods = data["current"], data["daily"][:2]
return [
{
"forecast_date": format_datetime(datetime.fromtimestamp(current["dt"])),
@ -163,8 +169,49 @@ async def read_root(token: str):
fetch_weather(CONFIG["lat"], CONFIG["lon"], CONFIG["weather_api_key"]),
)
return {
pollen_periods = {p["period"]: p for p in pollen[0]["periods"]} if pollen and pollen[0]["periods"] else {}
weather_periods = {p["period"]: p for p in weather[0]["periods"]} if weather and weather[0]["periods"] else {}
# Add current weather data as a "current" period
if weather and weather[0]:
data = weather[0]
weather_periods["current"] = {
"period": "current",
"temp": data["current_temp"],
"feels_like": data["current_feels_like"],
"humidity": data["current_humidity"],
"pressure": data["current_pressure"],
"desc": data["current_desc"],
"sunrise": data["sunrise"],
"sunset": data["sunset"]
}
today_date = format_date(datetime.now())
tomorrow_date = format_date(datetime.now() + timedelta(days=1))
result = {
"fetched_at": format_datetime(datetime.now()),
"pollen": pollen,
"weather": weather,
"current": {},
"today": {},
"tomorrow": {},
}
if "current" in weather_periods:
weather_data = weather_periods["current"]
result["current"] = {
"temp": weather_data["temp"],
"feels_like": weather_data["feels_like"],
"desc": weather_data["desc"],
"humidity": weather_data["humidity"],
"pressure": weather_data["pressure"]
}
today_data = build_daily_data(today_date, pollen_periods, weather_periods)
if today_data:
result["today"] = today_data
tomorrow_data = build_daily_data(tomorrow_date, pollen_periods, weather_periods)
if tomorrow_data:
result["tomorrow"] = tomorrow_data
return result