diff --git a/.gitignore b/.gitignore index 7b6caf3..e86dab7 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,5 @@ cython_debug/ # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ + +output \ No newline at end of file diff --git a/README.md b/README.md index 44c7212..0d9db31 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,134 @@ # Maily -Script to send automated emails with a google account. -1. Create an OAuth2.0 token here: [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2) -2. Store the Credentials on a file called: credentials.json -3. Create a venv: +Django Girls Colombia automated email script for workshop notifications and certificates. + +## Features + +This script supports sending 5 different types of workshop-related emails: + +1. **`certificate`** - Post-workshop certificates for attendees +2. **`accepted-participants`** - Acceptance notifications for workshop participants +3. **`waitlist-participants`** - Waitlist notifications for participants +4. **`accepted-mentors`** - Acceptance notifications for mentors/guides +5. **`waitlist-mentors`** - Waitlist notifications for mentors + +### Local Testing Mode + +The script includes a `--local` flag that generates HTML preview files instead of sending emails, perfect for testing templates and data before sending actual emails. + +## Setup + +### 1. Google API Credentials + +Create an OAuth2.0 token here: [Using OAuth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2) + +Store the credentials in a file called: `credentials.json` + +### 2. Environment Setup + +Create and activate a virtual environment: + ```bash +# Create virtual environment python3 -m venv env -``` -4. Activate the environment: -```bash -# Unix + +# Activate the environment +# Unix/macOS source env/bin/activate # Windows env\Scripts\activate ``` -5. Install the requirements: + +### 3. Install Dependencies + ```bash pip install -r requirements.txt ``` -6. Run the script: + +### 4. Prepare Data Files + +Ensure your data files are properly formatted: + +- `data/attendees.csv` - Contains columns: `email`, `name`, `certificate_url` +- `data/mentors.csv` - Contains columns: `email`, `name` + +## Usage + +### Basic Syntax + ```bash -python main.py -``` \ No newline at end of file +python main.py --type [--local] +``` + +### Message Types + +- `certificate` - Uses `data/attendees.csv` +- `accepted-participants` - Uses `data/attendees.csv` +- `waitlist-participants` - Uses `data/attendees.csv` +- `accepted-mentors` - Uses `data/mentors.csv` +- `waitlist-mentors` - Uses `data/mentors.csv` + +### Local Testing (Recommended) + +Test your templates and data before sending emails: + +```bash +# Test certificate emails +python main.py --type certificate --local + +# Test mentor acceptance emails +python main.py --type accepted-mentors --local + +# Test participant waitlist emails +python main.py --type waitlist-participants --local +``` + +HTML preview files will be generated in the `output/` directory with names like: +- `certificate_John_Doe.html` +- `accepted_mentors_Maria_Garcia.html` +- `waitlist_participants_Ana_Rodriguez.html` + +### Sending Actual Emails + +Remove the `--local` flag to send real emails: + +```bash +# Send certificate emails to all attendees +python main.py --type certificate + +# Send acceptance emails to all mentors +python main.py --type accepted-mentors +``` + +### Help + +```bash +python main.py --help +``` + +## Templates + +Templates are stored in the `templates/` directory: + +- `certificate_template.html` - Certificate email template +- `participantes_aceptados.html` - Accepted participants template +- `participantes_lista_espera.html` - Participants waitlist template +- `guias_aceptados.html` - Accepted mentors template +- `guias_lista_espera.html` - Mentors waitlist template + +Templates use variables like `{participant_name}`, `{mentor_name}`, `{workshop_date}`, `{email_header_url}`, etc., which are automatically replaced with actual data. + +## Configuration + +Workshop details and email settings are configured as constants in `main.py`: + +- Workshop date, time, and location +- Survey and photo links +- Email header image URL (`EMAIL_HEADER_URL`) +- Confirmation deadlines +- Email delay settings + +## Security Note + +Never commit `credentials.json` or `token.json` to version control. These files contain sensitive authentication information. \ No newline at end of file diff --git a/credentials.json b/credentials.json new file mode 100644 index 0000000..3cccca5 --- /dev/null +++ b/credentials.json @@ -0,0 +1,11 @@ +{ + "installed": { + "client_id": "your-client-id.apps.googleusercontent.com", + "project_id": "your-project-id", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_secret": "your-client-secret", + "redirect_uris": ["http://localhost"] + } +} \ No newline at end of file diff --git a/attendees.csv b/data/attendees.csv similarity index 100% rename from attendees.csv rename to data/attendees.csv diff --git a/data/mentors.csv b/data/mentors.csv new file mode 100644 index 0000000..d5efce0 --- /dev/null +++ b/data/mentors.csv @@ -0,0 +1,5 @@ +email,name +maria.garcia@example.com,María García +ana.rodriguez@example.com,Ana Rodríguez +laura.martinez@example.com,Laura Martínez +sofia.lopez@example.com,Sofía López \ No newline at end of file diff --git a/main.py b/main.py index f846842..21b2880 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,11 @@ import os.path import base64 import csv +import argparse from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText +from time import sleep from google.auth.transport.requests import Request from google.oauth2.credentials import Credentials from google_auth_oauthlib.flow import InstalledAppFlow @@ -12,6 +14,32 @@ # If modifying these SCOPES, delete the file token.json. SCOPES = ["https://www.googleapis.com/auth/gmail.send"] +SENDER_EMAIL = "djangogirlscolombia@gmail.com" + +# Workshop details constants +WORKSHOP_DATE = "28 de marzo de 2026" +WORKSHOP_TIME = "9:00 a.m. - 4:00 p.m." +WORKSHOP_PLACE = "Evento Virtual" +MENTOR_MEETING_DATE = "15 de julio de 2024" # Date to meet with mentors before the workshop +MENTOR_MEETING_TIME = "6:00 p.m. - 7:00 p.m." # Time for mentor meeting on the workshop day (e.g. for final instructions, Q&A, etc.) +WORKSHOP_DAY_MENTOR_MEETING_TIME = "12:00 p.m." # Time for mentor meeting on the workshop day (e.g. for final instructions, Q&A, etc.) +MENTOR_CONFIRMATION_DEADLINE = "30 de junio de 2024" # Deadline for mentors to confirm their participation before we finalize the list of accepted mentors and send out acceptance emails to participants +PARTICIPANT_CONFIRMATION_DEADLINE = "5 de julio de 2024" # Deadline for participants to confirm their participation before we finalize the list of accepted participants and send out acceptance emails to mentors +PARTICIPANT_CONFIRMATION_DATE = "10 de julio de 2024" # Date when we will send acceptance emails to participants after confirming the final list of accepted mentors +MENTOR_CONFIRMATION_DATE = "5 de julio de 2024" # Date when we will send acceptance emails to mentors after confirming the final list of accepted mentors +WORKSHOP_YEAR = "2026" # Year of the workshop, used in email templates and certificate generation + +# Email configuration constants +DEFAULT_SUBJECT = "Django Girls Colombia - Información del Taller" +IMAGE_PATH = None # No local image file available, will embed when sending emails +EMAIL_DELAY = 1 # Delay in seconds between emails + +# Template variable constants +SURVEY_LINK = "https://forms.gle/mwjZZtbEaZRabbZ4A" +PHOTOS_LINK = "https://drive.google.com/drive/folders/1g4EvKQsUqqzwVOtTNzM1M5ziGSHWzOEw?usp=sharing" +CERTIFICATE_BASE_URL = "https://drive.google.com/file/" +EMAIL_HEADER_URL = "https://i.imgur.com/866NcGI.png" + def authenticate_gmail(): creds = None @@ -77,48 +105,316 @@ def read_csv(file_name): data = [row for row in csv_reader] return data +def get_recipients(file_name): + try: + return read_csv(file_name) + except FileNotFoundError: + print(f"Error: CSV file '{file_name}' not found") + return [] + except Exception as e: + print(f"Error reading CSV file: {e}") + return [] def load_html_template(template_path, context): - with open(template_path, "r") as file: + # Read template as-is. We intentionally avoid using str.format on the + # full HTML because the file contains CSS/JS with curly braces which + # would be interpreted as format fields and cause errors. + with open(template_path, "r", encoding="utf-8") as file: template = file.read() - return template.format(**context) + # Safely replace only the placeholders that match our context keys, + # e.g. {name}, {survey_link}, etc. This avoids touching other braces + # used in CSS or HTML attributes. + for key, value in context.items(): + placeholder = "{" + key + "}" + template = template.replace(placeholder, str(value) if value is not None else "") -def main(): - # Authenticate and build the service - creds = authenticate_gmail() - service = build("gmail", "v1", credentials=creds) - file_name = "attendees.csv" - attendees_info = read_csv(file_name) + return template - # Email details - sender_email = "" - subject = "🎓 Certificado Taller Django Girls + Encuesta" +def certificate_message(service, template, local_mode=False): + file_name = "data/attendees.csv" + subject = "Django Girls Colombia - Tu Certificado del Taller" + + # Load recipients data + try: + recipients = get_recipients(file_name) + except FileNotFoundError: + print(f"Error: CSV file '{file_name}' not found") + return 0 + except Exception as e: + print(f"Error reading CSV file: {e}") + return 0 + + # Ensure output directory exists for local mode + if local_mode: + os.makedirs("output", exist_ok=True) + + sent_count = 0 # Send an email to each recipient - for attendee in attendees_info: + for attendee in recipients: receiver_email = attendee.get("email") name = attendee.get("name") certificate_url = attendee.get("certificate_url") - survey_link = "https://forms.gle/" - photos_link = "https://drive.google.com/drive/folders/?usp=sharing" - # Load HTML template - template_path = "email_template.html" # Update with your template file path + # Load HTML template with proper variable names context = { - "name": name, - "survey_link": survey_link, - "photos_link": photos_link, + "participant_name": name, # Templates use {participant_name} + "survey_link": SURVEY_LINK, + "photos_link": PHOTOS_LINK, "certificate_url": certificate_url, + "email_header_url": EMAIL_HEADER_URL, } - html_content = load_html_template(template_path, context) + html_content = load_html_template(template, context) - image_path = "picture.jpg" - message = create_message( - sender_email, receiver_email, subject, html_content, image_path - ) + if local_mode: + # Save to local HTML file for testing + safe_name = name.replace(" ", "_").replace("/", "_").replace("\\", "_") + output_file = f"output/certificate_{safe_name}.html" + with open(output_file, "w", encoding="utf-8") as f: + f.write(html_content) + print(f"Saved certificate preview: {output_file}") + else: + # Send actual email + message = create_message( + SENDER_EMAIL, receiver_email, subject, html_content, IMAGE_PATH + ) + send_email(service, "me", message) + sleep(EMAIL_DELAY) + + sent_count += 1 + + return sent_count + + +def accepted_message(service, template, message_type, local_mode=False): + # Determine data source and context based on message type + if "participants" in message_type: + file_name = "data/attendees.csv" + subject = "Django Girls Colombia - ¡Has sido aceptada!" + name_key = "participant_name" + deadline_key = "participant_confirmation_deadline" + deadline_value = PARTICIPANT_CONFIRMATION_DEADLINE + else: # mentors + file_name = "data/mentors.csv" + subject = "Django Girls Colombia - ¡Has sido aceptada como guía!" + name_key = "mentor_name" + deadline_key = "mentor_confirmation_deadline" + deadline_value = MENTOR_CONFIRMATION_DEADLINE + + # Load recipients data + try: + recipients = get_recipients(file_name) + except FileNotFoundError: + print(f"Error: CSV file '{file_name}' not found") + return 0 + except Exception as e: + print(f"Error reading CSV file: {e}") + return 0 + + # Ensure output directory exists for local mode + if local_mode: + os.makedirs("output", exist_ok=True) + + sent_count = 0 + for recipient in recipients: + receiver_email = recipient.get("email") + name = recipient.get("name") + + # Build context with proper variable names for templates + context = { + name_key: name, # participant_name or mentor_name + "workshop_date": WORKSHOP_DATE, + "workshop_time": WORKSHOP_TIME, + "workshop_place": WORKSHOP_PLACE, + "workshop_year": WORKSHOP_YEAR, + "email_header_url": EMAIL_HEADER_URL, + deadline_key: deadline_value + } + + # Add mentor-specific variables if needed + if "mentors" in message_type: + context.update({ + "mentor_meeting_date": MENTOR_MEETING_DATE, + "mentor_meeting_time": MENTOR_MEETING_TIME, + "workshop_day_mentor_meeting_time": WORKSHOP_DAY_MENTOR_MEETING_TIME + }) + + html_content = load_html_template(template, context) + + if local_mode: + # Save to local HTML file for testing + safe_name = name.replace(" ", "_").replace("/", "_").replace("\\", "_") + output_file = f"output/{message_type.replace('-', '_')}_{safe_name}.html" + with open(output_file, "w", encoding="utf-8") as f: + f.write(html_content) + print(f"Saved preview: {output_file}") + else: + # Send actual email + message = create_message( + SENDER_EMAIL, receiver_email, subject, html_content, IMAGE_PATH + ) + send_email(service, "me", message) + sleep(EMAIL_DELAY) + + sent_count += 1 + + return sent_count - send_email(service, "me", message) + +def waitlist_message(service, template, message_type, local_mode=False): + """Send waitlist notification emails""" + # Determine data source and context based on message type + if "participants" in message_type: + file_name = "data/attendees.csv" + subject = "Django Girls Colombia - Lista de Espera" + name_key = "participant_name" + confirmation_key = "participant_confirmation_date" + confirmation_value = PARTICIPANT_CONFIRMATION_DATE + else: # mentors + file_name = "data/mentors.csv" + subject = "Django Girls Colombia - Lista de Espera para Guías" + name_key = "mentor_name" + confirmation_key = "mentor_confirmation_date" + confirmation_value = MENTOR_CONFIRMATION_DATE + + # Load recipients data + try: + recipients = get_recipients(file_name) + except FileNotFoundError: + print(f"Error: CSV file '{file_name}' not found") + return 0 + except Exception as e: + print(f"Error reading CSV file: {e}") + return 0 + + # Ensure output directory exists for local mode + if local_mode: + os.makedirs("output", exist_ok=True) + + sent_count = 0 + for recipient in recipients: + receiver_email = recipient.get("email") + name = recipient.get("name") + + # Build context with proper variable names for templates + context = { + name_key: name, # participant_name or mentor_name + "workshop_date": WORKSHOP_DATE, + "workshop_time": WORKSHOP_TIME, + "workshop_place": WORKSHOP_PLACE, + "workshop_year": WORKSHOP_YEAR, + "email_header_url": EMAIL_HEADER_URL, + confirmation_key: confirmation_value + } + + # Add mentor-specific variables if needed + if "mentors" in message_type: + context.update({ + "mentor_meeting_date": MENTOR_MEETING_DATE, + "mentor_meeting_time": MENTOR_MEETING_TIME, + "workshop_day_mentor_meeting_time": WORKSHOP_DAY_MENTOR_MEETING_TIME + }) + + html_content = load_html_template(template, context) + + if local_mode: + # Save to local HTML file for testing + safe_name = name.replace(" ", "_").replace("/", "_").replace("\\", "_") + output_file = f"output/{message_type.replace('-', '_')}_{safe_name}.html" + with open(output_file, "w", encoding="utf-8") as f: + f.write(html_content) + print(f"Saved preview: {output_file}") + else: + # Send actual email + message = create_message( + SENDER_EMAIL, receiver_email, subject, html_content, IMAGE_PATH + ) + send_email(service, "me", message) + sleep(EMAIL_DELAY) + + sent_count += 1 + + return sent_count + + +def setup_argument_parser(): + """Set up command line argument parser""" + parser = argparse.ArgumentParser(description="Send automated emails via Gmail") + + parser.add_argument( + "--type", + choices=["certificate", "accepted-participants", "waitlist-participants", "accepted-mentors", "waitlist-mentors"], + required=True, + help="Type of email to send" + ) + + parser.add_argument( + "--local", + action="store_true", + help="Run the script in local mode so it can be tested without sending emails" + ) + + return parser + + +def get_default_template(msg_type): + """Get default template based on message type""" + templates = { + "certificate": "templates/certificate_template.html", + "accepted-participants": "templates/participantes_aceptados.html", + "waitlist-participants": "templates/participantes_lista_espera.html", + "accepted-mentors": "templates/guias_aceptados.html", + "waitlist-mentors": "templates/guias_lista_espera.html" + } + return templates.get(msg_type) + + +def main(): + # Parse command line arguments + parser = setup_argument_parser() + args = parser.parse_args() + + print(f"Running script with type: {args.type}") + + if args.local: + print("Running in local mode. No emails will be sent.") + print("HTML preview files will be saved to the 'output/' directory.") + else: + print("Running in email mode. Emails will be sent via Gmail.") + + # Set template + template = get_default_template(args.type) + if not template or not os.path.exists(template): + print(f"Error: Template file '{template}' not found") + return + + # Authenticate and build the service (only if not in local mode) + service = None + if not args.local: + creds = authenticate_gmail() + service = build("gmail", "v1", credentials=creds) + + # Send emails based on type + sent_msgs = 0 + try: + if args.type == "certificate": + sent_msgs = certificate_message(service, template, args.local) + elif args.type in ["accepted-participants", "accepted-mentors"]: + sent_msgs = accepted_message(service, template, args.type, args.local) + elif args.type in ["waitlist-participants", "waitlist-mentors"]: + sent_msgs = waitlist_message(service, template, args.type, args.local) + else: + print(f"Unknown message type: {args.type}") + return + except Exception as e: + print(f"Error processing messages: {e}") + return + + if args.local: + print(f"✅ Finished generating {sent_msgs} preview HTML files of type '{args.type}'") + else: + print(f"✅ Finished sending {sent_msgs} emails of type '{args.type}'") if __name__ == "__main__": diff --git a/templates/certificate_template.html b/templates/certificate_template.html new file mode 100644 index 0000000..155cf46 --- /dev/null +++ b/templates/certificate_template.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Django Girls Colombia +
+

