115 lines
3.7 KiB
Python
115 lines
3.7 KiB
Python
"""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")
|