From 70bdd1639b553482391743a4460fa3d93ecd3333 Mon Sep 17 00:00:00 2001 From: Abdelkouddous LHACHIMI Date: Tue, 31 Mar 2026 22:50:22 +0100 Subject: [PATCH] Quality Check Fix --- config/DO_Dashboard_Config.xlsx | Bin 78753 -> 78787 bytes do_dashboard.py | 27 +++++++++++++++++++++++++++ do_dashboard_quality_checks.py | 28 ++++++++++++++++++++++++++-- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/config/DO_Dashboard_Config.xlsx b/config/DO_Dashboard_Config.xlsx index 3bded321c59251a2217382cffb75d7cad920b836..2b4b82c6267b5834f6ea06ae0cf9c00cf694c917 100644 GIT binary patch delta 24567 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 original org_name + for meta in request_metas: + org_name = meta.get("org_name") + if org_name: + unique_orgs[org_name.strip().lower()] = org_name + + mapped_count = sum(1 for norm in unique_orgs if norm in mapping_dict) + unmapped_orgs = sorted( + name for norm, name in unique_orgs.items() if norm not in mapping_dict + ) + + mapping_summary = ( + f"Organization center mapping: {mapped_count}/{len(unique_orgs)} organization(s) mapped." + ) + console.print(f"[green]{mapping_summary}[/green]") + logging.info(mapping_summary) + + if unmapped_orgs: + unmapped_header = f"{len(unmapped_orgs)} unmapped organization(s):" + console.print(f"[yellow]⚠ {unmapped_header}[/yellow]") + logging.warning(unmapped_header) + for org_name in unmapped_orgs: + console.print(f"[yellow] - {org_name}[/yellow]") + logging.warning(" - %s", org_name) + try: # === QUALITY CHECKS === print() diff --git a/do_dashboard_quality_checks.py b/do_dashboard_quality_checks.py index 4537ac1..fef6eb8 100644 --- a/do_dashboard_quality_checks.py +++ b/do_dashboard_quality_checks.py @@ -540,7 +540,20 @@ def non_regression_check(output_requests, old_requests_filename): f"Config: {rule.get('field_selection')}" ) - for group_name, field_name in sorted(candidate_fields): + # Iterate in config order (field_selection), not alphabetically + field_selection_config = rule.get("field_selection") or [] + ordered_candidates = [] + seen = set() + for _action, selector in field_selection_config: + sel_group, sel_field = selector.split(".", 1) + for (group_name, field_name) in candidate_fields: + if (group_name, field_name) in seen: + continue + if (sel_group in ("*", group_name)) and (sel_field in ("*", field_name)): + ordered_candidates.append((group_name, field_name)) + seen.add((group_name, field_name)) + + for group_name, field_name in ordered_candidates: new_val = get_nested_value(new_req, [group_name, field_name]) old_val = get_nested_value(old_req, [group_name, field_name]) if new_val is not None and old_val is not None: @@ -734,10 +747,14 @@ def non_regression_check(output_requests, old_requests_filename): for rule in rules: line_label = rule["line_label"] - if line_label in ["New Requests", "Deleted Requests"]: + if line_label == "New Requests": count = _process_special_rule(rule, line_label, new_dict, old_dict) line_results.append((line_label, count, None, "simple")) + elif line_label == "Deleted Requests": + deleted_keys = sorted(set(old_dict.keys()) - set(new_dict.keys())) + line_results.append((line_label, len(deleted_keys), deleted_keys, "deleted_requests")) + elif line_label in ["New Fields", "Deleted Fields"]: field_list = _process_new_deleted_fields(line_label, new_dict, old_dict) count = len(field_list) @@ -778,6 +795,13 @@ def non_regression_check(output_requests, old_requests_filename): new_display = f"'{new_val}'" if isinstance(new_val, str) else str(new_val) console.print(f" - {qualified_field}: {old_display} → {new_display}") + elif result_type == "deleted_requests": + _print_check_line(line_label, count, status_tuple, indent=1) + logging.warning("Regression check - %s: %d", line_label, count) + for deleted_key in data: + console.print(f" {key_field}: {deleted_key}") + logging.warning(" Deleted request: %s=%s", key_field, deleted_key) + else: _print_check_line(line_label, count, status_tuple, indent=1)