¡Muchas gracias!

+
+

¡Hola {participant_name}!

+
+

Queremos agradecerte enormemente por compartir un día entero con nosotros, por la energía que pusiste en el taller y las ganas de aprender. ¡Nosotros lo disfrutamos mucho! Y esperamos que tú también 🤗

+ +

Además, nos gustaría recordarte algunas cosas y darte a conocer otras novedades. Hoy eres parte de Django Girls Colombia, únete a nuestras redes sociales:

+ + + +

Te animamos a que compartas tu experiencia sobre el evento con el mundo entero; puedes escribir un párrafo o artículo (tus palabras pueden motivar a muchas mujeres) y enviárnoslo a djangogirlscolombia@gmail.com para ser publicado en el Blog de Django Girls o en el Medium de Django Girls Colombia.

+ +

Como organizadores, siempre tratamos de seguir mejorando y creciendo. Es por eso que hemos preparado una pequeña encuesta donde nos puedes contar todo lo que no te gustó del evento —¡también lo positivo!— ya que da fuerzas para seguir adelante.

+ + + +

Si llegaste a completar el taller, o lo terminaste en tu casa y quieres seguir adelante, puedes leer Django Girls Tutorial: Extensions.

+ +

Comunidades donde puedes seguir participando y aprendiendo:

