Improve space launch change email format for better readability
Replace technical YAML diff output with human-readable bullet points that clearly explain what changed. Added structured email format with mission details, rocket emoji, and formatted dates. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
a68df381fe
commit
1806785700
78
update.py
78
update.py
|
|
@ -109,25 +109,93 @@ Agenda: https://edwardbetts.com/agenda/
|
||||||
agenda.mail.send_mail(config, subject, body)
|
agenda.mail.send_mail(config, subject, body)
|
||||||
|
|
||||||
|
|
||||||
|
def format_launch_changes(differences: dict) -> str:
|
||||||
|
"""Convert deepdiff output to human-readable format."""
|
||||||
|
changes = []
|
||||||
|
# Handle value changes
|
||||||
|
if "values_changed" in differences:
|
||||||
|
for path, change in differences["values_changed"].items():
|
||||||
|
field = path.replace("root['", "").replace("']", "").replace("root.", "")
|
||||||
|
old_val = change["old_value"]
|
||||||
|
new_val = change["new_value"]
|
||||||
|
# Format specific fields nicely
|
||||||
|
if field == "net":
|
||||||
|
try:
|
||||||
|
old_dt = datetime.fromisoformat(old_val.replace('Z', '+00:00'))
|
||||||
|
new_dt = datetime.fromisoformat(new_val.replace('Z', '+00:00'))
|
||||||
|
changes.append(f"Launch time changed from {old_dt.strftime('%d %b %Y at %H:%M UTC')} to {new_dt.strftime('%d %b %Y at %H:%M UTC')}")
|
||||||
|
except:
|
||||||
|
changes.append(f"Launch time changed from {old_val} to {new_val}")
|
||||||
|
elif field == "name":
|
||||||
|
changes.append(f"Mission name changed from '{old_val}' to '{new_val}'")
|
||||||
|
elif field == "probability":
|
||||||
|
if old_val is None:
|
||||||
|
changes.append(f"Launch probability set to {new_val}%")
|
||||||
|
elif new_val is None:
|
||||||
|
changes.append("Launch probability removed")
|
||||||
|
else:
|
||||||
|
changes.append(f"Launch probability changed from {old_val}% to {new_val}%")
|
||||||
|
elif "status" in field:
|
||||||
|
changes.append(f"Status changed from '{old_val}' to '{new_val}'")
|
||||||
|
else:
|
||||||
|
changes.append(f"{field.replace('_', ' ').title()} changed from '{old_val}' to '{new_val}'")
|
||||||
|
# Handle additions
|
||||||
|
if "dictionary_item_added" in differences:
|
||||||
|
for path in differences["dictionary_item_added"]:
|
||||||
|
field = path.replace("root['", "").replace("']", "").replace("root.", "")
|
||||||
|
changes.append(f"New field added: {field.replace('_', ' ').title()}")
|
||||||
|
# Handle removals
|
||||||
|
if "dictionary_item_removed" in differences:
|
||||||
|
for path in differences["dictionary_item_removed"]:
|
||||||
|
field = path.replace("root['", "").replace("']", "").replace("root.", "")
|
||||||
|
changes.append(f"Field removed: {field.replace('_', ' ').title()}")
|
||||||
|
# Handle type changes
|
||||||
|
if "type_changes" in differences:
|
||||||
|
for path, change in differences["type_changes"].items():
|
||||||
|
field = path.replace("root['", "").replace("']", "").replace("root.", "")
|
||||||
|
changes.append(f"{field.replace('_', ' ').title()} type changed from {change['old_type'].__name__} to {change['new_type'].__name__}")
|
||||||
|
return "\n".join(f"• {change}" for change in changes) if changes else "No specific changes detected"
|
||||||
|
|
||||||
|
|
||||||
def report_space_launch_change(
|
def report_space_launch_change(
|
||||||
config: flask.config.Config, prev_launch: StrDict | None, cur_launch: StrDict | None
|
config: flask.config.Config, prev_launch: StrDict | None, cur_launch: StrDict | None
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Send mail to announce change to space launch data."""
|
"""Send mail to announce change to space launch data."""
|
||||||
if cur_launch:
|
if cur_launch:
|
||||||
name = cur_launch["name"]
|
name = cur_launch["name"]
|
||||||
|
status = cur_launch.get("status", {}).get("name", "Unknown") if isinstance(cur_launch.get("status"), dict) else "Unknown"
|
||||||
|
launch_date = cur_launch.get("net", "Unknown")
|
||||||
|
location = cur_launch.get("pad", {}).get("location", {}).get("name", "Unknown") if isinstance(cur_launch.get("pad"), dict) else "Unknown"
|
||||||
else:
|
else:
|
||||||
assert prev_launch
|
assert prev_launch
|
||||||
name = prev_launch["name"]
|
name = prev_launch["name"]
|
||||||
subject = f"Change to {name}"
|
status = "Cancelled/Removed"
|
||||||
|
launch_date = prev_launch.get("net", "Unknown")
|
||||||
|
location = prev_launch.get("pad", {}).get("location", {}).get("name", "Unknown") if isinstance(prev_launch.get("pad"), dict) else "Unknown"
|
||||||
|
subject = f"Space Launch Update: {name}"
|
||||||
|
|
||||||
differences = deepdiff.DeepDiff(prev_launch, cur_launch)
|
differences = deepdiff.DeepDiff(prev_launch, cur_launch)
|
||||||
|
changes_text = format_launch_changes(differences)
|
||||||
|
# Format launch date nicely
|
||||||
|
formatted_date = "Unknown"
|
||||||
|
if launch_date and launch_date != "Unknown":
|
||||||
|
try:
|
||||||
|
dt = datetime.fromisoformat(launch_date.replace('Z', '+00:00'))
|
||||||
|
formatted_date = dt.strftime('%d %b %Y at %H:%M UTC')
|
||||||
|
except:
|
||||||
|
formatted_date = launch_date
|
||||||
|
|
||||||
body = f"""
|
body = f"""🚀 Space Launch Update
|
||||||
A space launch of interest was updated.
|
|
||||||
|
|
||||||
{yaml.dump(differences)}
|
Mission: {name}
|
||||||
|
Status: {status}
|
||||||
|
Launch Date: {formatted_date}
|
||||||
|
Location: {location}
|
||||||
|
|
||||||
https://edwardbetts.com/agenda/launches
|
Changes:
|
||||||
|
{changes_text}
|
||||||
|
|
||||||
|
View all launches: https://edwardbetts.com/agenda/launches
|
||||||
"""
|
"""
|
||||||
|
|
||||||
agenda.mail.send_mail(config, subject, body)
|
agenda.mail.send_mail(config, subject, body)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue