← All manuals Operator Guide for this screen IM2

Not Finished Yet — IM2 Open Items

(no screen — status list)
Technical Spec Ver 5 Updated 2026-09-06 Matches the live screen

Built-but-unfinished, switched-off or unreachable code as of 2026-09-06. One line each, with where it lives. Verified by reading the deployed modules, not the briefs.

Posting

Purchasing (app/po.py, app/notify.py)

RO intake (app/ro_watch.py, app/ro_parse.py, app/ro_fp.py)

Items (app/im2.py)

Pick screens (app/ro_pick.py)

To-do list accepted by Dave 2026-09-06

Sign-in hardening shipped 2026-09-06

im2.py: login_attempt table (email, ip, username, ok, tried_at) created on demand; _login_locked() counts failures in the last LOGIN_FAIL_WINDOW_MIN (15) minutes for that email only and blocks for LOGIN_LOCK_MIN (15) after LOGIN_FAIL_LIMIT (5). Deliberately not IP-based: all traffic arrives through one nginx proxy and one warehouse WAN IP, so an IP lock would be a self-inflicted denial of service (this was observed while testing). Real client IP is taken from X-Forwarded-For and stored for forensics. Sessions moved from URLSafeSerializer to URLSafeTimedSerializer with SESSION_MAX_AGE 14 days, enforced in current_user(); pre-change unstamped cookies are still accepted by falling back to the old serializer so nobody was signed out. Cookie now secure=True (http already 301s to https). CSRF closed 2026-09-06 by the same_origin_only middleware (see tech/login); set_pin now audits the target user. No known open security items on sign-in.

Scope trim (Dave, 2026-09-06)

The operator page is a to-do list, not a change log, so three things came off it:

Added instead: no manual line entry on a buy list. po.py exposes no add-line route — every po_buy_line row is created by POST /po/workbench/save from checked RO demand rows, so a non-inventory item, freight, or a one-off buy that is not on an RO cannot be put on a buy list or carried onto the PO it will eventually create. Needs an add-line route plus a line_type that is not sourced from demand.