+ + +

¿Quieres ser embajadora en Bogotá?

+

Puedes unirte a Django Girls Colombia y ser la embajadora de Bogotá, tenemos pensado organizar muchos más talleres Django Girls en todo el país. Si estás interesada en ayudarnos/colaborar para que eso sea posible, puedes llenar en la encuesta la opción de quiero ayudar a organizar otro evento en mi ciudad. +
+ ¡No es necesario ser programador para colaborar en la gestión de nuevos eventos! +

+

+ Puedes ver todas las fotos del evento aquí: +

+ + + +

Puedes compartir las fotos en tus redes sociales usando el hashtag #DjangoGirlsColombia #DjangoGirls #PythonColombia #PyLadiesColombia.

+

A continuación te dejamos el link desde donde puedes descargar tu certificado:

+ + +

Muchas gracias,
El equipo de organizadores.

+
+

Gracias por participar en Django Girls Colombia.

+
+ +
+ + + \ No newline at end of file diff --git a/templates/guias_aceptados.html b/templates/guias_aceptados.html new file mode 100644 index 0000000..5299424 --- /dev/null +++ b/templates/guias_aceptados.html @@ -0,0 +1,267 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Django Girls +
+

¡Tu asistencia está ACEPTADA!

+
+

¡Hola {mentor_name}!

