from __future__ import annotations import os import logging import pandas as pd from flask import Flask, jsonify, request, render_template_string from unidecode import unidecode from typing import Dict, List, Optional # --- Data layer --- CSV_PATH = "equiparazioni.csv" if os.path.exists(CSV_PATH): MAP = pd.read_csv(CSV_PATH) else: MAP = pd.DataFrame([ {"col_1_dl": "Ingegneria informatica", "col_2_ls": "35/S – Ingegneria informatica", "col_3_lm": "LM-32 – Ingegneria informatica"}, {"col_1_dl": "Scienze dell’economia", "col_2_ls": "64/S – Scienze dell’economia", "col_3_lm": "LM-56 – Scienze dell’economia"}, ]) # --- Logic layer --- def _norm(txt: str | None) -> str: if txt is None or pd.isna(txt): return "" return "".join(c for c in unidecode(str(txt)).lower() if c.isalnum()) def find_triplet(title: str) -> Optional[Dict[str, str]]: key = _norm(title) if not key: return None for _, row in MAP.iterrows(): if key in {_norm(row.col_1_dl), _norm(row.col_2_ls), _norm(row.col_3_lm)}: return {k: v if pd.notna(v) else "" for k, v in row.to_dict().items()} return None def satisfies_once(candidate_title: str, required_title: str) -> bool: cand_triplet = find_triplet(candidate_title) req_triplet = find_triplet(required_title) if cand_triplet is None or req_triplet is None: return False return cand_triplet == req_triplet def satisfies(candidate_title: str, required_titles: List[str]) -> bool: if not required_titles: return True return any(satisfies_once(candidate_title, r) for r in required_titles) # --- Web layer --- app = Flask(__name__) @app.route("/titles") def all_titles(): titles = ( MAP["col_1_dl"].dropna().tolist() + MAP["col_2_ls"].dropna().tolist() + MAP["col_3_lm"].dropna().tolist() ) return jsonify(sorted(set(titles))) @app.route("/check", methods=["POST"]) def check(): data = request.get_json(force=True) candidate = data.get("candidate", "") required = data.get("required", []) approved = satisfies(candidate, required) mapping = find_triplet(candidate) or {} return jsonify({"approved": approved, "mapping": mapping}) HTML_PAGE = """