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)" "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 [ return [
Migration(version="0001_neuheiten_tabelle", up=neuheiten_tabelle), Migration(version="0001_neuheiten_tabelle", up=neuheiten_tabelle),
Migration(version="0002_bgg_id_nullable", up=bgg_id_nullable), Migration(version="0002_bgg_id_nullable", up=bgg_id_nullable),
Migration(version="0003_quellen_status", up=quellen_status_tabelle), Migration(version="0003_quellen_status", up=quellen_status_tabelle),
Migration(version="0004_bild_url", up=bild_url_spalte), Migration(version="0004_bild_url", up=bild_url_spalte),
Migration(version="0005_quellen_url", up=quellen_url_spalte),
] ]
def navigation(self) -> list[NavEntry]: 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); # URL des Coverbildes (BGG-Image/Thumbnail bzw. Bild der Web-Quelle);
# wird direkt verlinkt (Hotlinking), kein Download (Migration 0004). # wird direkt verlinkt (Hotlinking), kein Download (Migration 0004).
bild_url: Mapped[str | None] = mapped_column(String(500)) 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) status: Mapped[str] = mapped_column(String(50), default=STATUS_NEUHEIT, index=True)
quelle: Mapped[str] = mapped_column(String(100), default="boardgamegeek") quelle: Mapped[str] = mapped_column(String(100), default="boardgamegeek")
erstellt_am: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) erstellt_am: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())

View File

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

View File

@@ -18,7 +18,9 @@
<a href="https://boardgamegeek.com/boardgame/{{ eintrag.bgg_id }}" target="_blank" rel="noopener" <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> 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' %} {% 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 %} {% endif %}
</h3> </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> <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" <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> 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' %} {% 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 %} {% endif %}
</td> </td>
<td class="px-4 py-3">{{ eintrag.verlag or '—' }}</td> <td class="px-4 py-3">{{ eintrag.verlag or '—' }}</td>