Ai-Email-Assistant / email_actions.py
0Learn's picture
Upload 9 files
cf6b61d verified
# email_actions.py
# Filepath: ai-email-assistant/email_actions.py
# Handles email template management and actions
import logging
import gradio as gr
from google_sheets_utils import get_templates_from_sheet, save_template, delete_template_from_sheet, generate_template_id, update_template_in_sheet
logger = logging.getLogger(__name__)
def get_templates(spreadsheet):
try:
return get_templates_from_sheet(spreadsheet.worksheet("Email Templates"))
except Exception as e:
logger.error(f"Error fetching templates: {str(e)}")
return []
def get_template_summaries(spreadsheet):
templates = get_templates_from_sheet(spreadsheet.worksheet("Email Templates"))
return [f"{template['Name']} ({template['Type']})" for template in templates]
def create_email_actions_interface(spreadsheet, current_template):
worksheet = spreadsheet.worksheet("Email Templates")
with gr.Blocks() as email_actions_block:
gr.Markdown("## Email Actions")
t_name = gr.Textbox(label="Template Name", elem_id="t_name")
t_type = gr.Dropdown(
["Cold Email", "Follow-up", "Thank You", "Other"],
label="Template Type",
allow_custom_value=True,
elem_id="t_type"
)
t_subject = gr.Textbox(label="Subject", elem_id="t_subject")
t_body = gr.Textbox(label="Body", lines=5, elem_id="t_body")
t_id = gr.Textbox(label="Template ID", interactive=False, elem_id="t_id")
headers = ["Type", "ID", "Name", "Subject", "Body"]
templates_list = gr.Dataframe(
headers=headers,
label="Email Templates List",
interactive=False,
elem_id="t_templates_list"
)
save_btn = gr.Button("Save New Template", elem_id="t_save_btn")
update_btn = gr.Button("Update Existing Template", elem_id="t_update_btn")
delete_btn = gr.Button("Delete Template", elem_id="t_delete_btn")
clear_btn = gr.Button("Clear Fields", elem_id="t_clear_btn")
def refresh_templates():
templates = get_templates(spreadsheet)
return [[template.get(h, "") for h in headers] for template in templates]
def load_template(evt: gr.SelectData, current_name, current_type, current_subject, current_body, current_id):
templates = get_templates(spreadsheet)
selected_row = evt.index[0]
selected_template = templates[selected_row]
logger.debug(f"Selected Email Template: {selected_template}")
# Check if ANY field is non-empty
fields = [current_name, current_type, current_subject, current_body, current_id]
non_empty_fields = any(field and field.strip() != "" for field in fields)
logger.debug(f"Any email template field non-empty: {non_empty_fields}")
if non_empty_fields:
logger.warning("Email template fields not empty, showing warning")
gr.Warning("Please clear all fields before loading a new email template.")
return [gr.update() for _ in range(5)] # Don't update any fields
logger.info("Loading selected email template")
try:
return (
selected_template["Name"],
selected_template["Type"],
selected_template["Subject"],
selected_template["Body"],
selected_template["ID"]
)
except KeyError as e:
logger.error(f"Error loading template: missing key {e}")
gr.Error(f"Error loading template: missing information")
return [gr.update() for _ in range(5)]
def save_template_action(name, template_type, subject, body):
# Check for empty fields
if not name or not template_type or not subject or not body:
message = gr.HTML("<p style='color:red;'>All fields are required. Please fill in all details before saving.</p>")
return gr.update(), message, refresh_templates()
new_id = generate_template_id()
template_data = [
"Email Templates", # Type
new_id, # ID
name,
template_type,
subject,
body
]
result = save_template(worksheet, template_data)
if result:
message = gr.HTML("<p style='color:green;'>Template added successfully.</p>")
else:
message = gr.HTML("<p style='color:red;'>Failed to add template.</p>")
return gr.update(), message, refresh_templates()
def update_template_action(template_id, name, template_type, subject, body):
# Check for empty fields
if not template_id:
message = gr.HTML("<p style='color:red;'>No template selected. Please select a template to update.</p>")
return gr.update(), message, refresh_templates()
if not name or not template_type or not subject or not body:
message = gr.HTML("<p style='color:red;'>All fields are required. Please fill in all details before updating.</p>")
return gr.update(), message, refresh_templates()
updated_data = [
"Email Templates", # Type
template_id,
name,
template_type,
subject,
body
]
result = update_template_in_sheet(worksheet, template_id, updated_data)
if result:
message = gr.HTML("<p style='color:green;'>Template updated successfully.</p>")
else:
message = gr.HTML("<p style='color:red;'>Failed to update template.</p>")
return gr.update(), message, refresh_templates()
def delete_template_action(template_id):
if not template_id:
message = gr.HTML("<p style='color:red;'>No template selected. Please select a template to delete.</p>")
return message, refresh_templates()
result = delete_template_from_sheet(worksheet, template_id)
if result:
message = gr.HTML("<p style='color:green;'>Template deleted successfully.</p>")
else:
message = gr.HTML("<p style='color:red;'>Failed to delete template.</p>")
return message, refresh_templates()
def clear_fields():
return [""] * 5 # Clear all 5 fields
save_btn.click(
save_template_action,
inputs=[t_name, t_type, t_subject, t_body],
outputs=[templates_list]
)
update_btn.click(
update_template_action,
inputs=[t_id, t_name, t_type, t_subject, t_body],
outputs=[templates_list]
)
delete_btn.click(
delete_template_action,
inputs=[t_id],
outputs=[templates_list]
)
clear_btn.click(clear_fields, outputs=[t_name, t_type, t_subject, t_body, t_id])
templates_list.select(
load_template,
inputs=[t_name, t_type, t_subject, t_body, t_id],
outputs=[t_name, t_type, t_subject, t_body, t_id]
)
# Refresh templates on component creation
templates_list.value = refresh_templates()
# Return a dictionary containing the block and required components/functions
return {
"block": email_actions_block,
"templates_list": templates_list,
"t_name": t_name,
"t_type": t_type,
"t_subject": t_subject,
"t_body": t_body,
"t_id": t_id,
"refresh_templates": refresh_templates,
"load_template": load_template,
# Add other components or functions you need to access
}