From d0da2c4749c3a80d967750d774d1415c773cfc3f Mon Sep 17 00:00:00 2001 From: "Jeremy R. Manning" Date: Thu, 18 Jul 2024 14:01:12 -0400 Subject: [PATCH] Update generate_event_reminders.py --- generate_event_reminders.py | 126 ++++++++++++------------------------ 1 file changed, 43 insertions(+), 83 deletions(-) diff --git a/generate_event_reminders.py b/generate_event_reminders.py index 0fc1d83..06d5c15 100644 --- a/generate_event_reminders.py +++ b/generate_event_reminders.py @@ -1,118 +1,78 @@ -import os import pandas as pd import yaml from datetime import datetime, timedelta +import os import markdown -# Create the scripts directory if it doesn't exist -if not os.path.exists('scripts'): - os.makedirs('scripts') - -# Load TSV files +# Load events.tsv and email_addresses.tsv events_df = pd.read_csv('events.tsv', delimiter='\t') -emails_df = pd.read_csv('email_addresses.csv') - -# Function to create valid cron expressions -def get_cron_expression(event_date): - dt = datetime.strptime(event_date, '%Y-%m-%d') - # Set the cron job to run at 9 AM UTC the day before the event - cron_expression = f"0 9 {dt.day - 1} {dt.month} *" - return cron_expression - -# Function to create event reminder scripts -def create_event_script(event_name, date_str, content, frequency, day_of_week, date, time, location): - event_date = datetime.strptime(date_str, '%Y-%m-%d') - trigger_time = get_cron_expression(date_str) - - # Create the event-specific script - script_content = f""" -import pandas as pd -import smtplib -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -import markdown -import os +emails_df = pd.read_csv('email_addresses.tsv') -# Load email addresses -emails_df = pd.read_csv('email_addresses.csv') +# Extract email addresses sender_email = emails_df[emails_df['Role'] == 'Sender']['Email address'].iloc[0] admin_emails = emails_df[emails_df['Role'] == 'Admin']['Email address'].tolist() organizer_emails = emails_df[emails_df['Role'] == 'Organizer']['Email address'].tolist() + admin_emails_str = ', '.join(admin_emails) organizer_emails_str = ', '.join(organizer_emails) -# Load event details -events_df = pd.read_csv('events.tsv', delimiter='\\t') -event = events_df[events_df['Event Name'] == '{event_name}'].iloc[0] -event_name = event['Event Name'] -date = event['Date'] -time = event['Time'] -location = event['Location'] -content_file = event['Content File'] - -# Email content -with open(f'templates/{{content_file}}', 'r') as file: - email_content = file.read() -email_content = email_content.replace('{{DATE}}', date + '\\n').replace('{{TIME}}', time + '\\n').replace('{{LOCATION}}', location) - -# Read admin.md template +# Load the email script template with open('templates/admin.md', 'r') as file: admin_template = file.read() -# Insert event content into admin template -announcement_content = admin_template.replace('===BEGIN===', '===BEGIN===\\n' + email_content).replace('===END===', '\\n===END===') +# Load the email content templates +event_templates = {} +for event_name in events_df['Event Name']: + with open(f'templates/{event_name.replace(" ", "_")}.md', 'r') as file: + event_templates[event_name] = file.read() + +# Function to create event reminder scripts +def create_event_script(event_name, date_str, content_file, frequency, day_of_week, date, time, location): + event_date = datetime.strptime(date_str, '%Y-%m-%d') + trigger_time = (event_date - timedelta(days=1)).strftime('%Y-%m-%dT14:00:00Z') # 9 AM ET is 14:00 UTC + + # Email content + email_content = event_templates[event_name].replace('{{DATE}}', date + '\n').replace('{{TIME}}', time + '\n').replace('{{LOCATION}}', location) + + # Insert event content into admin template + full_content = admin_template.replace('===BEGIN===', '===BEGIN===\n' + email_content).replace('===END===', '\n===END===') + + # Convert the full email content to HTML + full_content_html = markdown.markdown(full_content) + + # Write the script + script_content = f""" +import smtplib +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +import os -# Convert the entire email content to HTML -announcement_content_html = markdown.markdown(announcement_content) +sender_email = "{sender_email}" +receiver_email = "{admin_emails_str}" +cc_email = "{organizer_emails_str}" +subject = "{event_name} Reminder" -# Create email msg = MIMEMultipart() msg['From'] = sender_email -msg['To'] = ', '.join(admin_emails) -msg['Cc'] = ', '.join(organizer_emails) -msg['Subject'] = f'{event_name} Reminder' +msg['To'] = receiver_email +msg['Cc'] = cc_email +msg['Subject'] = subject -body = f\"""{{announcement_content_html}}\""" +body = \"\"\"{full_content_html}\"\"\" msg.attach(MIMEText(body, 'html')) -# Send email server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() -server.login(sender_email, os.getenv("GMAIL_PASSWORD")) +server.login(sender_email, os.getenv('GMAIL_PASSWORD')) text = msg.as_string() -server.sendmail(sender_email, admin_emails + organizer_emails, text) +server.sendmail(sender_email, receiver_email.split(', ') + cc_email.split(', '), text) server.quit() """ with open(f'scripts/send_email_{event_name.replace(" ", "_")}.py', 'w') as file: file.write(script_content) - # Create GitHub Action YAML - action_script = { - 'name': f'Reminder for {event_name}', - 'on': { - 'workflow_dispatch': {}, - 'schedule': [ - {'cron': trigger_time} - ] - }, - 'jobs': { - 'send_email': { - 'runs-on': 'ubuntu-latest', - 'steps': [ - {'name': 'Checkout repository', 'uses': 'actions/checkout@v2'}, - {'name': 'Set up Python', 'uses': 'actions/setup-python@v2', 'with': {'python-version': '3.x'}}, - {'name': 'Install dependencies', 'run': 'pip install pandas markdown'}, - {'name': 'Run email script', 'run': f'python scripts/send_email_{event_name.replace(" ", "_")}.py'} - ] - } - } - } - - with open(f'.github/workflows/reminder_{event_name.replace(" ", "_")}.yml', 'w') as file: - yaml.dump(action_script, file) - -# Process each event +# Generate scripts for each event for _, row in events_df.iterrows(): event_name = row['Event Name'] start_date = row['Start Date']