3030logger = logging .getLogger (__name__ )
3131
3232
33+ def format_resources (resources : list [dict ]) -> str :
34+ return "\n \n " .join ([format_resource (resource ) for resource in resources ])
35+
36+
37+ def format_resource (resource : dict ) -> str :
38+ return "\n " .join (
39+ [
40+ f"### { resource .get ('name' , 'Unnamed Resource' )} " ,
41+ f"- Referral Type: { resource .get ('referral_type' , 'None' )} " ,
42+ f"- Description: { resource .get ('description' , 'None' )} " ,
43+ f"- Website: { resource .get ('website' , 'None' )} " ,
44+ f"- Phone: { ', ' .join (resource .get ('phones' , ['None' ]))} " ,
45+ f"- Email: { ', ' .join (resource .get ('emails' , ['None' ]))} " ,
46+ f"- Addresses: { ', ' .join (resource .get ('addresses' , ['None' ]))} " ,
47+ ]
48+ )
49+
50+
51+ def format_action_plan (action_plan : dict ) -> str :
52+ """Format the action plan for email display. Returns empty string if no action plan."""
53+ if not action_plan :
54+ return ""
55+
56+ title = action_plan .get ("title" , "Your Action Plan" )
57+ summary = action_plan .get ("summary" , "" )
58+ content = action_plan .get ("content" , "" )
59+
60+ parts = [f"## { title } " ]
61+ if summary :
62+ parts .append (f"\n { summary } " )
63+ if content :
64+ parts .append (f"\n { content } " )
65+
66+ return "\n " .join (parts )
67+
68+
3369@component
3470class EchoNode :
3571 """
@@ -209,6 +245,32 @@ def run(
209245"""
210246
211247
248+ @component
249+ class EmailFullResult :
250+ """
251+ Formats JSON object (representing a list of resources and action plan) and sends it to email address.
252+ """
253+
254+ @component .output_types (status = str , email = str , message = str )
255+ def run (self , email : str , resources_dict : dict , action_plan_dict : dict ) -> dict :
256+ logger .info ("Emailing result to %s" , email )
257+ logger .debug ("Resources JSON content:\n %s" , json .dumps (resources_dict , indent = 2 ))
258+ if action_plan_dict :
259+ logger .debug ("Action plan JSON content:\n %s" , json .dumps (action_plan_dict , indent = 2 ))
260+
261+ formatted_resources = format_resources (resources_dict .get ("resources" , []))
262+ formatted_action_plan = format_action_plan (action_plan_dict )
263+
264+ message = f"{ EMAIL_INTRO } \n { formatted_resources } \n \n { formatted_action_plan } "
265+
266+ # Send email via AWS SES
267+ subject = "Your Requested Resources and Action Plan"
268+ success = send_email (recipient = email , subject = subject , body = message )
269+ status = "success" if success else "failed"
270+
271+ return {"status" : status , "email" : email , "message" : message }
272+
273+
212274@component
213275class EmailResult :
214276 """
@@ -219,7 +281,7 @@ class EmailResult:
219281 def run (self , email : str , json_dict : dict ) -> dict :
220282 logger .info ("Emailing result to %s" , email )
221283 logger .debug ("JSON content:\n %s" , json .dumps (json_dict , indent = 2 ))
222- formatted_resources = self . format_resources (json_dict .get ("resources" , []))
284+ formatted_resources = format_resources (json_dict .get ("resources" , []))
223285 message = f"{ EMAIL_INTRO } \n { formatted_resources } "
224286
225287 # Send email via AWS SES
@@ -229,22 +291,6 @@ def run(self, email: str, json_dict: dict) -> dict:
229291
230292 return {"status" : status , "email" : email , "message" : message }
231293
232- def format_resources (self , resources : list [dict ]) -> str :
233- return "\n \n " .join ([self .format_resource (resource ) for resource in resources ])
234-
235- def format_resource (self , resource : dict ) -> str :
236- return "\n " .join (
237- [
238- f"### { resource .get ('name' , 'Unnamed Resource' )} " ,
239- f"- Referral Type: { resource .get ('referral_type' , 'None' )} " ,
240- f"- Description: { resource .get ('description' , 'None' )} " ,
241- f"- Website: { resource .get ('website' , 'None' )} " ,
242- f"- Phone: { ', ' .join (resource .get ('phones' , ['None' ]))} " ,
243- f"- Email: { ', ' .join (resource .get ('emails' , ['None' ]))} " ,
244- f"- Addresses: { ', ' .join (resource .get ('addresses' , ['None' ]))} " ,
245- ]
246- )
247-
248294
249295BaseModelT = TypeVar ("BaseModelT" , bound = BaseModel )
250296
0 commit comments