Spieleinträge: quellen_url speichern + als klickbaren Quellen-Link anzeigen

This commit is contained in:
Flo Hartmann
2026-08-24 21:55:39 +00:00
parent 96d6af8163
commit fa453518d4
5 changed files with 32 additions and 4 deletions

2
.env Normal file
View File

@@ -0,0 +1,2 @@
SPIELE_SESSION_SECRET=48ebf7ddae261a931652b5a55cff708aa21cf4936a8bdeb287eeac7cec4ee3e2
SPIELE_INITIAL_ADMIN_PASSWORD=3fb93f84014ff45406b36ec3

View File

@@ -276,11 +276,29 @@ class NeuheitenPlugin(BasePlugin):
"ALTER TABLE neuheiten ADD COLUMN bild_url VARCHAR(500)"
)
def quellen_url_spalte(conn) -> None:
"""Migration 0005: Spalte quellen_url für den Link zur Quelle."""
info = conn.exec_driver_sql("PRAGMA table_info(neuheiten)").fetchall()
vorhanden = any(zeile[1] == "quellen_url" for zeile in info)
if conn.dialect.name == "sqlite" and vorhanden:
return
if conn.dialect.name != "sqlite":
existiert = conn.exec_driver_sql(
"SELECT column_name FROM information_schema.columns "
"WHERE table_name = 'neuheiten' AND column_name = 'quellen_url'"
).scalar()
if existiert is not None:
return
conn.exec_driver_sql(
"ALTER TABLE neuheiten ADD COLUMN quellen_url VARCHAR(500)"
)
return [
Migration(version="0001_neuheiten_tabelle", up=neuheiten_tabelle),
Migration(version="0002_bgg_id_nullable", up=bgg_id_nullable),
Migration(version="0003_quellen_status", up=quellen_status_tabelle),
Migration(version="0004_bild_url", up=bild_url_spalte),
Migration(version="0005_quellen_url", up=quellen_url_spalte),
]
def navigation(self) -> list[NavEntry]:

View File

@@ -33,6 +33,7 @@ class Neuheit(Base):
# URL des Coverbildes (BGG-Image/Thumbnail bzw. Bild der Web-Quelle);
# wird direkt verlinkt (Hotlinking), kein Download (Migration 0004).
bild_url: Mapped[str | None] = mapped_column(String(500))
quellen_url: Mapped[str | None] = mapped_column(String(500))
status: Mapped[str] = mapped_column(String(50), default=STATUS_NEUHEIT, index=True)
quelle: Mapped[str] = mapped_column(String(100), default="boardgamegeek")
erstellt_am: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

View File

@@ -234,6 +234,7 @@ class WebQuellenSyncService:
),
bgg_id=None,
bild_url=einzel.bild_url,
quellen_url=einzel.quellen_url,
status=STATUS_NEUHEIT,
quelle=quelle,
)
@@ -259,10 +260,12 @@ class WebQuellenSyncService:
eintrag.erscheinungsjahr = jahr_aus_datumsangabe(
treffer.erscheinungsdatum_oder_quartal
)
# Coverbild mitpflegen; fehlt es im Treffer, bleibt das
# bereits gespeicherte Bild erhalten.
# Coverbild + Quellen-URL mitpflegen; fehlen sie im Treffer,
# bleiben die bereits gespeicherten Werte erhalten.
if treffer.bild_url:
eintrag.bild_url = treffer.bild_url
if treffer.quellen_url:
eintrag.quellen_url = treffer.quellen_url
return True
return False

View File

@@ -18,7 +18,9 @@
<a href="https://boardgamegeek.com/boardgame/{{ eintrag.bgg_id }}" target="_blank" rel="noopener"
class="ml-0.5 text-[10px] text-slate-400 hover:text-emerald-700 align-super">BGG&nbsp;{{ eintrag.bgg_id }}</a>
{% elif eintrag.quelle and eintrag.quelle != 'boardgamegeek' %}
<span class="ml-0.5 text-[10px] uppercase tracking-wide text-sky-600/70 align-super">{{ eintrag.quelle }}</span>
<a href="{{ eintrag.quellen_url or '#' }}" target="_blank" rel="noopener"
title="Zur Quelle ({{ eintrag.quelle }})"
class="ml-0.5 text-[10px] uppercase tracking-wide text-sky-600/70 hover:text-sky-800 align-super">{{ eintrag.quelle }}&nbsp;</a>
{% endif %}
</h3>
<span class="ml-auto shrink-0 inline-block px-2 py-0.5 rounded-full bg-emerald-100 text-emerald-800 text-xs">{{ eintrag.status }}</span>
@@ -82,7 +84,9 @@
<a href="https://boardgamegeek.com/boardgame/{{ eintrag.bgg_id }}" target="_blank" rel="noopener"
class="ml-1 text-[10px] text-slate-400 hover:text-emerald-700 align-super">BGG&nbsp;{{ eintrag.bgg_id }}</a>
{% elif eintrag.quelle and eintrag.quelle != 'boardgamegeek' %}
<span class="ml-1 text-[10px] uppercase tracking-wide text-sky-600/70 align-super">{{ eintrag.quelle }}</span>
<a href="{{ eintrag.quellen_url or '#' }}" target="_blank" rel="noopener"
title="Zur Quelle ({{ eintrag.quelle }})"
class="ml-1 text-[10px] uppercase tracking-wide text-sky-600/70 hover:text-sky-800 align-super">{{ eintrag.quelle }}&nbsp;</a>
{% endif %}
</td>
<td class="px-4 py-3">{{ eintrag.verlag or '—' }}</td>