"""Datenmodell des Plugins „neuheiten“. Ein Eintrag repräsentiert ein Spiel der Neuheitenliste. Die BGG-ID ist das eindeutige Merge-Kriterium: Beim Sync werden bestehende Einträge aktualisiert, statt Duplikate anzulegen. """ from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, Integer, String, func from sqlalchemy.orm import Mapped, mapped_column from redaktionskern.db import Base STATUS_NEUHEIT = "neuheit" class Neuheit(Base): __tablename__ = "neuheiten" id: Mapped[int] = mapped_column(primary_key=True) titel: Mapped[str] = mapped_column(String(300), index=True) verlag: Mapped[str | None] = mapped_column(String(300)) autor: Mapped[str | None] = mapped_column(String(300)) # BoardGameGeek liefert nur das Erscheinungsjahr (kein genaues Datum). erscheinungsjahr: Mapped[int | None] = mapped_column(Integer) bgg_id: Mapped[int] = mapped_column(Integer, unique=True, index=True) 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()) aktualisiert_am: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), onupdate=func.now() ) def __repr__(self) -> str: # pragma: no cover - Debug-Hilfe return f""