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