Kaynağa Gözat

fix: cron_expr stocké "" au lieu de None pour compatibilité schéma SQLite existant

db.create_all() ne modifie pas les colonnes existantes, la contrainte NOT NULL
reste en base — stocker chaîne vide évite l'IntegrityError sur les jobs manuels.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cédric Hansen 1 ay önce
ebeveyn
işleme
de12f60340
2 değiştirilmiş dosya ile 2 ekleme ve 2 silme
  1. 1 1
      sources/blueprints/jobs.py
  2. 1 1
      sources/db.py

+ 1 - 1
sources/blueprints/jobs.py

@@ -400,7 +400,7 @@ def _save_job(job):
     job.type = job_type
     job.config_json = json.dumps(cfg)
     cron_raw = (f.get("cron_expr") or "").strip()
-    job.cron_expr = cron_raw if cron_raw else None
+    job.cron_expr = cron_raw  # "" = manuel (NOT NULL compatible avec le schéma existant)
     job.retention_mode = f.get("retention_mode", "count")
     job.retention_value = int(f.get("retention_value", 7))
     job.enabled = f.get("enabled") == "1"

+ 1 - 1
sources/db.py

@@ -46,7 +46,7 @@ class Job(db.Model):
     name = db.Column(db.Text, nullable=False)
     type = db.Column(db.Text, nullable=False)  # ynh_app|ynh_system|custom_dir|mysql|postgresql
     config_json = db.Column(db.Text)
-    cron_expr = db.Column(db.Text, nullable=True)  # None = déclenchement manuel uniquement
+    cron_expr = db.Column(db.Text, nullable=False, default="")  # "" = déclenchement manuel uniquement
     retention_mode = db.Column(db.Text, nullable=False)  # count|daily|gfs
     retention_value = db.Column(db.Integer, nullable=False)
     enabled = db.Column(db.Boolean, default=True)