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) | |