"""Ajout classification rules et type produit Revision ID: 20260117_03_classification_rules Revises: 3e68b0f0c9e4 Create Date: 2026-01-17 20:05:00.000000 """ from datetime import datetime, timezone from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # Revision identifiers, used by Alembic. revision = "20260117_03_classification_rules" down_revision = "3e68b0f0c9e4" branch_labels = None depends_on = None def upgrade() -> None: op.add_column( "products", sa.Column("type", sa.Text(), nullable=True, comment="Product type"), ) op.create_table( "classification_rules", sa.Column("id", sa.Integer(), primary_key=True, autoincrement=True), sa.Column("category", sa.String(length=80), nullable=True, comment="Categorie cible"), sa.Column("type", sa.String(length=80), nullable=True, comment="Type cible"), sa.Column( "keywords", postgresql.JSONB(astext_type=sa.Text()), nullable=False, comment="Mots-cles de matching", ), sa.Column("sort_order", sa.Integer(), nullable=False, server_default="0"), sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")), sa.Column( "created_at", sa.TIMESTAMP(), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP"), comment="Creation timestamp", ), ) op.create_index("ix_classification_rule_order", "classification_rules", ["sort_order"]) op.create_index("ix_classification_rule_active", "classification_rules", ["is_active"]) rules_table = sa.table( "classification_rules", sa.column("category", sa.String), sa.column("type", sa.String), sa.column("keywords", postgresql.JSONB), sa.column("sort_order", sa.Integer), sa.column("is_active", sa.Boolean), sa.column("created_at", sa.TIMESTAMP), ) now = datetime.now(timezone.utc) op.bulk_insert( rules_table, [ { "category": "Informatique", "type": "Ecran", "keywords": ["ecran", "moniteur", "display"], "sort_order": 0, "is_active": True, "created_at": now, }, { "category": "Informatique", "type": "PC portable", "keywords": ["pc portable", "ordinateur portable", "laptop", "notebook"], "sort_order": 1, "is_active": True, "created_at": now, }, { "category": "Informatique", "type": "Unite centrale", "keywords": ["unite centrale", "tour", "desktop", "pc fixe"], "sort_order": 2, "is_active": True, "created_at": now, }, { "category": "Informatique", "type": "Clavier", "keywords": ["clavier", "keyboard"], "sort_order": 3, "is_active": True, "created_at": now, }, { "category": "Informatique", "type": "Souris", "keywords": ["souris", "mouse"], "sort_order": 4, "is_active": True, "created_at": now, }, ], ) def downgrade() -> None: op.drop_index("ix_classification_rule_active", table_name="classification_rules") op.drop_index("ix_classification_rule_order", table_name="classification_rules") op.drop_table("classification_rules") op.drop_column("products", "type")