feat(ui): add publish readiness indicators and WP env key aliases
This commit is contained in:
parent
592d699166
commit
fee5e76842
4 changed files with 40 additions and 5 deletions
|
|
@ -156,6 +156,19 @@ def _build_image_entries(article: dict, extraction: dict, meta: dict) -> list[di
|
|||
return entries
|
||||
|
||||
|
||||
def _publish_readiness(article: dict, meta: dict) -> tuple[bool, list[str]]:
|
||||
reasons: list[str] = []
|
||||
if article.get("status") not in {"approved", "published"}:
|
||||
reasons.append("Status ist nicht 'approved'")
|
||||
if int(article.get("legal_checked", 0)) != 1:
|
||||
reasons.append("Rechtsfreigabe fehlt")
|
||||
image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {}
|
||||
selected_image = image_review.get("selected_url") if isinstance(image_review.get("selected_url"), str) else None
|
||||
if not selected_image:
|
||||
reasons.append("Hauptbild nicht ausgewählt")
|
||||
return len(reasons) == 0, reasons
|
||||
|
||||
|
||||
def _legal_checklist(article: dict, feed: dict | None) -> list[dict[str, str]]:
|
||||
meta = article.get("meta", {})
|
||||
extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {}
|
||||
|
|
@ -287,6 +300,9 @@ def admin_dashboard(request: Request):
|
|||
extraction = meta.get("extraction") if isinstance(meta.get("extraction"), dict) else {}
|
||||
images = _read_article_images(article, extraction)
|
||||
article["meta"] = meta
|
||||
ready, reasons = _publish_readiness(article, meta)
|
||||
article["publish_ready"] = ready
|
||||
article["publish_blockers"] = reasons
|
||||
article["extracted_images"] = images
|
||||
article["image_entries"] = _build_image_entries(article, extraction, meta)
|
||||
image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {}
|
||||
|
|
@ -339,6 +355,9 @@ def admin_article_detail(request: Request, article_id: int):
|
|||
if not article.get("press_contact") and isinstance(extraction.get("press_contact"), str):
|
||||
article["press_contact"] = extraction.get("press_contact")
|
||||
article["extraction"] = extraction
|
||||
publish_ready, publish_blockers = _publish_readiness(article, meta)
|
||||
article["publish_ready"] = publish_ready
|
||||
article["publish_blockers"] = publish_blockers
|
||||
article["image_selection"] = extraction.get("image_selection") if isinstance(extraction.get("image_selection"), dict) else {}
|
||||
article["image_entries"] = _build_image_entries(article, extraction, meta)
|
||||
image_review = meta.get("image_review") if isinstance(meta.get("image_review"), dict) else {}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ from functools import lru_cache
|
|||
from pathlib import Path
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from pydantic import AliasChoices, Field
|
||||
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
|
||||
|
||||
|
|
@ -25,9 +26,9 @@ class Settings(BaseSettings):
|
|||
|
||||
app_db_path: str = "backend/data/rss_news.db"
|
||||
|
||||
wordpress_base_url: str | None = None
|
||||
wordpress_username: str | None = None
|
||||
wordpress_app_password: str | None = None
|
||||
wordpress_base_url: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_BASE_URL", "WP_BASE_URL"))
|
||||
wordpress_username: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_USERNAME", "WP_USERNAME"))
|
||||
wordpress_app_password: str | None = Field(default=None, validation_alias=AliasChoices("WORDPRESS_APP_PASSWORD", "WP_PASSWORD"))
|
||||
wordpress_default_status: str = "draft"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -203,10 +203,21 @@
|
|||
|
||||
<section class="card">
|
||||
<h2>WordPress Publish Queue</h2>
|
||||
<p class="subtle">Voraussetzungen: Status `approved`, Rechtsfreigabe aktiv, Hauptbild gesetzt.</p>
|
||||
{% if article.publish_ready %}
|
||||
<p><span class="badge ok">Publish bereit</span></p>
|
||||
{% else %}
|
||||
<p><span class="badge bad">Publish blockiert</span></p>
|
||||
{% if article.publish_blockers %}
|
||||
<ul>
|
||||
{% for reason in article.publish_blockers %}
|
||||
<li class="subtle">{{ reason }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<form method="post" action="/admin/articles/{{ article.id }}/publish-enqueue" class="row">
|
||||
<input name="max_attempts" value="3" />
|
||||
<button type="submit">In Queue einreihen</button>
|
||||
<button type="submit" {% if not article.publish_ready %}disabled{% endif %}>In Queue einreihen</button>
|
||||
</form>
|
||||
</section>
|
||||
</main>
|
||||
|
|
|
|||
|
|
@ -163,6 +163,10 @@
|
|||
<td><span class="badge">{{ a.status }}</span></td>
|
||||
<td>
|
||||
<div class="subtle">Legal: {{ "OK" if a.legal_checked else "offen" }}</div>
|
||||
<div class="subtle">Publish: {{ "bereit" if a.publish_ready else "blockiert" }}</div>
|
||||
{% if not a.publish_ready and a.publish_blockers %}
|
||||
<div class="subtle">{{ a.publish_blockers|join(", ") }}</div>
|
||||
{% endif %}
|
||||
{% if a.selected_image_url %}
|
||||
<div class="subtle">Hauptbild gesetzt</div>
|
||||
<a href="{{ a.selected_image_url }}" target="_blank" rel="noopener"><img src="{{ a.selected_image_proxy_url }}" data-fallback-src="{{ a.selected_image_url }}" alt="Hauptbild" class="thumb" loading="lazy" onerror="if(!this.dataset.fallbackUsed){this.dataset.fallbackUsed='1';this.src=this.dataset.fallbackSrc;}else{this.classList.add('img-failed');}" /></a>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue