reunion / app.py
zero1337's picture
app.py
dd40501 verified
Raw History Blame Contribute Delete
8.14 kB
import gradio as gr
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
from datetime import datetime, timedelta
import base64
import os
import shutil
# Simulated data
family_members = ["Alice", "Bob", "Charlie", "Diana", "Eve"]
locations = ["Beach House", "Mountain Cabin", "City Hotel", "Countryside Villa"]
activities = ["Hiking", "Board Games", "Cooking Class", "Sightseeing"]
chats = []
votes = {loc: 0 for loc in locations}
activity_signups = {act: [] for act in activities}
pooled_money = 0
expenses = []
itinerary = []
photos = []
# Create a directory to store uploaded photos
if not os.path.exists("uploaded_photos"):
os.makedirs("uploaded_photos")
def login(username, password):
if username in family_members and password == "password":
return username
return None
def send_invite(member):
return f"Invitation sent to {member}!"
def vote_location(username, location):
votes[location] += 1
df = pd.DataFrame(list(votes.items()), columns=['Location', 'Votes'])
fig = px.bar(df, x='Location', y='Votes', title='Location Votes')
return f"Vote recorded for {location} by {username}.", fig
def sign_up_activity(username, activity):
if username not in activity_signups[activity]:
activity_signups[activity].append(username)
df = pd.DataFrame([(act, len(signups)) for act, signups in activity_signups.items()],
columns=['Activity', 'Signups'])
fig = px.bar(df, x='Activity', y='Signups', title='Activity Signups')
return f"{username} signed up for {activity}.", fig
def add_chat_message(username, message):
chats.append(f"{username}: {message}")
return "\n".join(chats)
def pool_money(username, amount):
global pooled_money
pooled_money += amount
df = pd.DataFrame([('Pooled', pooled_money), ('Target', 1000)], columns=['Type', 'Amount'])
fig = px.pie(df, values='Amount', names='Type', title='Money Pool Progress')
return f"${amount} added to the pool by {username}. Total pooled: ${pooled_money}", fig
def add_expense(username, description, amount):
expenses.append({"user": username, "description": description, "amount": amount})
df = pd.DataFrame(expenses)
fig = px.bar(df, x='description', y='amount', color='user', title='Expenses Breakdown')
return "Expense added successfully", fig
def add_itinerary_item(date, time, activity):
try:
# Attempt to parse the date and time
datetime.strptime(date, "%Y-%m-%d")
datetime.strptime(time, "%H:%M")
except ValueError:
return "Invalid date or time format. Please use YYYY-MM-DD for date and HH:MM for time.", None
itinerary.append({"date": date, "time": time, "activity": activity})
itinerary.sort(key=lambda x: (x['date'], x['time']))
df = pd.DataFrame(itinerary)
fig = go.Figure(data=[go.Table(
header=dict(values=['Date', 'Time', 'Activity']),
cells=dict(values=[df.date, df.time, df.activity])
)])
fig.update_layout(title='Itinerary')
return "Itinerary item added successfully", fig
def upload_photo(username, photo):
if photo is not None:
# Generate a unique filename
filename = f"{username}_{datetime.now().strftime('%Y%m%d_%H%M%S')}{os.path.splitext(photo.name)[1]}"
file_path = os.path.join("uploaded_photos", filename)
# Copy the uploaded file to our directory
shutil.copy(photo.name, file_path)
# Add the file path to our photos list
photos.append({"user": username, "photo": file_path})
# Return all photo paths for the gallery
photo_paths = [p["photo"] for p in photos]
return f"Photo uploaded by {username}", gr.Gallery(value=photo_paths)
return "No photo uploaded", None
with gr.Blocks() as demo:
gr.Markdown("# Family Reunion Planner")
username = gr.State(None)
with gr.Row():
login_username = gr.Textbox(label="Username")
login_password = gr.Textbox(label="Password", type="password")
login_button = gr.Button("Login")
with gr.Column(visible=False) as main_interface:
gr.Markdown("## Welcome to the Family Reunion Planner!")
with gr.Tab("Invitations"):
member_dropdown = gr.Dropdown(choices=family_members, label="Select Family Member")
invite_button = gr.Button("Send Invite")
invite_output = gr.Textbox(label="Invitation Status")
with gr.Tab("Location Voting"):
location_dropdown = gr.Dropdown(choices=locations, label="Select Location")
vote_button = gr.Button("Vote")
vote_output = gr.Textbox(label="Voting Results")
vote_chart = gr.Plot(label="Voting Chart")
with gr.Tab("Activity Signup"):
activity_dropdown = gr.Dropdown(choices=activities, label="Select Activity")
signup_button = gr.Button("Sign Up")
signup_output = gr.Textbox(label="Signup Status")
signup_chart = gr.Plot(label="Signup Chart")
with gr.Tab("Chat Forum"):
chat_input = gr.Textbox(label="Type your message")
chat_button = gr.Button("Send")
chat_output = gr.Textbox(label="Chat History")
with gr.Tab("Money Pool"):
money_input = gr.Number(label="Amount to Add ($)")
pool_button = gr.Button("Add to Pool")
pool_output = gr.Textbox(label="Pool Status")
pool_chart = gr.Plot(label="Pool Progress")
with gr.Tab("Expense Tracking"):
expense_description = gr.Textbox(label="Expense Description")
expense_amount = gr.Number(label="Expense Amount ($)")
expense_button = gr.Button("Add Expense")
expense_output = gr.Textbox(label="Expense Status")
expense_chart = gr.Plot(label="Expenses Chart")
with gr.Tab("Itinerary Planning"):
itinerary_date = gr.Textbox(label="Date (YYYY-MM-DD)")
itinerary_time = gr.Textbox(label="Time (HH:MM)")
itinerary_activity = gr.Textbox(label="Activity Description")
itinerary_button = gr.Button("Add to Itinerary")
itinerary_output = gr.Textbox(label="Itinerary Status")
itinerary_chart = gr.Plot(label="Itinerary")
with gr.Tab("Photo Sharing"):
photo_upload = gr.File(label="Upload Photo")
photo_button = gr.Button("Share Photo")
photo_output = gr.Textbox(label="Upload Status")
photo_gallery = gr.Gallery(label="Shared Photos")
def on_login(login_username, login_password):
user = login(login_username, login_password)
if user:
# When logging in, update the gallery with all existing photos
photo_paths = [p["photo"] for p in photos]
return gr.update(visible=True), user, gr.Gallery(value=photo_paths)
else:
return gr.update(visible=False), None, None
login_button.click(
on_login,
inputs=[login_username, login_password],
outputs=[main_interface, username, photo_gallery]
)
invite_button.click(send_invite, inputs=member_dropdown, outputs=invite_output)
vote_button.click(vote_location, inputs=[username, location_dropdown], outputs=[vote_output, vote_chart])
signup_button.click(sign_up_activity, inputs=[username, activity_dropdown], outputs=[signup_output, signup_chart])
chat_button.click(add_chat_message, inputs=[username, chat_input], outputs=chat_output)
pool_button.click(pool_money, inputs=[username, money_input], outputs=[pool_output, pool_chart])
expense_button.click(add_expense, inputs=[username, expense_description, expense_amount], outputs=[expense_output, expense_chart])
itinerary_button.click(add_itinerary_item, inputs=[itinerary_date, itinerary_time, itinerary_activity], outputs=[itinerary_output, itinerary_chart])
photo_button.click(upload_photo, inputs=[username, photo_upload], outputs=[photo_output, photo_gallery])
demo.launch()