diff --git a/src/lib/helpers/recipe_manager.py b/src/lib/helpers/recipe_manager.py
index 01541ab..43db1ae 100644
--- a/src/lib/helpers/recipe_manager.py
+++ b/src/lib/helpers/recipe_manager.py
@@ -131,7 +131,7 @@ def read_steps(row, config, defaults=None, unsupported_steps=None):
"chan_sel": safe_parse(row.get("canale_di_prova_2", defaults["canale_di_prova_2"])),
"ext_flush_time": safe_parse(row.get("tempo_svuotamento_esterno_2", defaults["tempo_svuotamento_esterno"])),
"ext_blow_time": safe_parse(row.get("tempo_soffiaggio_esterno_2", defaults["tempo_soffiaggio_esterno"])),
- "pid_pressure_correction": safe_parse(row.get("pid_pressure_correction", defaults["pid_pressure_correction_2"])),
+ "pid_pressure_correction": safe_parse(row.get("pid_pressure_correction_2", defaults["pid_pressure_correction_2"])),
"pid_mod_config": safe_parse(row.get("pid_mod_config", defaults["pid_mod_config"])),
},
"vision": {
@@ -288,7 +288,66 @@ def import_recipes(config, csv_path=None, defaults=None, unsupported_steps=None,
logger.error(f"Error importing recipes: {e}")
raise
+
+FIELDNAMES = [
+ "codice_ricetta",
+ "cliente",
+ "part_number",
+ "dimensione_lotto_abilitata",
+ "dimensione_lotto",
+ "verifica_connettore_abilitata",
+ "connettore",
+ "verifica_codice_a_barre_abilitata",
+ "codice_a_barre",
+ "verifica_resistenza_connettore_abilitata",
+ "scala_resistenza",
+ "r nominale",
+ "tolleranza_resistenza_pos",
+ "tolleranza_resistenza_neg",
+ "avvitatura_abilitata",
+ "viti",
+ "prova_tenuta_abilitata",
+ "tempo_pre_riempimento",
+ "pressione_pre_riempimento",
+ "tempo_riempimento",
+ "tempo_assestamento",
+ "percentuale_minima_pressione_assestamento",
+ "percentuale_massima_pressione_assestamento",
+ "tempo_di_test",
+ "pressione_di_test_delta_minimo",
+ "pressione_di_test",
+ "pressione_di_test_delta_massimo",
+ "pid_pressure_correction",
+ "tempo_svuotamento",
+ "pressione_svuotamento",
+ "prova_tenuta_abilitata_2",
+ "tempo_pre_riempimento_2",
+ "pressione_pre_riempimento_2",
+ "tempo_riempimento_2",
+ "tempo_assestamento_2",
+ "percentuale_minima_pressione_assestamento_2",
+ "percentuale_massima_pressione_assestamento_2",
+ "tempo_di_test_2",
+ "pressione_di_test_delta_minimo_2",
+ "pressione_di_test_2",
+ "pressione_di_test_delta_massimo_2",
+ "pid_pressure_correction_2",
+ "tempo_svuotamento_2",
+ "pressione_svuotamento_2",
+ "test_visione_abilitato",
+ "ricetta_visione",
+ "stampa_etichetta_abilitata",
+ "modello_etichetta",
+ "labeltxt_1",
+ "labeltxt_2",
+ "labeltxt_3",
+ "labeltxt_4",
+ "labeltxt_5"
+]
+
+
def export_recipes(config, csv_path=None, logger=None):
+ # ... (QFileDialog logic remains the same) ...
if csv_path is None:
options = QFileDialog.Options()
options |= QFileDialog.DontUseNativeDialog
@@ -315,31 +374,29 @@ def export_recipes(config, csv_path=None, logger=None):
barcode_serial_field = config.get("recipe", {}).get("barcode_serial_field", "codice_a_barre").strip()
print_template_field = config.get("recipe", {}).get("label_template_field", "modello_etichetta").strip()
data = []
- fieldnames = set() # Use a set to avoid duplicates
# Wrap database operations in a transaction for consistency
with db.atomic():
- # Iterate over all recipes in the database
for recipe in Recipes.select():
try:
steps = recipe.get_steps_map()
- exportable = {
- # Base fields
+
+ # Create a dictionary with default values for all fields
+ exportable = {field: "" for field in FIELDNAMES}
+
+ # Populate the dictionary with recipe data
+ exportable.update({
recipe_name_field: recipe.name,
"cliente": recipe.client,
"part_number": recipe.part_number,
- }
+ })
- # Add base fields to the fieldnames
- fieldnames.update([recipe_name_field, "cliente", "part_number"])
-
- # Check and add steps conditionally
+ # Conditionally update the dictionary for each step
if "connector" in steps:
exportable.update({
"verifica_connettore_abilitata": "x",
"connettore": steps["connector"].spec["connector"]
})
- fieldnames.update(["verifica_connettore_abilitata", "connettore"])
if "resistance" in steps:
exportable.update({
@@ -349,22 +406,18 @@ def export_recipes(config, csv_path=None, logger=None):
"tolleranza_resistenza_pos": steps["resistance"].spec["tolerance_pos"],
"tolleranza_resistenza_neg": steps["resistance"].spec["tolerance_neg"],
})
- fieldnames.update(["verifica_resistenza_connettore_abilitata", "scala_resistenza", "r nominale",
- "tolleranza_resistenza_pos", "tolleranza_resistenza_neg"])
if "barcodes" in steps:
exportable.update({
barcode_enable_field: "x",
barcode_serial_field: steps["barcodes"].spec["serial"]
})
- fieldnames.update([barcode_enable_field, barcode_serial_field])
if "screws" in steps:
exportable.update({
"avvitatura_abilitata": "x",
"viti": steps["screws"].spec["quantity"]
})
- fieldnames.update(["avvitatura_abilitata", "viti"])
if "leak_1" in steps:
exportable.update({
@@ -375,8 +428,6 @@ def export_recipes(config, csv_path=None, logger=None):
"pressione_di_test": steps["leak_1"].spec["test_pressure"],
"pid_pressure_correction": steps["leak_1"].spec["pid_pressure_correction"],
})
- fieldnames.update(["prova_tenuta_abilitata", "tempo_pre_riempimento", "pressione_pre_riempimento",
- "tempo_di_test", "pressione_di_test"])
if "leak_2" in steps:
exportable.update({
@@ -387,29 +438,30 @@ def export_recipes(config, csv_path=None, logger=None):
"pressione_di_test_2": steps["leak_2"].spec["test_pressure"],
"pid_pressure_correction": steps["leak_1"].spec["pid_pressure_correction"],
})
- fieldnames.update(["prova_tenuta_abilitata_2", "tempo_pre_riempimento_2", "pressione_pre_riempimento_2",
- "tempo_di_test_2", "pressione_di_test_2"])
if "vision" in steps:
exportable.update({
"test_visione_abilitato": steps["vision"].spec.get("enabled", ""),
"ricetta_visione": steps["vision"].spec["recipe"]
})
- fieldnames.update(["test_visione_abilitato", "ricetta_visione"])
if "print" in steps:
exportable.update({
"stampa_etichetta_abilitata": "x",
- print_template_field: steps["print"].spec["template"],
+ print_template_field: steps["print"].spec.get("template", ""),
+ # Add the labeltxt fields here
+ "labeltxt_1": steps["print"].spec.get("labeltxt_1", ""),
+ "labeltxt_2": steps["print"].spec.get("labeltxt_2", ""),
+ "labeltxt_3": steps["print"].spec.get("labeltxt_3", ""),
+ "labeltxt_4": steps["print"].spec.get("labeltxt_4", ""),
+ "labeltxt_5": steps["print"].spec.get("labeltxt_5", ""),
})
- fieldnames.update(["stampa_etichetta_abilitata", print_template_field])
# Append the exportable row to the data
data.append(exportable)
except Exception as e:
if logger:
logger.error(f"Error processing recipe {recipe.name}: {e}")
- # Continue with next recipe instead of failing the entire export
continue
except Exception as e:
if logger:
@@ -420,8 +472,8 @@ def export_recipes(config, csv_path=None, logger=None):
if len(data):
if logger:
logger.info(f"Exporting recipes to {csv_path}")
- with open(csv_path, "w", newline="") as f:
- writer = csv.DictWriter(f, fieldnames=list(fieldnames))
+ with open(csv_path, "w", newline="", encoding="utf-8") as f:
+ writer = csv.DictWriter(f, fieldnames=FIELDNAMES)
writer.writeheader()
writer.writerows(data)
if logger:
diff --git a/src/ui/main_window/main_window.ui b/src/ui/main_window/main_window.ui
index b8257fc..c921f56 100644
--- a/src/ui/main_window/main_window.ui
+++ b/src/ui/main_window/main_window.ui
@@ -173,7 +173,7 @@
- Esportazione ricette
+ Backup ricette
diff --git a/src/ui/test_leak/test_leak.ui b/src/ui/test_leak/test_leak.ui
index 78a4358..a91c64a 100644
--- a/src/ui/test_leak/test_leak.ui
+++ b/src/ui/test_leak/test_leak.ui
@@ -184,15 +184,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -330,15 +321,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -476,21 +458,13 @@
-
-
-
- 0
- 0
- 0
-
-
-
20
+ 75
true
@@ -654,15 +628,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -800,15 +765,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -946,21 +902,13 @@
-
-
-
- 0
- 0
- 0
-
-
-
20
+ 75
true
@@ -1130,15 +1078,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -1276,15 +1215,6 @@
-
-
-
- 0
- 0
- 0
-
-
-
@@ -1422,21 +1352,13 @@
-
-
-
- 0
- 0
- 0
-
-
-
20
+ 75
true
@@ -1468,6 +1390,7 @@
12
+ 75
true
@@ -1487,6 +1410,7 @@
12
+ 75
true
@@ -1534,6 +1458,7 @@
12
+ 75
true
@@ -1546,6 +1471,7 @@
16
+ 50
false
@@ -1559,6 +1485,7 @@
16
+ 50
false
@@ -1575,6 +1502,7 @@
20
+ 50
false
@@ -1599,6 +1527,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1623,6 +1552,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1641,6 +1571,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1659,6 +1590,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1672,6 +1604,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1688,6 +1621,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1701,6 +1635,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1714,6 +1649,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1730,6 +1666,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1752,6 +1689,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1776,6 +1714,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1800,6 +1739,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1818,6 +1758,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1837,6 +1778,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1872,6 +1814,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1885,6 +1828,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1901,6 +1845,7 @@ border: 1px solid black;
16
+ 50
false
@@ -1923,6 +1868,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1947,6 +1893,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1965,6 +1912,7 @@ border: 1px solid black;
20
+ 50
false
@@ -1983,6 +1931,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2017,6 +1966,7 @@ border: 1px solid black;
48
+ 50
false
@@ -2038,6 +1988,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2054,6 +2005,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2083,6 +2035,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2096,6 +2049,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2109,6 +2063,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2131,6 +2086,7 @@ border: 1px solid black;
20
+ 50
false
@@ -2149,6 +2105,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2171,6 +2128,7 @@ border: 1px solid black;
20
+ 50
false
@@ -2189,6 +2147,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2205,6 +2164,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2218,6 +2178,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2242,6 +2203,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2258,6 +2220,7 @@ border: 1px solid black;
16
+ 50
false
@@ -2271,37 +2234,7 @@ border: 1px solid black;
16
- false
-
-
-
- background-color: rgb(255, 255, 255);
-border: 1px solid black;
-
-
-
- -
-
-
-
- -
-
-
-
- 16
- false
-
-
-
- Valore PID
-
-
-
- -
-
-
-
- 16
+ 50
false