Explorer
/proc/1771556/root/tmp/aa045f3_patch_v3.py
← Zurück ↓ Download
"""AA-045-F3 Patch fuer content_briefing.py – Version 3 mit exakten Ankern."""
p = "/opt/struktur/social-media-radar/content_briefing.py"
s = open(p).read()

# 1. run()-Signatur + Auswahl
old1 = '''def run(limit: int = 500, action_filter: str = "pruefen"):
    conn = sqlite3.connect(str(DB_PATH))
    conn.row_factory = sqlite3.Row
    ensure_columns(conn)

    rows = conn.execute(
        "SELECT * FROM signals WHERE director_action = ? ORDER BY director_score DESC LIMIT ?",
        (action_filter, limit)
    ).fetchall()'''
new1 = '''def run(limit: int = 500, action_filter: str = ""):
    """AA-045-F3: Briefings fuer ALLE postbaren Signale ohne Briefing.

    Idempotent: vorhandene Briefings werden nicht ueberschrieben.
    Auswahl: status postbar, mallorca_relevance > 0, briefing_winkel leer.
    action_filter gesetzt => altes Verhalten (nur diese director_action).
    """
    conn = sqlite3.connect(str(DB_PATH))
    conn.row_factory = sqlite3.Row
    ensure_columns(conn)

    if action_filter:
        rows = conn.execute(
            "SELECT * FROM signals WHERE director_action = ? ORDER BY director_score DESC LIMIT ?",
            (action_filter, limit)
        ).fetchall()
    else:
        rows = conn.execute(
            """
            SELECT * FROM signals
            WHERE status NOT IN ('ignoriert', 'veroeffentlicht')
              AND COALESCE(mallorca_relevance, 0) > 0
              AND COALESCE(briefing_winkel, '') = ''
            ORDER BY radar_score DESC LIMIT ?
            """,
            (limit,)
        ).fetchall()'''
assert old1 in s, "anchor1"
s = s.replace(old1, new1)

# 2. Loop mit Fehlerbehandlung
old2 = '''    freigabe_dist = {}
    for sig in rows:
        result = compute_briefing(dict(sig))
        conn.execute("""
            UPDATE signals SET
              briefing_winkel     = ?,
              briefing_nutzen     = ?,
              briefing_zielgruppe = ?,
              briefing_post_typ   = ?,
              briefing_fb_fit     = ?,
              briefing_fb_reason  = ?,
              briefing_li_fit     = ?,
              briefing_li_reason  = ?,
              briefing_material   = ?,
              briefing_risiko     = ?,
              briefing_freigabe   = ?
            WHERE signal_id = ?
        """, (
            result["briefing_winkel"],
            result["briefing_nutzen"],
            result["briefing_zielgruppe"],
            result["briefing_post_typ"],
            result["briefing_fb_fit"],
            result["briefing_fb_reason"],
            result["briefing_li_fit"],
            result["briefing_li_reason"],
            result["briefing_material"],
            result["briefing_risiko"],
            result["briefing_freigabe"],
            sig["signal_id"],
        ))
        freigabe_dist[result["briefing_freigabe"]] = freigabe_dist.get(result["briefing_freigabe"], 0) + 1

        # SOL-006 REGEL-02: Briefing-Freigabe neutralisiert Director
        # Wenn Briefing zurueckstellt oder verwirft, darf Director nicht aktiv entscheiden.
        # director_action wird auf 'beobachten' gesetzt — nur wenn aktuell aktiv (pruefen/veroeffentlichen).
        if result["briefing_freigabe"] in ("zurueckstellen", "verwerfen"):
            conn.execute(
                "UPDATE signals SET director_action = 'beobachten' "
                "WHERE signal_id = ? AND director_action IN ('pruefen', 'veroeffentlichen')",
                (sig["signal_id"],)
            )

    conn.commit()'''
new2 = '''    freigabe_dist = {}
    errors = 0
    for sig in rows:
        try:
            result = compute_briefing(dict(sig))
            conn.execute("UPDATE signals SET briefing_error = '' WHERE signal_id = ?",
                         (sig["signal_id"],))
            conn.execute("""
                UPDATE signals SET
                  briefing_winkel     = ?,
                  briefing_nutzen     = ?,
                  briefing_zielgruppe = ?,
                  briefing_post_typ   = ?,
                  briefing_fb_fit     = ?,
                  briefing_fb_reason  = ?,
                  briefing_li_fit     = ?,
                  briefing_li_reason  = ?,
                  briefing_material   = ?,
                  briefing_risiko     = ?,
                  briefing_freigabe   = ?
                WHERE signal_id = ?
            """, (
                result["briefing_winkel"],
                result["briefing_nutzen"],
                result["briefing_zielgruppe"],
                result["briefing_post_typ"],
                result["briefing_fb_fit"],
                result["briefing_fb_reason"],
                result["briefing_li_fit"],
                result["briefing_li_reason"],
                result["briefing_material"],
                result["briefing_risiko"],
                result["briefing_freigabe"],
                sig["signal_id"],
            ))
            freigabe_dist[result["briefing_freigabe"]] = freigabe_dist.get(result["briefing_freigabe"], 0) + 1

            # SOL-006 REGEL-02: Briefing-Freigabe neutralisiert Director
            if result["briefing_freigabe"] in ("zurueckstellen", "verwerfen"):
                conn.execute(
                    "UPDATE signals SET director_action = 'beobachten' "
                    "WHERE signal_id = ? AND director_action IN ('pruefen', 'veroeffentlichen')",
                    (sig["signal_id"],)
                )
        except Exception as exc:
            # AA-045-F3: expliziter Fehlerstatus; Retry beim naechsten Lauf
            errors += 1
            try:
                conn.execute(
                    "UPDATE signals SET briefing_error = ? WHERE signal_id = ?",
                    (f"briefing-failed: {exc}"[:400], sig["signal_id"])
                )
            except Exception:
                pass

    conn.commit()'''
assert old2 in s, "anchor2"
s = s.replace(old2, new2)

# 3. Summary
old3 = '''    print(f"\\n[CONTENT-BRIEFING] Fertig.")'''
new3 = '''    print(f"\\n[CONTENT-BRIEFING] Fertig. fehler={errors}")'''
assert old3 in s, "anchor3"
s = s.replace(old3, new3)

open(p, "w").write(s)
print("content_briefing.py gepatcht v3")