Spaces:
Paused
Paused
| # -*- coding: utf-8 -*- | |
| """ | |
| Utilitaires de conformite RGPD / GDPR compliance utilities (Space edition). | |
| """ | |
| import re | |
| import json | |
| from datetime import datetime | |
| import config | |
| _EMAIL_RE = re.compile(r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}") | |
| _PHONE_RE = re.compile(r"(\+?\d[\d\s().-]{7,}\d)") | |
| def anonymize(text: str) -> str: | |
| if not text: | |
| return text | |
| text = _EMAIL_RE.sub("[email masque]", text) | |
| text = _PHONE_RE.sub("[telephone masque]", text) | |
| return text | |
| def safe_for_processing(text: str) -> str: | |
| return anonymize(text) if config.ANONYMIZE_INPUT else text | |
| def log_interaction(question, answer, sources): | |
| if not config.ENABLE_LOGGING: | |
| return | |
| entry = { | |
| "ts": datetime.utcnow().isoformat(), | |
| "question": anonymize(question), | |
| "answer": anonymize(answer), | |
| "sources": [s.get("url") for s in sources], | |
| } | |
| log_file = config.LOG_DIR / f"log_{datetime.utcnow():%Y%m%d}.jsonl" | |
| with open(log_file, "a", encoding="utf-8") as f: | |
| f.write(json.dumps(entry, ensure_ascii=False) + "\n") | |
| def purge_all_logs(): | |
| n = 0 | |
| for f in config.LOG_DIR.glob("log_*.jsonl"): | |
| f.unlink() | |
| n += 1 | |
| return n | |
| NOTICE_FR = ( | |
| "**Confidentialite (RGPD).** Assistant reserve repondant a partir du " | |
| "contenu du site Vizyon Ayiti 360, y compris des documents internes selon " | |
| "vos droits. Vos questions et documents sont traites pour generer la " | |
| "reponse et ne sont pas conserves. Ne partagez ces reponses qu'avec les " | |
| "personnes autorisees." | |
| ) | |
| NOTICE_EN = ( | |
| "**Privacy (GDPR).** Restricted assistant answering from Vizyon Ayiti 360 " | |
| "website content, including internal documents according to your rights. " | |
| "Your questions and documents are processed to generate the answer and are " | |
| "not stored. Share these answers only with authorized people." | |
| ) | |
| NOTICE_HT = ( | |
| "**Konfidansyalite (RGPD).** Asistan rezeve k ap reponn ak kontni sit " | |
| "Vizyon Ayiti 360, ki gen ladan dokiman enten selon dwa ou. Kesyon ak " | |
| "dokiman ou yo trete pou bay repons lan epi yo pa konseve. Pataje repons " | |
| "sa yo selman ak moun ki otorize." | |
| ) | |
| def notice(lang="fr"): | |
| return {"en": NOTICE_EN, "ht": NOTICE_HT}.get(lang, NOTICE_FR) | |