|
import gradio as gr |
|
import os |
|
from sendgrid import SendGridAPIClient |
|
from sendgrid.helpers.mail import Mail |
|
import qrcode |
|
from PIL import Image |
|
import io |
|
import numpy as np |
|
import datetime |
|
|
|
|
|
SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY') |
|
HOST_EMAIL = os.getenv('HOST_EMAIL') |
|
DISCORD_LINK = os.getenv('DISCORD_LINK') |
|
|
|
|
|
submitted_emails = set() |
|
|
|
|
|
def create_email_content(name, email, question, event_date, event_time, rsvp_timestamp): |
|
base_content = f''' |
|
<p>Thank you for your RSVP, {name}. You are registered for the AI Study Group event on {event_date} from {event_time}.</p> |
|
<p>Discord link to join the group: {DISCORD_LINK}</p> |
|
<pre> |
|
{discord_instructions_markdown} |
|
|
|
FUBAR Labs - New Jersey's First Hackerspace |
|
"Where fun is learning and work is fun." |
|
|
|
Explore: [FUBAR Labs Website](https://fubarlabs.org) |
|
Support Us: [Donate Here](https://fubarlabs.org/donate) |
|
|
|
FUBAR Labs | 1510B Jersey Avenue, North Brunswick, NJ 08902 |
|
Phone: 732-50-FUBAR | Email: info@fubarlabs.org |
|
</pre> |
|
''' |
|
question_content = f"<p>Your question for the AI Study Group: {question}</p>" if question else "<p>No specific questions for this session.</p>" |
|
return base_content + question_content |
|
|
|
|
|
def send_email(to_email, subject, content): |
|
sg = SendGridAPIClient(SENDGRID_API_KEY) |
|
email = Mail(from_email=HOST_EMAIL, to_emails=to_email, subject=subject, html_content=content) |
|
sg.send(email) |
|
|
|
|
|
|
|
discord_instructions_markdown = """ |
|
### Joining the AI Study Group on Discord |
|
To join the virtual AI Study Group on Discord, please follow these steps: |
|
|
|
1. If you don't have Discord, download it from [Discord's official website](https://discord.com/) or install the app on your mobile device. |
|
2. Create a Discord account if you don't have one. |
|
3. Scan the QR code provided or click on the Discord link to join our server. |
|
4. Once in the server, introduce yourself in the introduction channel and feel free to explore different channels. |
|
5. Respect community guidelines and enjoy collaborating with fellow AI enthusiasts! |
|
""" |
|
|
|
|
|
gdpr_markdown = """ |
|
### Privacy Notice and Consent |
|
By submitting this form, you consent to the processing and storage of your personal data as outlined below: |
|
|
|
- **Purpose**: Your data is collected to verify your intention to attend the event and to prevent spam and trolling. |
|
- **Data Storage**: Your personal information is stored securely and will only be used for the purposes of event management. |
|
- **Data Access**: You have the right to access your personal data upon request. |
|
- **Data Deletion**: You can request the deletion of your personal data at any time. |
|
- **No Third Party Sharing**: Your data will not be shared with any third parties. |
|
|
|
Please check the box above to indicate your consent. |
|
""" |
|
|
|
def calculate_next_event_date(): |
|
today = datetime.date.today() |
|
first_of_month = datetime.date(today.year, today.month, 1) |
|
first_sunday = first_of_month + datetime.timedelta(days=(6-first_of_month.weekday())) |
|
if today <= first_sunday: |
|
return first_sunday |
|
else: |
|
if first_of_month.month == 12: |
|
return datetime.date(first_of_month.year + 1, 1, 1) + datetime.timedelta(days=(6-1)) |
|
else: |
|
return datetime.date(first_of_month.year, first_of_month.month + 1, 1) + datetime.timedelta(days=(6-1)) |
|
|
|
|
|
def add_rsvp(name, email, question, consent): |
|
if not consent or not email: |
|
return "**Error**: Consent and Email are required to RSVP." |
|
|
|
if email in submitted_emails: |
|
return ["**Error**: You have already submitted an RSVP.", "", ""] |
|
|
|
event_date = calculate_next_event_date().strftime("%B %d, %Y") |
|
event_time = "2:00 PM to 3:30 PM" |
|
rsvp_timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|
|
|
|
|
attendee_email_content = create_email_content(name, email, question, event_date, event_time, rsvp_timestamp) |
|
host_email_content = f''' |
|
<p>New RSVP received for the AI Study Group:</p> |
|
<p><b>Name:</b> {name}</p> |
|
<p><b>Email:</b> {email}</p> |
|
<p><b>RSVP Timestamp:</b> {rsvp_timestamp}</p> |
|
<p><b>Event Date:</b> {event_date} {event_time}</p> |
|
{attendee_email_content} |
|
''' |
|
|
|
|
|
send_email(email, f'Thank you for your RSVP on {event_date} at {event_time}', attendee_email_content) |
|
send_email(HOST_EMAIL, f'New RSVP to AI Study Group {event_date} received', host_email_content) |
|
|
|
|
|
submitted_emails.add(email) |
|
|
|
|
|
response = f"**Thank you** for your RSVP, {name}. Please [join the study group on Discord]({DISCORD_LINK})." |
|
return [response, gdpr_markdown, discord_instructions_markdown] |
|
|
|
|
|
|
|
demo = gr.Interface( |
|
fn=add_rsvp, |
|
inputs=[ |
|
gr.Textbox(label="Enter your full name"), |
|
gr.Textbox(label="Enter your email", placeholder="example@example.com", type="email"), |
|
gr.Textbox(label="What is your question for the study group?", lines=7), |
|
gr.Checkbox(label="I consent to my data being processed and stored in accordance with the privacy policy.", value=False) |
|
], |
|
outputs=[ |
|
gr.Markdown(), |
|
gr.Markdown(), |
|
gr.Markdown() |
|
], |
|
title="AI Study Group RSVP", |
|
description="Please fill in your details to RSVP for the study group.", |
|
article=gdpr_markdown + discord_instructions_markdown |
|
) |
|
|
|
|
|
demo.launch() |
|
|