+
+

+ Te escribimos para comentarte que tu asistencia está ACEPTADA para participar en el evento "Taller de Programación para Mujeres en Bogotá" como GUÍA / COACH. ¡Muchísimas gracias! Este evento no podría ser posible sin tu ayuda. +

+
+ + + + + + + + + + + + + +
+

+ Fecha: {workshop_date} +

+
+

+ Hora: {workshop_time} +

+
+

+ Lugar: {workshop_place} +

+
+

+ Web: https://djangogirls.org/en/bogota/ +

+
+
+

+ Es importante que nos reunamos previamente por videollamada en Meet, para explicar la dinámica del evento y cuál es el objetivo de ser guía en este taller. +

+
+

+ Fecha de reunión por videollamada: {mentor_meeting_date}, a las {mentor_meeting_time}. + En el grupo de WhatsApp enviaremos el link de la llamada. +

+
+

+ Te sugerimos que leas antes de la reunión +

+
+ +
+

+ Comunicación Directa - Grupo de WhatsApp +

+
+

+ Hemos creado un grupo de WhatsApp para los guías aceptados al evento, por favor unirte al grupo siguiendo este link desde tu celular. +

+
+ + + + +
+ + Click para unirme al grupo de WhatsApp + +
+
+

+ ¡No invitar a personas diferentes a las que está destinado este email! +

