Explorer
/tmp/patch_variant_template.py
← Zurück ↓ Download
from pathlib import Path
p=Path('/opt/struktur/social-media-agent/templates/publication_packages.html'); s=p.read_text()
needle='''</style>'''
styles='''.variant-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px}.variant-card{border:1px solid var(--border);border-radius:7px;padding:7px;min-width:0}.variant-card.qa-failed{border-color:rgba(239,68,68,.65)}.variant-card.qa-passed{border-color:rgba(34,197,94,.65)}.variant-card img{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:5px;display:block}.variant-label{font-size:11px;font-weight:700;margin-top:5px}.variant-status{font-size:10px;color:var(--muted);margin-top:3px}.variant-reason{font-size:10px;color:#f87171;line-height:1.3;margin-top:3px}.variant-actions{display:flex;gap:4px;flex-wrap:wrap;margin-top:5px}.variant-actions a,.variant-actions button{font-size:10px;padding:4px 5px;border:1px solid var(--border);border-radius:4px;background:transparent;color:var(--text);text-decoration:none;cursor:pointer}'''
assert s.count(needle)==1; s=s.replace(needle,styles+needle)
start=s.index('    <div class="pp-section"><div class="pp-label">Medium</div><div class="media-box">')
end=s.index('    <div class="pp-section"><div class="pp-label">Beitrag</div>',start)
block='''    <div class="pp-section"><div class="pp-label">Medium</div><div class="media-box">
      <div class="media-status {% if p.qa_status == 'failed' and not p.variants %}error{% elif p.image_status == 'present' %}present{% else %}idea{% endif %}">{% if p.variants %}{{ p.variants|length }} Bildvarianten{% elif p.image_status == 'present' %}Bild vorhanden{% elif p.image_prompt %}Bildidee vorhanden{% else %}Kein Bild{% endif %}</div>
      <div class="pp-meta">Technische QA: {% if p.qa_status == 'passed' %}technisch geprüft{% elif p.qa_status == 'failed' %}technisch abgelehnt{% else %}noch nicht geprüft{% endif %}</div>
      {% if p.human_visual_approval %}<div class="pp-meta">Menschliche Auswahl/Freigabe: {{ p.human_visual_approval }}</div>{% endif %}
      <div class="pp-meta">Manuelle KI-Bilderzeugung: Codex built-in image_gen · kein OpenAI-API-Key</div>
      {% if p.variants %}<div class="variant-grid">{% for v in p.variants %}<div class="variant-card {% if v.qa_status == 'passed' %}qa-passed{% elif v.qa_status == 'failed' %}qa-failed{% endif %}" data-variant="{{ v.variant_id }}">
        <a href="/bereit/{{ p.package_id }}/varianten/{{ v.variant_id }}/bild" target="_blank" rel="noopener"><img src="/bereit/{{ p.package_id }}/varianten/{{ v.variant_id }}/bild" alt="{{ p.alt_text }} – Variante {{ v.variant_order }}"></a>
        <div class="variant-label">Variante {{ v.variant_order }}</div>
        <div class="variant-status">QA: {% if v.qa_status == 'passed' %}bestanden{% elif v.qa_status == 'failed' %}abgelehnt{% else %}unklar{% endif %}{% if v.final_for_package %} · derzeit ausgewählt{% endif %}</div>
        {% if v.qa_failure_reasons %}<div class="variant-reason">{{ v.qa_failure_reasons[:180] }}</div>{% endif %}
        <div class="variant-actions"><a href="/bereit/{{ p.package_id }}/varianten/{{ v.variant_id }}/download">Download</a><form method="post" action="/bereit/{{ p.package_id }}/varianten/{{ v.variant_id }}/auswaehlen"><button type="submit">Als final wählen</button></form></div>
      </div>{% endfor %}</div>{% elif p.image_status == 'present' and p.image_path %}<a href="/bereit/{{ p.package_id }}/bild" target="_blank" rel="noopener"><img class="media-preview" src="/bereit/{{ p.package_id }}/bild" alt="{{ p.alt_text }}"></a>{% endif %}
      {% if p.image_error %}<div class="pp-warning">{{ p.image_error }}</div>{% endif %}
      {% if p.qa_failure_reasons and p.qa_status == 'failed' %}<div class="pp-warning">Ablehnungsgrund: {{ p.qa_failure_reasons }}</div>{% endif %}
      <div class="media-actions">{% if p.variants %}<span class="pp-meta">Carlo entscheidet die finale Variante; QA blockiert die Sichtbarkeit nicht.</span>{% elif p.image_status == 'present' %}<a href="/bereit/{{ p.package_id }}/bild/download">Bild herunterladen</a>{% endif %}</div>
      <div class="pp-meta" style="margin-top:6px">Alle erzeugten Varianten bleiben zur manuellen Auswahl erhalten.</div>
    </div></div>
'''
s=s[:start]+block+s[end:]
p.write_text(s); print('variant cockpit rendered')