fix(vision): task_id di vision_results/vision_reference_images in CASCADE (#38.6)

Migrazione 014 (batch_alter_table, nome del vincolo esistente letto con
sa.inspect invece di indovinato) e stessi ondelete nei modelli ORM.
Cancellare un task con esecuzioni o immagini di riferimento non fallisce
più su un vincolo FK MySQL.

MANCA: i file delle immagini di riferimento su disco non vengono
rimossi alla cancellazione del task - tasks.py::delete_task (NON
TOCCARE da questo lotto) cancella con `db.delete(task)` diretto, senza
un punto unico in vision_service da agganciare. `_copy_tasks_to_version`
(recipe_service.py) non copia le immagini di riferimento nel
copy-on-write: nemmeno questo si tocca qui.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-21 22:44:55 +02:00
parent 403c923188
commit 54bc384650
3 changed files with 89 additions and 2 deletions
+9
View File
@@ -4,6 +4,7 @@ from sqlalchemy import select
from src.backend.models.orm.recipe import RecipeVersion
from src.backend.models.orm.task import TASK_TYPES, RecipeSubtask, RecipeTask
from src.backend.models.orm.vision import VisionReferenceImage, VisionResult
from src.backend.tests.conftest import create_test_recipe
@@ -69,3 +70,11 @@ def test_the_typo_is_gone():
"""`xf_compare` era un refuso: si corregge finché nessuna riga lo usa."""
assert "dxf_compare" in TASK_TYPES
assert "xf_compare" not in TASK_TYPES
@pytest.mark.parametrize("model", [VisionResult, VisionReferenceImage])
def test_task_id_cascades_when_the_task_is_deleted(model):
"""#38.6: cancellare un task con esecuzioni/immagini non deve fallire su
un vincolo FK MySQL - la riga di visione deve seguirlo."""
(fk,) = model.__table__.columns["task_id"].foreign_keys
assert fk.ondelete == "CASCADE"