#127 added lowercasing to OperatorAuthenticationForm, but the console-host Django admin at /admin/ uses Django's own AdminAuthenticationForm, which passes the raw input to get_by_natural_key. Operator emails are stored lowercased (tenants/models.py), so a mixed-case entry is rejected with 'Please enter the correct email and password for a staff account' while the same credentials succeed at the OSDS login form on the same host. Inconsistent between two login forms one path apart. Fix: subclass AdminAuthenticationForm with the same lowercasing and set it on the admin site. Found in the #127 browser pass.
#127 added lowercasing to OperatorAuthenticationForm, but the console-host Django admin at /admin/ uses Django's own AdminAuthenticationForm, which passes the raw input to get_by_natural_key. Operator emails are stored lowercased (tenants/models.py), so a mixed-case entry is rejected with 'Please enter the correct email and password for a staff account' while the same credentials succeed at the OSDS login form on the same host. Inconsistent between two login forms one path apart. Fix: subclass AdminAuthenticationForm with the same lowercasing and set it on the admin site. Found in the #127 browser pass.