from bs4 import BeautifulSoup from loguru import logger from client.session import GemmaSession def get_detail(session: GemmaSession, product_id: str) -> dict: """Recupera tutti i campi del form di dettaglio prodotto.""" params = { "id": product_id, "isUpdateModality": "true", "isReadonly": "false", "GSVfromICR": "false", } r = session.get("/GSV/mvc/icrTitoli/dettaglioTitolo", params=params) fields = _parse_form_fields(r.text) if not fields: raise ValueError(f"Nessun campo trovato per id={product_id} — sessione scaduta?") logger.info(f"Caricato dettaglio id={product_id} ({len(fields)} campi)") return fields def _parse_form_fields(html: str) -> dict: """Estrae tutti i campi input/select/textarea dal HTML del form.""" soup = BeautifulSoup(html, "html.parser") fields = {} for inp in soup.find_all("input"): name = inp.get("name") if name: fields[name] = inp.get("value", "") for sel in soup.find_all("select"): name = sel.get("name") if name: opt = sel.select_one("option[selected]") fields[name] = opt.get("value", "") if opt else "" for ta in soup.find_all("textarea"): name = ta.get("name") if name: fields[name] = ta.get_text() return fields def save_detail(session: GemmaSession, form_data: dict) -> None: """Salva il prodotto inviando tutti i campi del form.""" r = session.post("/GSV/mvc/icrTitoli/aggiornaTitolo", data=form_data) if r.status_code != 200: raise Exception(f"HTTP {r.status_code}") logger.info(f"Salvato id={form_data.get('id')}")