+
+
    +
  • + El día del evento es importante llegar una media hora antes de comenzar el evento (a las {workshop_day_mentor_meeting_time} será la reunión presencial de guías con el equipo de organizadores) así podemos conocernos en persona y conversar previamente para coordinar cómo será la jornada completa. +
  • +
  • + Ten en cuenta que la idea de ser guía es justamente ser eso: un guía, y no "hacer nosotros los ejercicios", sino ayudarlos a que lo completen ellos solos, motivándolos a investigar y resolver sus propios problemas a conciencia. +
  • +
+
+

+ Como último favor, te pedimos que contestes este email para confirmarnos que vas a asistir antes del {mentor_confirmation_deadline}. +

+
+

+ En caso de que tengas cualquier inconveniente y no puedas asistir al taller, envíanos un email. +

+
+

+ Al finalizar el evento iremos a tomar cerveza a algún lugar, así que reserva un espacio en tu agenda del Sábado a la noche. +

+
+

+ Además, te recomendamos que nos sigas en las redes sociales para estar al tanto de las últimas novedades sobre este taller y otros eventos de programación en Python que organizamos: +

+
+ +
+

+ Muchas gracias,
+ El equipo de Organizadores. +

+
+ +
+ + + \ No newline at end of file diff --git a/templates/guias_lista_espera.html b/templates/guias_lista_espera.html new file mode 100644 index 0000000..e12ab76 --- /dev/null +++ b/templates/guias_lista_espera.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Django Girls +
+

