PromoPlanerOG / app.py
ElPierrito's picture
Update app.py
82052c4 verified
import pandas as pd
from gradio_calendar import Calendar
import datetime
import plotly.express as px
import plotly.io as pio
import gradio as gr
# Benutzer und Kampagnen-Daten
users = {"PM": "Promo123"}
campaigns = []
sessions = {}
# Login-Funktion
def login(username, password):
if users.get(username) == password:
sessions["user"] = username
return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True), f"Willkommen {username}"
return gr.update(), gr.update(), gr.update(), "❌ Login fehlgeschlagen"
# Kampagnenvorschlag generieren
def suggest_campaign(product, goal, channel):
return f"""💡 Idee:
Produkt: {product}
Ziel: {goal}
Kanal: {channel}
🚀 Vorschlag:
Eine kreative {channel}-Kampagne für {product}, z. B. mit exklusiven Angeboten oder Rabattaktionen."""
# Kampagne hinzufügen
def add_campaign(name, goal, product, channel, start, end, budget, responsible):
try:
if isinstance(start, str):
start = datetime.datetime.strptime(start, "%Y-%m-%d")
if isinstance(end, str):
end = datetime.datetime.strptime(end, "%Y-%m-%d")
except Exception as e:
return pd.DataFrame(campaigns), f"❌ Ungültiges Datum: {e}"
campaigns.append({
"Name": name,
"Ziel": goal,
"Produkt": product,
"Kanal": channel,
"Start": start.strftime("%Y-%m-%d"),
"Ende": end.strftime("%Y-%m-%d"),
"Budget (CHF)": budget,
"Verantwortlich": responsible
})
df = pd.DataFrame(campaigns)
total = df["Budget (CHF)"].sum()
return df, f"💰 Gesamtbudget: CHF {total:.2f}"
# Kampagne löschen
def delete_campaign_by_name(name):
global campaigns
campaigns = [c for c in campaigns if c["Name"] != name]
df = pd.DataFrame(campaigns)
total = df["Budget (CHF)"].sum() if not df.empty else 0
names = [c["Name"] for c in campaigns]
return df, f"💰 Gesamtbudget: CHF {total:.2f}", gr.update(choices=names, value=None)
# CSV-Export
def export_csv():
df = pd.DataFrame(campaigns)
path = "kampagnen.csv"
df.to_csv(path, index=False, sep=";", encoding="utf-8-sig")
return path
# Gantt-Diagramm generieren
def generate_gantt():
if not campaigns:
return "<i>Keine Kampagnen zum Anzeigen</i>"
df = pd.DataFrame(campaigns)
df["Start"] = pd.to_datetime(df["Start"])
df["Ende"] = pd.to_datetime(df["Ende"])
try:
fig = px.timeline(df, x_start="Start", x_end="Ende", y="Name", color="Verantwortlich", title="📊 Kampagnenübersicht")
fig.update_yaxes(autorange="reversed")
fig.update_layout(height=400, margin=dict(l=20, r=20, t=30, b=20))
# Diagramm als HTML exportieren
html = pio.to_html(fig, full_html=False, include_plotlyjs='cdn')
return html
except Exception as e:
return f"<b>Fehler:</b> {e}"
# Gradio-App
with gr.Blocks() as app:
# Startseite
with gr.Column(visible=True) as start_page:
gr.Image("LA_black.png", label="", show_label=False, interactive=False)
gr.Markdown("# 👋 Willkommen beim Promo-Planer")
start_btn = gr.Button("➡️ Starten")
# Login-Seite
with gr.Column(visible=False) as login_page:
gr.Markdown("## 🔐 Login")
user = gr.Textbox(label="Benutzer")
pw = gr.Textbox(label="Passwort", type="password")
login_btn = gr.Button("Login")
login_status = gr.Textbox(interactive=False, visible=False)
# Kampagnenplaner-Seite
with gr.Column(visible=False) as planner_page:
gr.Markdown("## 📣 Kampagnenplanung")
with gr.Row():
name = gr.Textbox(label="Kampagnenname")
goal = gr.Dropdown(["Verkaufsförderung", "Werbung", "Event"], label="Ziel")
product = gr.Textbox(label="Produkt")
with gr.Row():
channel = gr.Dropdown(["Tisch", "Instagram", "E-Mail", "Plakat"], label="Kanal")
start = Calendar(type="date", label="Startdatum")
end = Calendar(type="date", label="Enddatum")
with gr.Row():
budget = gr.Number(label="Budget (CHF)")
responsible = gr.Dropdown(["Markthalle", "Marketing", "PM", "PED"], label="Verantwortlich")
suggest_btn = gr.Button("💡 KI-Vorschlag")
idea = gr.Textbox(label="Kampagnenidee")
submit_btn = gr.Button("✅ Speichern")
delete_name = gr.Dropdown(label="Kampagne zum Löschen", choices=[], interactive=True)
delete_btn = gr.Button("🗑️ Kampagne löschen")
output_table = gr.Dataframe()
budget_total = gr.Textbox(label="Budget Gesamt", interactive=False)
export_btn = gr.Button("📤 Export CSV")
csv_file = gr.File(label="📄 Herunterladen", interactive=False)
gr.Markdown("### 📈 Gantt-Visualisierung")
gantt_html = gr.HTML()
update_chart = gr.Button("🔄 Visualisierung aktualisieren")
# Seitenwechsel
def go_to_login():
return gr.update(visible=False), gr.update(visible=True)
def go_to_start():
return gr.update(visible=True), gr.update(visible=False)
# Button-Logik
start_btn.click(go_to_login, outputs=[start_page, login_page])
login_btn.click(login, [user, pw], outputs=[start_page, login_page, planner_page, login_status])
suggest_btn.click(suggest_campaign, [product, goal, channel], idea)
# Speichern + Dropdown aktualisieren
submit_btn.click(
add_campaign,
[name, goal, product, channel, start, end, budget, responsible],
[output_table, budget_total]
).then(
lambda: gr.update(choices=[c["Name"] for c in campaigns], value=None),
None,
delete_name
)
# Kampagne löschen
delete_btn.click(delete_campaign_by_name, [delete_name], [output_table, budget_total, delete_name])
# CSV Export
export_btn.click(export_csv, outputs=csv_file)
# Gantt aktualisieren
update_chart.click(generate_gantt, outputs=gantt_html)
# App starten
app.launch(share=True)