Spaces:
Sleeping
Sleeping
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) | |