Tu asistencia está en LISTA DE ESPERA

+
+

¡Hola {mentor_name}!

+
+

+ Te escribimos para comentarte que tu asistencia está en LISTA DE ESPERA para participar en el "Taller de programación para mujeres Django Girls en Bogotá". +

+
+ + + + + + + + + + +
+

+ Fecha: {workshop_date} +

+
+

+ Hora: {workshop_time} +

+
+

+ Web: https://djangogirls.org/en/bogota/ +

+
+
+

+ Debido a que sobrepasamos el número de inscritos disponibles para el lugar, se hizo una selección basada en los formularios de registro y has quedado en lista de espera. +

+
+

+ ¿Esto qué quiere decir? +

+
+

+ La lista de espera es para aquellas personas que quedaron seleccionadas pero que no podemos confirmar debido a la cantidad de lugares que hay en el aula. En caso de que alguno de los guías confirmados, nos informe que no pueda concurrir el día del taller, nos pondremos en contacto contigo para confirmar tu asistencia. +

+
+

+ Si aún tienes interés en participar, por favor responde a este email. +

+
+

+ Finalmente, el {mentor_confirmation_date} nos comunicaremos por email cuáles fueron las personas seleccionadas de la "Lista de Espera" que podrán participar del taller. +

+
+

+ Síguenos en redes sociales: +

