Spieleinträge: quellen_url speichern + als klickbaren Quellen-Link anzeigen
This commit is contained in:
2
.env
Normal file
2
.env
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
SPIELE_SESSION_SECRET=48ebf7ddae261a931652b5a55cff708aa21cf4936a8bdeb287eeac7cec4ee3e2
|
||||||
|
SPIELE_INITIAL_ADMIN_PASSWORD=3fb93f84014ff45406b36ec3
|
||||||
@@ -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]:
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 {{ eintrag.bgg_id }}</a>
|
class="ml-0.5 text-[10px] text-slate-400 hover:text-emerald-700 align-super">BGG {{ 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 }} ↗</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 {{ eintrag.bgg_id }}</a>
|
class="ml-1 text-[10px] text-slate-400 hover:text-emerald-700 align-super">BGG {{ 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 }} ↗</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>
|
||||||
|
|||||||
Reference in New Issue
Block a user