""" Advance an oTree participant through all remaining pages. """ import re import sys import requests START_URL = "http://localhost:8000/p/g4qy7hsr/welfare_study/Application/29" MAX_PAGES = 200 Q_HIDDEN = re.compile(r']+type=["\']hidden["\'][^>]*>', re.IGNORECASE) Q_NAME = re.compile(r'name=["\']([^"\']+)["\']') Q_VALUE = re.compile(r'value=["\']([^"\']*)["\']') Q_INPUT = re.compile(r']+>', re.IGNORECASE) Q_TYPE = re.compile(r'type=["\']([^"\']+)["\']') Q_SELECT = re.compile(r']+name=["\']([^"\']+)["\']', re.IGNORECASE) Q_TEXTAREA = re.compile(r']+name=["\']([^"\']+)["\']', re.IGNORECASE) def extract_hidden(html): fields = {} for match in Q_HIDDEN.finditer(html): tag = match.group(0) nm = Q_NAME.search(tag) vm = Q_VALUE.search(tag) if nm: fields[nm.group(1)] = vm.group(1) if vm else "" return fields def extract_visible(html): fields = {} for match in Q_INPUT.finditer(html): tag = match.group(0) if "hidden" in tag.lower(): continue nm = Q_NAME.search(tag) tm = Q_TYPE.search(tag) if nm: fields[nm.group(1)] = tm.group(1).lower() if tm else "text" for match in Q_SELECT.finditer(html): fields[match.group(1)] = "select" for match in Q_TEXTAREA.finditer(html): fields[match.group(1)] = "textarea" return fields def default_val(ft): return {"number": "1", "text": "test", "textarea": "test", "radio": "1", "select": "1", "checkbox": "on", "range": "50"}.get(ft, "1") def page_name(url): parts = url.rstrip("/").split("/") if len(parts) >= 2: return parts[-2] if parts[-1].isdigit() else parts[-1] return url def main(): s = requests.Session() url = START_URL count = 0 print(f"Starting at: {url}") print("=" * 70) while count < MAX_PAGES: count += 1 try: resp = s.get(url, allow_redirects=True) except requests.ConnectionError as e: print(f"ERROR: Cannot connect: {e}") sys.exit(1) cur = resp.url name = page_name(cur) print(f"\n[{count}] {name} | {cur} | {resp.status_code}") if "Redirect" in cur or "OutOfRangeNotification" in cur: print(f"\n{'=' * 70}\nDONE after {count} pages. Final: {cur}") return if resp.status_code == 404: print("404 - stopping.") sys.exit(1) html = resp.text if "otree-wait-page" in html or "wait-page-body" in html: print("Wait page - stopping.") sys.exit(1) hidden = extract_hidden(html) csrf = hidden.get("csrfmiddlewaretoken", "") if not csrf and "]*>([^<]+)', pr.text) for e in errs[:5]: print(f" {e.strip()}") url = nxt print(f" -> {nxt}") print(f"Safety limit ({MAX_PAGES}) reached.") sys.exit(1) if __name__ == "__main__": main()