+
+

+ Además, te recomendamos que nos sigas en las redes sociales para estar al tanto de las últimas novedades sobre este taller y otros eventos de programación en Python que organizamos en diferentes ciudades. +

+
+ +
+

+ Muchas gracias,
+ El equipo de organizadores. +

+
+ +
+ + + \ No newline at end of file diff --git a/templates/participantes_aceptados.html b/templates/participantes_aceptados.html new file mode 100644 index 0000000..2ba681c --- /dev/null +++ b/templates/participantes_aceptados.html @@ -0,0 +1,263 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Django Girls +
+

¡Tu asistencia está ACEPTADA!

+
+

¡Hola {participant_name}!

+
+

+ Te escribimos para comentarte que tu asistencia pasó de Lista de Espera a ACEPTADA para participar en el "Taller de programación para mujeres Django Girls en Bogotá {workshop_year}" +

+
+ + + + + + + + + + + + + +
+

+ Fecha: {workshop_date} +

+
+

+ Hora: {workshop_time} +

+
+

+ Lugar: {workshop_place} +

+
+

+ Web: https://djangogirls.org/en/bogota/ +

+
+
+

+ Recuerda que necesitas: +

+
+

+ 1. Responder este email CONFIRMANDO tu asistencia al evento lo antes posible. +

+

+ La falta de confirmación antes del {participant_confirmation_deadline} puede causar que pierdas el cupo del taller. +

+

+ En caso de que no puedas participar comunícate con nosotros vía email informando tu cancelación para brindar el cupo a otra persona interesada, ya que tenemos personas en lista de espera. +

+
+

+ 2. Llevar una notebook/laptop para trabajar con ella durante todo el día, ya que no contamos con máquinas en el lugar. +

+
+

+ 3. Llevar una extensión de corriente (si es posible). +

+
+

+ Al finalizar el evento: +

+
+

+ Iremos a comer una pizza o tomar una cerveza en algún lugar luego del evento, así que reserva un espacio en tu agenda del sábado en la noche. +

+

+ ¡Anímate a participar de este espacio! +

+
+

+ Comunicación Directa - Grupo de WhatsApp +

+
+

