diff --git a/update.py b/update.py index a91641f..94e1807 100755 --- a/update.py +++ b/update.py @@ -109,26 +109,94 @@ Agenda: https://edwardbetts.com/agenda/ 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( config: flask.config.Config, prev_launch: StrDict | None, cur_launch: StrDict | None ) -> None: """Send mail to announce change to space launch data.""" if cur_launch: 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: assert prev_launch 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) + 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""" -A space launch of interest was updated. + body = f"""🚀 Space Launch Update -{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)