""" Add a Portal User from this PC — the way the first Admin is made, when nobody can sign in to the Portal yet (spec 2026-10-22 Stage 2, EEWA-32). python tools\\add_portal_user.py (asks for everything) python tools\\add_portal_user.py asha Admin "Asha R" The password is typed hidden and twice; it is never shown, logged or passed on the command line. Needs `tools\\sql\\create_tables.sql` run once (CV_PortalUser / CV_PortalSignIn) and RESULTS_DB_CONN in .env. """ # Run standalone from the project root: python tools\add_portal_user.py import sys as _sys from pathlib import Path as _Path _ROOT = _Path(__file__).resolve().parent.parent _sys.path.insert(0, str(_ROOT / "src")) _sys.path.insert(0, str(_ROOT)) for _s in (_sys.stdout, _sys.stderr): try: _s.reconfigure(encoding="utf-8", errors="replace") except Exception: pass import sys import getpass from ecw_bot import settings as cfg from web.users import Accounts, ROLES, SqlUserStore, UserError def main(argv) -> int: username = argv[0] if argv else input("Username: ").strip() role = argv[1] if len(argv) > 1 else ( input(f"Role ({' / '.join(ROLES)}) [Admin]: ").strip() or "Admin") name = argv[2] if len(argv) > 2 else input("Name shown on the Portal: ") password = getpass.getpass("Password (10+ characters, hidden): ") if getpass.getpass("Password again: ") != password: print("[USER] The two passwords are not the same — nothing added") return 2 accounts = Accounts(SqlUserStore(cfg.RESULTS_DB_CONN)) try: user = accounts.create_user(username, name, role, password) except UserError as exc: print(f"[USER] {exc} — nothing added") return 2 except Exception as exc: print(f"[USER] Could not reach the database ({type(exc).__name__}) " f"— run tools\\sql\\create_tables.sql once and check " f"RESULTS_DB_CONN in .env") return 1 print(f"[USER] {user['username']} added as {user['role']}. Sign in at " f"http://127.0.0.1:8000/signin") return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))