before claude

This commit is contained in:
Gilles Soulier
2026-01-18 06:26:17 +01:00
parent dc19315e5d
commit 740c3d7516
60 changed files with 3815 additions and 354 deletions

View File

@@ -84,6 +84,36 @@ class Product(Base):
msrp: Mapped[Optional[Decimal]] = mapped_column(
Numeric(10, 2), nullable=True, comment="Recommended price"
)
type: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Product type"
)
rating_value: Mapped[Optional[Decimal]] = mapped_column(
Numeric(3, 2), nullable=True, comment="Note moyenne"
)
rating_count: Mapped[Optional[int]] = mapped_column(
Integer, nullable=True, comment="Nombre d'evaluations"
)
amazon_choice: Mapped[Optional[bool]] = mapped_column(
Boolean, nullable=True, comment="Badge Choix d'Amazon"
)
amazon_choice_label: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Libelle Choix d'Amazon"
)
discount_text: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Texte de reduction affiche"
)
stock_text: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Texte brut du stock"
)
in_stock: Mapped[Optional[bool]] = mapped_column(
Boolean, nullable=True, comment="Disponibilite derivee"
)
model_number: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Numero du modele"
)
model_name: Mapped[Optional[str]] = mapped_column(
Text, nullable=True, comment="Nom du modele"
)
# Timestamps
first_seen_at: Mapped[datetime] = mapped_column(
@@ -331,6 +361,45 @@ class ScrapingLog(Base):
return f"<ScrapingLog(id={self.id}, url={self.url}, status={self.fetch_status}, fetched_at={self.fetched_at})>"
class ClassificationRule(Base):
"""
Regles de classification categorie/type basees sur des mots-cles.
"""
__tablename__ = "classification_rules"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
category: Mapped[Optional[str]] = mapped_column(
String(80), nullable=True, comment="Categorie cible"
)
type: Mapped[Optional[str]] = mapped_column(
String(80), nullable=True, comment="Type cible"
)
keywords: Mapped[list[str]] = mapped_column(
JSON().with_variant(JSONB, "postgresql"),
nullable=False,
default=list,
comment="Mots-cles de matching",
)
sort_order: Mapped[int] = mapped_column(
Integer, nullable=False, default=0, comment="Ordre de priorite (0=haut)"
)
is_active: Mapped[bool] = mapped_column(
Boolean, nullable=False, default=True, comment="Regle active"
)
created_at: Mapped[datetime] = mapped_column(
TIMESTAMP, nullable=False, default=utcnow, comment="Creation timestamp"
)
__table_args__ = (
Index("ix_classification_rule_order", "sort_order"),
Index("ix_classification_rule_active", "is_active"),
)
def __repr__(self) -> str:
return f"<ClassificationRule(id={self.id}, category={self.category}, type={self.type})>"
class Webhook(Base):
"""
Webhooks pour notifications externes.