+ Hemos creado un grupo de WhatsApp para las participantes aceptadas al evento, por favor unirte al grupo siguiendo este link desde tu celular. +

+
+ + + + +
+ + Click para unirme al grupo de WhatsApp + +
+
+

+ ¡No invitar a personas diferentes a las que está destinado este email! +

+
+

+ ¿Te sientes con ganas de afrontar un desafío? +

+
+

+ ¡Buenísimo! Para aprovechar el tiempo del taller al máximo y empezar a sentir la adrenalina desde hoy, te proponemos que comiences instalando en tu computadora las herramientas necesarias para el día del taller. Para eso, debes leer y seguir los pasos que se encuentran en la sección "Instalación" del tutorial. No te preocupes si tienes errores o no logras instalar algunas de las herramientas mencionadas, el día del taller los guías te ayudarán con los problemas que hayas tenido. Sin embargo, es importante que lo intentes ya que llegarás con más motivación al taller y con ganas de resolver esos pequeños problemas :) +

+
+

+ Además, te recomendamos que nos sigas en las redes sociales para estar al tanto de las últimas novedades sobre este taller y otros eventos de programación en Python que organizamos en diferentes ciudades. +

+
+ +
+

+ Muchas gracias,
+ El equipo de organizadores. +

+
+ +
+ + + \ No newline at end of file diff --git a/templates/participantes_lista_espera.html b/templates/participantes_lista_espera.html new file mode 100644 index 0000000..0d44f97 --- /dev/null +++ b/templates/participantes_lista_espera.html @@ -0,0 +1,245 @@ + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Django Girls +
+

Tu asistencia está en LISTA DE ESPERA

+
+

¡Hola {participant_name}!

+
+

+ Te escribimos para comentarte que tu asistencia está en LISTA DE ESPERA para participar en el "Taller de programación para mujeres Django Girls en Bogotá". +

+
+ + + + + + + + + + +
+

+ Fecha: {workshop_date} +

+
+

+ Hora: {workshop_time} +

+
+

+ Web: https://djangogirls.org/en/bogota/ +

+
+
+

+ Debido a que sobrepasamos el número de inscritos disponibles para el lugar, se hizo una selección basada en los formularios de registro y has quedado en lista de espera. +

+
+

+ ¿Esto qué quiere decir? +

+
+

+ La lista de espera es para aquellas personas que quedaron seleccionadas pero que no podemos confirmar debido a la cantidad de lugares que hay en el aula. En caso de que alguno de los asistentes confirmados nos informe que no puede asistir el día del taller, nos pondremos en contacto contigo para confirmar tu asistencia. +

+
+

+ Si aún tienes interés en participar, por favor responde a este email. +

+
+

+ Finalmente, el {participant_confirmation_date} comunicaremos por email cuáles fueron las personas seleccionadas de la "Lista de Espera" que podrán participar del taller. +

+
+

+ Mientras tanto, puedes empezar desde casa: +

+
+

+ También te animamos a realizar el taller desde tu casa, puedes encontrarlo en el siguiente link puedes seguir las pautas que dimos en un taller pasado +

+
+ +
+

+ Además otra opción es que puedes publicar las dudas que tengas en el siguiente canal del Slack de Python Colombia (#djangogirls), allí personas de la comunidad podrán ayudarte. +

+
+

+ Recursos adicionales para aprender: +

+
+

+ Si quieres aprender a programar en Python, te recomendamos visitar la sección "Quiero aprender Python" del Proyecto Argentina en Python quien nos ha apoyado en la organización. Esta sección contiene material en Español e Inglés sobre Python desde nivel básico a avanzado. +

+
+

+ Síguenos en redes sociales: +

+
+

+ Además, te recomendamos que nos sigas en las redes sociales para estar al tanto de las últimas novedades sobre este taller y otros eventos de programación en Python que organizamos en diferentes ciudades. +

+
+ +
+

+ Muchas gracias,
+ El equipo de organizadores. +

+
+ +
+ + + \ No newline at end of file