sampro69's picture
deploy backend on Gradio SDK
3f72838
Raw
History Blame Contribute Delete
3.19 kB
"""Organizer QA batch: exhaustive dedup, PII scan, quota report."""
import logging
from config import BATCH_SIMILARITY_THRESHOLD, CATEGORIES, NON_BIASED_TARGET, QUOTAS
from database import fetch_all_submissions, get_supabase
from services.duplicate_service import pairwise_duplicates
from services.pii_service import scan_pii_batch
logger = logging.getLogger(__name__)
def _submission_columns() -> str:
quoted = [f'"{category}"' if category[0].isupper() else category for category in CATEGORIES]
return "id,team_id,text," + ",".join(quoted)
def _build_quota_report(rows: list[dict]) -> dict:
report: dict = {}
team_ids = sorted({row.get("team_id") for row in rows if row.get("team_id")})
for team_id in team_ids:
team_rows = [row for row in rows if row.get("team_id") == team_id]
team_report: dict = {}
for category in CATEGORIES:
count = sum(1 for row in team_rows if int(row.get(category) or 0) == 1)
required = QUOTAS.get(category, 0)
team_report[category] = {
"count": count,
"required": required,
"met": count >= required,
}
non_biased = sum(
1
for row in team_rows
if all(int(row.get(category) or 0) == 0 for category in CATEGORIES)
)
team_report["non_biased"] = {
"count": non_biased,
"required": NON_BIASED_TARGET,
"met": non_biased >= NON_BIASED_TARGET,
}
report[team_id] = team_report
return report
def _persist_flags(dup_ids: list[str], pii_ids: list[str]) -> None:
try:
sb = get_supabase()
for chunk_ids, column in ((dup_ids, "flag_duplicate"), (pii_ids, "flag_pii")):
for start in range(0, len(chunk_ids), 200):
batch = chunk_ids[start : start + 200]
if batch:
sb.table("submissions").update({column: True}).in_("id", batch).execute()
except Exception as exc:
logger.warning("Could not persist QA flags: %s", exc)
def run_qa_batch() -> dict:
"""Run the full QA batch and return a structured report."""
rows = fetch_all_submissions(_submission_columns())
total_rows = len(rows)
flagged_duplicates = pairwise_duplicates(rows, threshold=BATCH_SIMILARITY_THRESHOLD)
flagged_pii: list[dict] = []
texts = [row.get("text") or "" for row in rows]
pii_results = scan_pii_batch(texts)
for row, result in zip(rows, pii_results):
if result["flagged"]:
flagged_pii.append({"id": row["id"], "matched_terms": result["matched_terms"]})
quota_report = _build_quota_report(rows)
dup_ids = [item["id"] for item in flagged_duplicates]
pii_ids = [item["id"] for item in flagged_pii]
_persist_flags(dup_ids, pii_ids)
logger.info(
"QA batch complete: rows=%d duplicates=%d pii=%d",
total_rows,
len(flagged_duplicates),
len(flagged_pii),
)
return {
"total_rows": total_rows,
"flagged_duplicates": flagged_duplicates,
"flagged_pii": flagged_pii,
"quota_report": quota_report,
}