From 489d28c4a083e434d554f530e8bed5839b80cecf Mon Sep 17 00:00:00 2001 From: Antoine Van Elstraete Date: Wed, 11 Mar 2026 17:49:26 +0100 Subject: [PATCH] feat: add motor_vehicle_id to WorkEntry with auto-migration --- app/__init__.py | 26 ++++++++++++++++++++++++++ app/models.py | 1 + 2 files changed, 27 insertions(+) diff --git a/app/__init__.py b/app/__init__.py index b9200be..45d261b 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -2,10 +2,35 @@ from flask import Flask from flask_sqlalchemy import SQLAlchemy import tomllib import os +import sqlalchemy as sa db = SQLAlchemy() +def _migrate_db(app): + """Applique les migrations de schéma manquantes (pas d'Alembic).""" + import sqlite3 + db_path = os.path.join(app.instance_path, "worklog.db") + if not os.path.exists(db_path): + return # Nouvelle DB, create_all() s'en charge + conn = sqlite3.connect(db_path) + tables = {row[0] for row in conn.execute("SELECT name FROM sqlite_master WHERE type='table'")} + if "work_entries" not in tables: + conn.close() + return # Table pas encore créée, create_all() s'en charge + columns = {row[1] for row in conn.execute("PRAGMA table_info(work_entries)").fetchall()} + conn.close() + + with app.app_context(): + engine = db.get_engine() + if "motor_vehicle_id" not in columns: + with engine.connect() as conn: + conn.execute(sa.text( + "ALTER TABLE work_entries ADD COLUMN motor_vehicle_id VARCHAR(64)" + )) + conn.commit() + + def create_app(config_path=None): app = Flask(__name__, instance_relative_config=True) @@ -34,6 +59,7 @@ def create_app(config_path=None): app.register_blueprint(reports_bp) with app.app_context(): + _migrate_db(app) db.create_all() return app diff --git a/app/models.py b/app/models.py index e57a0f5..7d69a64 100644 --- a/app/models.py +++ b/app/models.py @@ -10,6 +10,7 @@ class WorkEntry(db.Model): id: so.Mapped[int] = so.mapped_column(primary_key=True) date: so.Mapped[date] = so.mapped_column(sa.Date, unique=True, nullable=False) journey_profile_id: so.Mapped[str | None] = so.mapped_column(sa.String(64), nullable=True) + motor_vehicle_id: so.Mapped[str | None] = so.mapped_column(sa.String(64), nullable=True) day_type: so.Mapped[str] = so.mapped_column(sa.String(16), nullable=False, default="WORK") comment: so.Mapped[str | None] = so.mapped_column(sa.Text, nullable=True) created_at: so.Mapped[datetime] = so.mapped_column(sa.DateTime, default=datetime.utcnow)