Skip to content

Commit

Permalink
Update generate_event_reminders.py
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremymanning authored Jul 18, 2024
1 parent cb18fed commit d0da2c4
Showing 1 changed file with 43 additions and 83 deletions.
126 changes: 43 additions & 83 deletions generate_event_reminders.py
Original file line number Diff line number Diff line change
@@ -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']
Expand Down

0 comments on commit d0da2c4

Please sign in to comment.